From 0cd5ba03fe4cccd232cdb6aa7e8648b4a08a0ab1 Mon Sep 17 00:00:00 2001 From: BaronKiko Date: Sun, 13 Jan 2019 21:26:42 +0000 Subject: =?UTF-8?q?Scissor=20test=20implementation.=20Partially=20stubbed?= =?UTF-8?q?=20until=20geometry=20shaders=E2=80=A6=20(#556)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Scissor test implementation. Partially stubbed until geometry shaders are fixed * Apply to all viewports when geometry shaders are disabled. * Also apply enable cap to all viewports when geometry shaders are disabled * Added fixme as per suggestion Co-Authored-By: BaronKiko * Apparently no alignment needed here. * Comment on new line * Correct height calculation --- Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) (limited to 'Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs') diff --git a/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs b/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs index dc1eec3b..9a22c85f 100644 --- a/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs +++ b/Ryujinx.Graphics/Graphics3d/NvGpuEngine3d.cs @@ -24,6 +24,9 @@ namespace Ryujinx.Graphics.Graphics3d private ConstBuffer[][] ConstBuffers; + // Height kept for flipping y axis + private int ViewportHeight = 0; + private int CurrentInstance = 0; public NvGpuEngine3d(NvGpu Gpu) @@ -97,6 +100,7 @@ namespace Ryujinx.Graphics.Graphics3d SetCullFace(State); SetDepth(State); SetStencil(State); + SetScissor(State); SetBlending(State); SetColorMask(State); SetPrimitiveRestart(State); @@ -208,6 +212,8 @@ namespace Ryujinx.Graphics.Graphics3d Gpu.ResourceManager.SendColorBuffer(Vmm, Key, FbIndex, Image); + ViewportHeight = VpH; + Gpu.Renderer.RenderTarget.SetViewport(FbIndex, VpX, VpY, VpW, VpH); } @@ -407,6 +413,36 @@ namespace Ryujinx.Graphics.Graphics3d } } + private void SetScissor(GalPipelineState State) + { + // FIXME: Stubbed, only the first scissor test is valid without a geometry shader loaded. At time of writing geometry shaders are also stubbed. + // Once geometry shaders are fixed it should be equal to GalPipelineState.RenderTargetCount when shader loaded, otherwise equal to 1 + State.ScissorTestCount = 1; + + for (int Index = 0; Index < GalPipelineState.RenderTargetsCount; Index++) + { + State.ScissorTestEnabled[Index] = ReadRegisterBool(NvGpuEngine3dReg.ScissorEnable + Index * 4); + + if (State.ScissorTestEnabled[Index]) + { + uint ScissorHorizontal = (uint)ReadRegister(NvGpuEngine3dReg.ScissorHorizontal + Index * 4); + uint ScissorVertical = (uint)ReadRegister(NvGpuEngine3dReg.ScissorVertical + Index * 4); + + State.ScissorTestX[Index] = (int)((ScissorHorizontal & 0xFFFF) * State.FlipX); // X, lower 16 bits + State.ScissorTestWidth[Index] = (int)((ScissorHorizontal >> 16) * State.FlipX) - State.ScissorTestX[Index]; // Width, right side is upper 16 bits + + State.ScissorTestY[Index] = (int)((ScissorVertical & 0xFFFF)); // Y, lower 16 bits + State.ScissorTestHeight[Index] = (int)((ScissorVertical >> 16)) - State.ScissorTestY[Index]; // Height, top side is upper 16 bits + + // Y coordinates may have to be flipped + if ((int)State.FlipY == -1) + { + State.ScissorTestY[Index] = ViewportHeight - State.ScissorTestY[Index] - State.ScissorTestHeight[Index]; + } + } + } + } + private void SetBlending(GalPipelineState State) { bool BlendIndependent = ReadRegisterBool(NvGpuEngine3dReg.BlendIndependent); -- cgit v1.2.3