aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2018-08-23 02:07:23 -0300
committergdkchan <gab.dark.100@gmail.com>2018-08-23 02:07:23 -0300
commit624e813cd3e5d782847c577c2da0cfb8a121fd18 (patch)
treefa12638a42a406f1736662f1a2fdee1d9f9bd014 /Ryujinx.HLE
parent9977acad0fe08ee98a8174ce1c5609be22ba67ee (diff)
Implement multiple rendertarget attachments and depth writting (#375)
* Add depth writting * Implement multiple attachments * Address feedback
Diffstat (limited to 'Ryujinx.HLE')
-rw-r--r--Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs38
-rw-r--r--Ryujinx.HLE/Gpu/Engines/NvGpuEngine3dReg.cs2
2 files changed, 37 insertions, 3 deletions
diff --git a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs
index 419f6901..be47b66c 100644
--- a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs
+++ b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs
@@ -102,10 +102,15 @@ namespace Ryujinx.HLE.Gpu.Engines
SetAlphaBlending(State);
SetPrimitiveRestart(State);
- //Enabling multiple framebuffer attachments cause graphics reggresions
- SetFrameBuffer(Vmm, 0);
+ for (int FbIndex = 0; FbIndex < 8; FbIndex++)
+ {
+ SetFrameBuffer(Vmm, 0);
+ }
+
SetZeta(Vmm);
+ SetRenderTargets();
+
long[] Keys = UploadShaders(Vmm);
Gpu.Renderer.Shader.BindProgram();
@@ -415,6 +420,33 @@ namespace Ryujinx.HLE.Gpu.Engines
}
}
+ private void SetRenderTargets()
+ {
+ bool SeparateFragData = (ReadRegister(NvGpuEngine3dReg.RTSeparateFragData) & 1) != 0;
+
+ if (SeparateFragData)
+ {
+ uint Control = (uint)(ReadRegister(NvGpuEngine3dReg.RTControl));
+
+ uint Count = Control & 0xf;
+
+ int[] Map = new int[Count];
+
+ for (int i = 0; i < Count; i++)
+ {
+ int Shift = 4 + i * 3;
+
+ Map[i] = (int)((Control >> Shift) & 7);
+ }
+
+ Gpu.Renderer.FrameBuffer.SetMap(Map);
+ }
+ else
+ {
+ Gpu.Renderer.FrameBuffer.SetMap(null);
+ }
+ }
+
private void UploadTextures(NvGpuVmm Vmm, GalPipelineState State, long[] Keys)
{
long BaseShPosition = MakeInt64From2xInt32(NvGpuEngine3dReg.ShaderAddress);
@@ -801,4 +833,4 @@ namespace Ryujinx.HLE.Gpu.Engines
return Vmm.IsRegionModified(Key, Size, Type);
}
}
-} \ No newline at end of file
+}
diff --git a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3dReg.cs b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3dReg.cs
index b03aef02..7eff13b5 100644
--- a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3dReg.cs
+++ b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3dReg.cs
@@ -22,11 +22,13 @@ namespace Ryujinx.HLE.Gpu.Engines
StencilBackFuncRef = 0x3d5,
StencilBackMask = 0x3d6,
StencilBackFuncMask = 0x3d7,
+ RTSeparateFragData = 0x3eb,
ZetaAddress = 0x3f8,
ZetaFormat = 0x3fa,
ZetaBlockDimensions = 0x3fb,
ZetaLayerStride = 0x3fc,
VertexAttribNFormat = 0x458,
+ RTControl = 0x487,
ZetaHoriz = 0x48a,
ZetaVert = 0x48b,
ZetaArrayMode = 0x48c,