From 40b21cc3c4d2622bbd4f88d43073341854d9a671 Mon Sep 17 00:00:00 2001 From: gdkchan Date: Sun, 11 Jul 2021 17:20:40 -0300 Subject: Separate GPU engines (part 2/2) (#2440) * 3D engine now uses DeviceState too, plus new state modification tracking * Remove old methods code * Remove GpuState and friends * Optimize DeviceState, force inline some functions * This change was not supposed to go in * Proper channel initialization * Optimize state read/write methods even more * Fix debug build * Do not dirty state if the write is redundant * The YControl register should dirty either the viewport or front face state too, to update the host origin * Avoid redundant vertex buffer updates * Move state and get rid of the Ryujinx.Graphics.Gpu.State namespace * Comments and nits * Fix rebase * PR feedback * Move changed = false to improve codegen * PR feedback * Carry RyuJIT a bit more --- .../Engine/MethodConditionalRendering.cs | 124 --------------------- 1 file changed, 124 deletions(-) delete mode 100644 Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs (limited to 'Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs') diff --git a/Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs b/Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs deleted file mode 100644 index 039ed78e..00000000 --- a/Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs +++ /dev/null @@ -1,124 +0,0 @@ -using Ryujinx.Common.Logging; -using Ryujinx.Graphics.GAL; -using Ryujinx.Graphics.Gpu.Memory; -using Ryujinx.Graphics.Gpu.State; - -namespace Ryujinx.Graphics.Gpu.Engine -{ - partial class Methods - { - /// - /// Checks if draws and clears should be performed, according - /// to currently set conditional rendering conditions. - /// - /// GPU state - /// True if rendering is enabled, false otherwise - private ConditionalRenderEnabled GetRenderEnable(GpuState state) - { - ConditionState condState = state.Get(MethodOffset.ConditionState); - - switch (condState.Condition) - { - case Condition.Always: - return ConditionalRenderEnabled.True; - case Condition.Never: - return ConditionalRenderEnabled.False; - case Condition.ResultNonZero: - return CounterNonZero(state, condState.Address.Pack()); - case Condition.Equal: - return CounterCompare(state, condState.Address.Pack(), true); - case Condition.NotEqual: - return CounterCompare(state, condState.Address.Pack(), false); - } - - Logger.Warning?.Print(LogClass.Gpu, $"Invalid conditional render condition \"{condState.Condition}\"."); - - return ConditionalRenderEnabled.True; - } - - /// - /// Checks if the counter value at a given GPU memory address is non-zero. - /// - /// GPU state - /// GPU virtual address of the counter value - /// True if the value is not zero, false otherwise. Returns host if handling with host conditional rendering - private ConditionalRenderEnabled CounterNonZero(GpuState state, ulong gpuVa) - { - ICounterEvent evt = state.Channel.MemoryManager.CounterCache.FindEvent(gpuVa); - - if (evt == null) - { - return ConditionalRenderEnabled.False; - } - - if (_context.Renderer.Pipeline.TryHostConditionalRendering(evt, 0L, false)) - { - return ConditionalRenderEnabled.Host; - } - else - { - evt.Flush(); - return (state.Channel.MemoryManager.Read(gpuVa) != 0) ? ConditionalRenderEnabled.True : ConditionalRenderEnabled.False; - } - } - - /// - /// Checks if the counter at a given GPU memory address passes a specified equality comparison. - /// - /// GPU state - /// GPU virtual address - /// True to check if the values are equal, false to check if they are not equal - /// True if the condition is met, false otherwise. Returns host if handling with host conditional rendering - private ConditionalRenderEnabled CounterCompare(GpuState state, ulong gpuVa, bool isEqual) - { - ICounterEvent evt = FindEvent(state.Channel.MemoryManager.CounterCache, gpuVa); - ICounterEvent evt2 = FindEvent(state.Channel.MemoryManager.CounterCache, gpuVa + 16); - - bool useHost; - - if (evt != null && evt2 == null) - { - useHost = _context.Renderer.Pipeline.TryHostConditionalRendering(evt, state.Channel.MemoryManager.Read(gpuVa + 16), isEqual); - } - else if (evt == null && evt2 != null) - { - useHost = _context.Renderer.Pipeline.TryHostConditionalRendering(evt2, state.Channel.MemoryManager.Read(gpuVa), isEqual); - } - else if (evt != null && evt2 != null) - { - useHost = _context.Renderer.Pipeline.TryHostConditionalRendering(evt, evt2, isEqual); - } - else - { - useHost = false; - } - - if (useHost) - { - return ConditionalRenderEnabled.Host; - } - else - { - evt?.Flush(); - evt2?.Flush(); - - ulong x = state.Channel.MemoryManager.Read(gpuVa); - ulong y = state.Channel.MemoryManager.Read(gpuVa + 16); - - return (isEqual ? x == y : x != y) ? ConditionalRenderEnabled.True : ConditionalRenderEnabled.False; - } - } - - /// - /// Tries to find a counter that is supposed to be written at the specified address, - /// returning the related event. - /// - /// GPU counter cache to search on - /// GPU virtual address where the counter is supposed to be written - /// The counter event, or null if not present - private static ICounterEvent FindEvent(CounterCache counterCache, ulong gpuVa) - { - return counterCache.FindEvent(gpuVa); - } - } -} -- cgit v1.2.3