diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2021-07-11 17:20:40 -0300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-07-11 17:20:40 -0300 |
| commit | 40b21cc3c4d2622bbd4f88d43073341854d9a671 (patch) | |
| tree | 6e9dc6a42e7c0bae5b03db468481771d5a6937ef /Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs | |
| parent | b5190f16810eb77388c861d1d1773e19644808db (diff) | |
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
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs')
| -rw-r--r-- | Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs | 124 |
1 files changed, 0 insertions, 124 deletions
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 - { - /// <summary> - /// Checks if draws and clears should be performed, according - /// to currently set conditional rendering conditions. - /// </summary> - /// <param name="state">GPU state</param> - /// <returns>True if rendering is enabled, false otherwise</returns> - private ConditionalRenderEnabled GetRenderEnable(GpuState state) - { - ConditionState condState = state.Get<ConditionState>(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; - } - - /// <summary> - /// Checks if the counter value at a given GPU memory address is non-zero. - /// </summary> - /// <param name="state">GPU state</param> - /// <param name="gpuVa">GPU virtual address of the counter value</param> - /// <returns>True if the value is not zero, false otherwise. Returns host if handling with host conditional rendering</returns> - 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<ulong>(gpuVa) != 0) ? ConditionalRenderEnabled.True : ConditionalRenderEnabled.False; - } - } - - /// <summary> - /// Checks if the counter at a given GPU memory address passes a specified equality comparison. - /// </summary> - /// <param name="state">GPU state</param> - /// <param name="gpuVa">GPU virtual address</param> - /// <param name="isEqual">True to check if the values are equal, false to check if they are not equal</param> - /// <returns>True if the condition is met, false otherwise. Returns host if handling with host conditional rendering</returns> - 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<ulong>(gpuVa + 16), isEqual); - } - else if (evt == null && evt2 != null) - { - useHost = _context.Renderer.Pipeline.TryHostConditionalRendering(evt2, state.Channel.MemoryManager.Read<ulong>(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<ulong>(gpuVa); - ulong y = state.Channel.MemoryManager.Read<ulong>(gpuVa + 16); - - return (isEqual ? x == y : x != y) ? ConditionalRenderEnabled.True : ConditionalRenderEnabled.False; - } - } - - /// <summary> - /// Tries to find a counter that is supposed to be written at the specified address, - /// returning the related event. - /// </summary> - /// <param name="counterCache">GPU counter cache to search on</param> - /// <param name="gpuVa">GPU virtual address where the counter is supposed to be written</param> - /// <returns>The counter event, or null if not present</returns> - private static ICounterEvent FindEvent(CounterCache counterCache, ulong gpuVa) - { - return counterCache.FindEvent(gpuVa); - } - } -} |
