aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/NvGpuEngine2d.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2018-11-28 21:09:44 -0200
committerGitHub <noreply@github.com>2018-11-28 21:09:44 -0200
commit59964f667c38d9d0550a3b5ef3970433493f4991 (patch)
tree92f5545ee7f8ef0fa216f7d87f94963f6530a1a7 /Ryujinx.Graphics/NvGpuEngine2d.cs
parent00579927e43bf55ee06ae02933c1e755fb4120eb (diff)
Add support for bigger UBOs, fix sRGB regression, small improvement t… (#503)
* Add support for bigger UBOs, fix sRGB regression, small improvement to the 2D copy engine * Break into multiple lines * Read fractions for source/step values on the 2d copy engine aswell * Use fixed point math for more speed * Fix reinterpret when texture sizes are different
Diffstat (limited to 'Ryujinx.Graphics/NvGpuEngine2d.cs')
-rw-r--r--Ryujinx.Graphics/NvGpuEngine2d.cs33
1 files changed, 25 insertions, 8 deletions
diff --git a/Ryujinx.Graphics/NvGpuEngine2d.cs b/Ryujinx.Graphics/NvGpuEngine2d.cs
index f20f8d6e..43fbcedf 100644
--- a/Ryujinx.Graphics/NvGpuEngine2d.cs
+++ b/Ryujinx.Graphics/NvGpuEngine2d.cs
@@ -61,8 +61,11 @@ namespace Ryujinx.Graphics
int DstBlitW = ReadRegister(NvGpuEngine2dReg.BlitDstW);
int DstBlitH = ReadRegister(NvGpuEngine2dReg.BlitDstH);
- int SrcBlitX = ReadRegister(NvGpuEngine2dReg.BlitSrcXInt);
- int SrcBlitY = ReadRegister(NvGpuEngine2dReg.BlitSrcYInt);
+ long BlitDuDx = ReadRegisterFixed1_31_32(NvGpuEngine2dReg.BlitDuDxFract);
+ long BlitDvDy = ReadRegisterFixed1_31_32(NvGpuEngine2dReg.BlitDvDyFract);
+
+ long SrcBlitX = ReadRegisterFixed1_31_32(NvGpuEngine2dReg.BlitSrcXFract);
+ long SrcBlitY = ReadRegisterFixed1_31_32(NvGpuEngine2dReg.BlitSrcYFract);
GalImageFormat SrcImgFormat = ImageUtils.ConvertSurface((GalSurfaceFormat)SrcFormat);
GalImageFormat DstImgFormat = ImageUtils.ConvertSurface((GalSurfaceFormat)DstFormat);
@@ -99,13 +102,19 @@ namespace Ryujinx.Graphics
Gpu.ResourceManager.SendTexture(Vmm, SrcKey, SrcTexture);
Gpu.ResourceManager.SendTexture(Vmm, DstKey, DstTexture);
+ int SrcBlitX1 = (int)(SrcBlitX >> 32);
+ int SrcBlitY1 = (int)(SrcBlitY >> 32);
+
+ int SrcBlitX2 = (int)(SrcBlitX + DstBlitW * BlitDuDx >> 32);
+ int SrcBlitY2 = (int)(SrcBlitY + DstBlitH * BlitDvDy >> 32);
+
Gpu.Renderer.RenderTarget.Copy(
SrcKey,
DstKey,
- SrcBlitX,
- SrcBlitY,
- SrcBlitX + DstBlitW,
- SrcBlitY + DstBlitH,
+ SrcBlitX1,
+ SrcBlitY1,
+ SrcBlitX2,
+ SrcBlitY2,
DstBlitX,
DstBlitY,
DstBlitX + DstBlitW,
@@ -121,8 +130,8 @@ namespace Ryujinx.Graphics
DstTexture,
SrcAddress,
DstAddress,
- SrcBlitX,
- SrcBlitY,
+ SrcBlitX1,
+ SrcBlitY1,
DstBlitX,
DstBlitY,
DstBlitW,
@@ -150,6 +159,14 @@ namespace Ryujinx.Graphics
Registers[MethCall.Method] = MethCall.Argument;
}
+ private long ReadRegisterFixed1_31_32(NvGpuEngine2dReg Reg)
+ {
+ long Low = (uint)ReadRegister(Reg + 0);
+ long High = (uint)ReadRegister(Reg + 1);
+
+ return Low | (High << 32);
+ }
+
private int ReadRegister(NvGpuEngine2dReg Reg)
{
return Registers[(int)Reg];