From 1080f64df9abd7af7ed762668e4fc9a300ae30f2 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Thu, 4 Aug 2022 18:30:08 -0300 Subject: Implement HLE macros for render target clears (#3528) * Implement HLE macros for render target clears * Add constants for the offsets --- Ryujinx.Graphics.Gpu/Engine/MME/MacroHLE.cs | 35 ++++++++++++++++++++++ .../Engine/MME/MacroHLEFunctionName.cs | 2 ++ Ryujinx.Graphics.Gpu/Engine/MME/MacroHLETable.cs | 9 +++++- 3 files changed, 45 insertions(+), 1 deletion(-) (limited to 'Ryujinx.Graphics.Gpu/Engine/MME') diff --git a/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLE.cs b/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLE.cs index 05f3df0e..5f238a71 100644 --- a/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLE.cs +++ b/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLE.cs @@ -12,6 +12,10 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME /// class MacroHLE : IMacroEE { + private const int ColorLayerCountOffset = 0x818; + private const int ColorStructSize = 0x40; + private const int ZetaLayerCountOffset = 0x1230; + private readonly GPFifoProcessor _processor; private readonly MacroHLEFunctionName _functionName; @@ -45,6 +49,12 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME { switch (_functionName) { + case MacroHLEFunctionName.ClearColor: + ClearColor(state, arg0); + break; + case MacroHLEFunctionName.ClearDepthStencil: + ClearDepthStencil(state, arg0); + break; case MacroHLEFunctionName.MultiDrawElementsIndirectCount: MultiDrawElementsIndirectCount(state, arg0); break; @@ -53,6 +63,31 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME } } + /// + /// Clears one bound color target. + /// + /// GPU state at the time of the call + /// First argument of the call + private void ClearColor(IDeviceState state, int arg0) + { + int index = (arg0 >> 6) & 0xf; + int layerCount = state.Read(ColorLayerCountOffset + index * ColorStructSize); + + _processor.ThreedClass.Clear(arg0, layerCount); + } + + /// + /// Clears the current depth-stencil target. + /// + /// GPU state at the time of the call + /// First argument of the call + private void ClearDepthStencil(IDeviceState state, int arg0) + { + int layerCount = state.Read(ZetaLayerCountOffset); + + _processor.ThreedClass.Clear(arg0, layerCount); + } + /// /// Performs a indirect multi-draw, with parameters from a GPU buffer. /// diff --git a/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLEFunctionName.cs b/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLEFunctionName.cs index 60354a9b..4cce07fa 100644 --- a/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLEFunctionName.cs +++ b/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLEFunctionName.cs @@ -6,6 +6,8 @@ enum MacroHLEFunctionName { None, + ClearColor, + ClearDepthStencil, MultiDrawElementsIndirectCount } } diff --git a/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLETable.cs b/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLETable.cs index 77d041ad..c5d98848 100644 --- a/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLETable.cs +++ b/Ryujinx.Graphics.Gpu/Engine/MME/MacroHLETable.cs @@ -46,12 +46,19 @@ namespace Ryujinx.Graphics.Gpu.Engine.MME private static readonly TableEntry[] Table = new TableEntry[] { + new TableEntry(MacroHLEFunctionName.ClearColor, new Hash128(0xA9FB28D1DC43645A, 0xB177E5D2EAE67FB0), 0x28), + new TableEntry(MacroHLEFunctionName.ClearDepthStencil, new Hash128(0x1B96CB77D4879F4F, 0x8557032FE0C965FB), 0x24), new TableEntry(MacroHLEFunctionName.MultiDrawElementsIndirectCount, new Hash128(0x890AF57ED3FB1C37, 0x35D0C95C61F5386F), 0x19C) }; private static bool IsMacroHLESupported(Capabilities caps, MacroHLEFunctionName name) { - if (name == MacroHLEFunctionName.MultiDrawElementsIndirectCount) + if (name == MacroHLEFunctionName.ClearColor || + name == MacroHLEFunctionName.ClearDepthStencil) + { + return true; + } + else if (name == MacroHLEFunctionName.MultiDrawElementsIndirectCount) { return caps.SupportsIndirectParameters; } -- cgit v1.2.3