From fbb4019ed5c12c4a888c7b09db648ac595366896 Mon Sep 17 00:00:00 2001
From: gdkchan <gab.dark.100@gmail.com>
Date: Tue, 29 Jun 2021 14:32:02 -0300
Subject: Initial support for separate GPU address spaces (#2394)

* Make GPU memory manager a member of GPU channel

* Move physical memory instance to the memory manager, and the caches to the physical memory

* PR feedback
---
 .../Engine/MethodConditionalRendering.cs           | 34 ++++++++++++----------
 1 file changed, 19 insertions(+), 15 deletions(-)

(limited to 'Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs')

diff --git a/Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs b/Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs
index 0d7c272c..039ed78e 100644
--- a/Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs
+++ b/Ryujinx.Graphics.Gpu/Engine/MethodConditionalRendering.cs
@@ -1,5 +1,6 @@
 using Ryujinx.Common.Logging;
 using Ryujinx.Graphics.GAL;
+using Ryujinx.Graphics.Gpu.Memory;
 using Ryujinx.Graphics.Gpu.State;
 
 namespace Ryujinx.Graphics.Gpu.Engine
@@ -23,11 +24,11 @@ namespace Ryujinx.Graphics.Gpu.Engine
                 case Condition.Never:
                     return ConditionalRenderEnabled.False;
                 case Condition.ResultNonZero:
-                    return CounterNonZero(condState.Address.Pack());
+                    return CounterNonZero(state, condState.Address.Pack());
                 case Condition.Equal:
-                    return CounterCompare(condState.Address.Pack(), true);
+                    return CounterCompare(state, condState.Address.Pack(), true);
                 case Condition.NotEqual:
-                    return CounterCompare(condState.Address.Pack(), false);
+                    return CounterCompare(state, condState.Address.Pack(), false);
             }
 
             Logger.Warning?.Print(LogClass.Gpu, $"Invalid conditional render condition \"{condState.Condition}\".");
@@ -38,11 +39,12 @@ namespace Ryujinx.Graphics.Gpu.Engine
         /// <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(ulong gpuVa)
+        private ConditionalRenderEnabled CounterNonZero(GpuState state, ulong gpuVa)
         {
-            ICounterEvent evt = _counterCache.FindEvent(gpuVa);
+            ICounterEvent evt = state.Channel.MemoryManager.CounterCache.FindEvent(gpuVa);
 
             if (evt == null)
             {
@@ -56,30 +58,31 @@ namespace Ryujinx.Graphics.Gpu.Engine
             else
             {
                 evt.Flush();
-                return (_context.MemoryManager.Read<ulong>(gpuVa) != 0) ? ConditionalRenderEnabled.True : ConditionalRenderEnabled.False;
+                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(ulong gpuVa, bool isEqual)
+        private ConditionalRenderEnabled CounterCompare(GpuState state, ulong gpuVa, bool isEqual)
         {
-            ICounterEvent evt = FindEvent(gpuVa);
-            ICounterEvent evt2 = FindEvent(gpuVa + 16);
+            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, _context.MemoryManager.Read<ulong>(gpuVa + 16), isEqual);
+                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, _context.MemoryManager.Read<ulong>(gpuVa), isEqual);
+                useHost = _context.Renderer.Pipeline.TryHostConditionalRendering(evt2, state.Channel.MemoryManager.Read<ulong>(gpuVa), isEqual);
             }
             else if (evt != null && evt2 != null)
             {
@@ -99,8 +102,8 @@ namespace Ryujinx.Graphics.Gpu.Engine
                 evt?.Flush();
                 evt2?.Flush();
 
-                ulong x = _context.MemoryManager.Read<ulong>(gpuVa);
-                ulong y = _context.MemoryManager.Read<ulong>(gpuVa + 16);
+                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;
             }
@@ -110,11 +113,12 @@ namespace Ryujinx.Graphics.Gpu.Engine
         /// 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 ICounterEvent FindEvent(ulong gpuVa)
+        private static ICounterEvent FindEvent(CounterCache counterCache, ulong gpuVa)
         {
-            return _counterCache.FindEvent(gpuVa);
+            return counterCache.FindEvent(gpuVa);
         }
     }
 }
-- 
cgit v1.2.3-70-g09d2