Crop instead of resizing on 2d engine texture copies (#482)

* Crop instead of resizing on 2d engine texture copies

* Remove unused local
This commit is contained in:
gdkchan 2018-10-27 15:46:17 -03:00 committed by Ac_K
parent 19152def95
commit 111d14f74a
2 changed files with 29 additions and 35 deletions

View file

@ -1,7 +1,7 @@
using Ryujinx.Graphics.Gal; using Ryujinx.Graphics.Gal;
using Ryujinx.Graphics.Memory; using Ryujinx.Graphics.Memory;
using Ryujinx.Graphics.Texture; using Ryujinx.Graphics.Texture;
using System.Collections.Generic; using System;
namespace Ryujinx.Graphics namespace Ryujinx.Graphics
{ {
@ -22,42 +22,24 @@ namespace Ryujinx.Graphics
private NvGpu Gpu; private NvGpu Gpu;
private Dictionary<int, NvGpuMethod> Methods;
public NvGpuEngine2d(NvGpu Gpu) public NvGpuEngine2d(NvGpu Gpu)
{ {
this.Gpu = Gpu; this.Gpu = Gpu;
Registers = new int[0xe00]; Registers = new int[0x238];
Methods = new Dictionary<int, NvGpuMethod>();
void AddMethod(int Meth, int Count, int Stride, NvGpuMethod Method)
{
while (Count-- > 0)
{
Methods.Add(Meth, Method);
Meth += Stride;
}
}
AddMethod(0xb5, 1, 1, TextureCopy);
} }
public void CallMethod(NvGpuVmm Vmm, NvGpuPBEntry PBEntry) public void CallMethod(NvGpuVmm Vmm, NvGpuPBEntry PBEntry)
{
if (Methods.TryGetValue(PBEntry.Method, out NvGpuMethod Method))
{
Method(Vmm, PBEntry);
}
else
{ {
WriteRegister(PBEntry); WriteRegister(PBEntry);
if ((NvGpuEngine2dReg)PBEntry.Method == NvGpuEngine2dReg.BlitSrcYInt)
{
TextureCopy(Vmm);
} }
} }
private void TextureCopy(NvGpuVmm Vmm, NvGpuPBEntry PBEntry) private void TextureCopy(NvGpuVmm Vmm)
{ {
CopyOperation Operation = (CopyOperation)ReadRegister(NvGpuEngine2dReg.CopyOperation); CopyOperation Operation = (CopyOperation)ReadRegister(NvGpuEngine2dReg.CopyOperation);
@ -107,17 +89,20 @@ namespace Ryujinx.Graphics
Gpu.ResourceManager.SendTexture(Vmm, SrcKey, SrcTexture); Gpu.ResourceManager.SendTexture(Vmm, SrcKey, SrcTexture);
Gpu.ResourceManager.SendTexture(Vmm, DstKey, DstTexture); Gpu.ResourceManager.SendTexture(Vmm, DstKey, DstTexture);
int Width = Math.Min(SrcWidth, DstWidth);
int Height = Math.Min(SrcHeight, DstHeight);
Gpu.Renderer.RenderTarget.Copy( Gpu.Renderer.RenderTarget.Copy(
SrcKey, SrcKey,
DstKey, DstKey,
0, 0,
0, 0,
SrcWidth, Width,
SrcHeight, Height,
0, 0,
0, 0,
DstWidth, Width,
DstHeight); Height);
} }
private static GalMemoryLayout GetLayout(bool Linear) private static GalMemoryLayout GetLayout(bool Linear)
@ -148,10 +133,5 @@ namespace Ryujinx.Graphics
{ {
return Registers[(int)Reg]; return Registers[(int)Reg];
} }
private void WriteRegister(NvGpuEngine2dReg Reg, int Value)
{
Registers[(int)Reg] = Value;
}
} }
} }

View file

@ -20,6 +20,20 @@ namespace Ryujinx.Graphics
SrcWidth = 0x92, SrcWidth = 0x92,
SrcHeight = 0x93, SrcHeight = 0x93,
SrcAddress = 0x94, SrcAddress = 0x94,
CopyOperation = 0xab ClipEnable = 0xa4,
CopyOperation = 0xab,
BlitControl = 0x223,
BlitDstX = 0x22c,
BlitDstY = 0x22d,
BlitDstW = 0x22e,
BlitDstH = 0x22f,
BlitDuDxFract = 0x230,
BlitDuDxInt = 0x231,
BlitDvDyFract = 0x232,
BlitDvDyInt = 0x233,
BlitSrcXFract = 0x234,
BlitSrcXInt = 0x235,
BlitSrcYFract = 0x236,
BlitSrcYInt = 0x237
} }
} }