aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs')
-rw-r--r--Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs263
1 files changed, 0 insertions, 263 deletions
diff --git a/Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs b/Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs
deleted file mode 100644
index b6dae2a3..00000000
--- a/Ryujinx.Graphics/Graphics3d/NvGpuEngine2d.cs
+++ /dev/null
@@ -1,263 +0,0 @@
-using Ryujinx.Graphics.Gal;
-using Ryujinx.Graphics.Memory;
-using Ryujinx.Graphics.Texture;
-using Ryujinx.Profiler;
-
-namespace Ryujinx.Graphics.Graphics3d
-{
- class NvGpuEngine2d : INvGpuEngine
- {
- private enum CopyOperation
- {
- SrcCopyAnd,
- RopAnd,
- Blend,
- SrcCopy,
- Rop,
- SrcCopyPremult,
- BlendPremult
- }
-
- public int[] Registers { get; private set; }
-
- private NvGpu _gpu;
-
- public NvGpuEngine2d(NvGpu gpu)
- {
- _gpu = gpu;
-
- Registers = new int[0x238];
- }
-
- public void CallMethod(NvGpuVmm vmm, GpuMethodCall methCall)
- {
- WriteRegister(methCall);
-
- if ((NvGpuEngine2dReg)methCall.Method == NvGpuEngine2dReg.BlitSrcYInt)
- {
- TextureCopy(vmm);
- }
- }
-
- private void TextureCopy(NvGpuVmm vmm)
- {
- Profile.Begin(Profiles.GPU.Engine2d.TextureCopy);
-
- CopyOperation operation = (CopyOperation)ReadRegister(NvGpuEngine2dReg.CopyOperation);
-
- int dstFormat = ReadRegister(NvGpuEngine2dReg.DstFormat);
- bool dstLinear = ReadRegister(NvGpuEngine2dReg.DstLinear) != 0;
- int dstWidth = ReadRegister(NvGpuEngine2dReg.DstWidth);
- int dstHeight = ReadRegister(NvGpuEngine2dReg.DstHeight);
- int dstDepth = ReadRegister(NvGpuEngine2dReg.DstDepth);
- int dstLayer = ReadRegister(NvGpuEngine2dReg.DstLayer);
- int dstPitch = ReadRegister(NvGpuEngine2dReg.DstPitch);
- int dstBlkDim = ReadRegister(NvGpuEngine2dReg.DstBlockDimensions);
-
- int srcFormat = ReadRegister(NvGpuEngine2dReg.SrcFormat);
- bool srcLinear = ReadRegister(NvGpuEngine2dReg.SrcLinear) != 0;
- int srcWidth = ReadRegister(NvGpuEngine2dReg.SrcWidth);
- int srcHeight = ReadRegister(NvGpuEngine2dReg.SrcHeight);
- int srcDepth = ReadRegister(NvGpuEngine2dReg.SrcDepth);
- int srcLayer = ReadRegister(NvGpuEngine2dReg.SrcLayer);
- int srcPitch = ReadRegister(NvGpuEngine2dReg.SrcPitch);
- int srcBlkDim = ReadRegister(NvGpuEngine2dReg.SrcBlockDimensions);
-
- int dstBlitX = ReadRegister(NvGpuEngine2dReg.BlitDstX);
- int dstBlitY = ReadRegister(NvGpuEngine2dReg.BlitDstY);
- int dstBlitW = ReadRegister(NvGpuEngine2dReg.BlitDstW);
- int dstBlitH = ReadRegister(NvGpuEngine2dReg.BlitDstH);
-
- 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);
-
- GalMemoryLayout srcLayout = GetLayout(srcLinear);
- GalMemoryLayout dstLayout = GetLayout(dstLinear);
-
- int srcBlockHeight = 1 << ((srcBlkDim >> 4) & 0xf);
- int dstBlockHeight = 1 << ((dstBlkDim >> 4) & 0xf);
-
- long srcAddress = MakeInt64From2xInt32(NvGpuEngine2dReg.SrcAddress);
- long dstAddress = MakeInt64From2xInt32(NvGpuEngine2dReg.DstAddress);
-
- long srcKey = vmm.GetPhysicalAddress(srcAddress);
- long dstKey = vmm.GetPhysicalAddress(dstAddress);
-
- bool isSrcLayered = false;
- bool isDstLayered = false;
-
- GalTextureTarget srcTarget = GalTextureTarget.TwoD;
-
- if (srcDepth != 0)
- {
- srcTarget = GalTextureTarget.TwoDArray;
- srcDepth++;
- isSrcLayered = true;
- }
- else
- {
- srcDepth = 1;
- }
-
- GalTextureTarget dstTarget = GalTextureTarget.TwoD;
-
- if (dstDepth != 0)
- {
- dstTarget = GalTextureTarget.TwoDArray;
- dstDepth++;
- isDstLayered = true;
- }
- else
- {
- dstDepth = 1;
- }
-
- GalImage srcTexture = new GalImage(
- srcWidth,
- srcHeight,
- 1, srcDepth, 1,
- srcBlockHeight, 1,
- srcLayout,
- srcImgFormat,
- srcTarget);
-
- GalImage dstTexture = new GalImage(
- dstWidth,
- dstHeight,
- 1, dstDepth, 1,
- dstBlockHeight, 1,
- dstLayout,
- dstImgFormat,
- dstTarget);
-
- srcTexture.Pitch = srcPitch;
- dstTexture.Pitch = dstPitch;
-
- long GetLayerOffset(GalImage image, int layer)
- {
- int targetMipLevel = image.MaxMipmapLevel <= 1 ? 1 : image.MaxMipmapLevel - 1;
- return ImageUtils.GetLayerOffset(image, targetMipLevel) * layer;
- }
-
- int srcLayerIndex = -1;
-
- if (isSrcLayered && _gpu.ResourceManager.TryGetTextureLayer(srcKey, out srcLayerIndex) && srcLayerIndex != 0)
- {
- srcKey = srcKey - GetLayerOffset(srcTexture, srcLayerIndex);
- }
-
- int dstLayerIndex = -1;
-
- if (isDstLayered && _gpu.ResourceManager.TryGetTextureLayer(dstKey, out dstLayerIndex) && dstLayerIndex != 0)
- {
- dstKey = dstKey - GetLayerOffset(dstTexture, dstLayerIndex);
- }
-
- _gpu.ResourceManager.SendTexture(vmm, srcKey, srcTexture);
- _gpu.ResourceManager.SendTexture(vmm, dstKey, dstTexture);
-
- if (isSrcLayered && srcLayerIndex == -1)
- {
- for (int layer = 0; layer < srcTexture.LayerCount; layer++)
- {
- _gpu.ResourceManager.SetTextureArrayLayer(srcKey + GetLayerOffset(srcTexture, layer), layer);
- }
-
- srcLayerIndex = 0;
- }
-
- if (isDstLayered && dstLayerIndex == -1)
- {
- for (int layer = 0; layer < dstTexture.LayerCount; layer++)
- {
- _gpu.ResourceManager.SetTextureArrayLayer(dstKey + GetLayerOffset(dstTexture, layer), layer);
- }
-
- dstLayerIndex = 0;
- }
-
- 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(
- srcTexture,
- dstTexture,
- srcKey,
- dstKey,
- srcLayerIndex,
- dstLayerIndex,
- srcBlitX1,
- srcBlitY1,
- srcBlitX2,
- srcBlitY2,
- dstBlitX,
- dstBlitY,
- dstBlitX + dstBlitW,
- dstBlitY + dstBlitH);
-
- // Do a guest side copy as well. This is necessary when
- // the texture is modified by the guest, however it doesn't
- // work when resources that the gpu can write to are copied,
- // like framebuffers.
-
- // FIXME: SUPPORT MULTILAYER CORRECTLY HERE (this will cause weird stuffs on the first layer)
- ImageUtils.CopyTexture(
- vmm,
- srcTexture,
- dstTexture,
- srcAddress,
- dstAddress,
- srcBlitX1,
- srcBlitY1,
- dstBlitX,
- dstBlitY,
- dstBlitW,
- dstBlitH);
-
- vmm.IsRegionModified(dstKey, ImageUtils.GetSize(dstTexture), NvGpuBufferType.Texture);
-
- Profile.End(Profiles.GPU.Engine2d.TextureCopy);
- }
-
- private static GalMemoryLayout GetLayout(bool linear)
- {
- return linear
- ? GalMemoryLayout.Pitch
- : GalMemoryLayout.BlockLinear;
- }
-
- private long MakeInt64From2xInt32(NvGpuEngine2dReg reg)
- {
- return
- (long)Registers[(int)reg + 0] << 32 |
- (uint)Registers[(int)reg + 1];
- }
-
- private void WriteRegister(GpuMethodCall methCall)
- {
- 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];
- }
- }
-}