Просмотр исходного кода

Implement Force Early Z Register (#1755)

riperiperi 5 лет назад
Родитель
Сommit
461c24092a

+ 18 - 0
Ryujinx.Graphics.Gpu/Shader/Cache/CacheHelper.cs

@@ -332,6 +332,23 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache
             return null;
         }
 
+        /// <summary>
+        /// Builds gpu state flags using information from the given gpu accessor.
+        /// </summary>
+        /// <param name="gpuAccessor">The gpu accessor</param>
+        /// <returns>The gpu state flags</returns>
+        private static GuestGpuStateFlags GetGpuStateFlags(IGpuAccessor gpuAccessor)
+        {
+            GuestGpuStateFlags flags = 0;
+
+            if (gpuAccessor.QueryEarlyZForce())
+            {
+                flags |= GuestGpuStateFlags.EarlyZForce;
+            }
+
+            return flags;
+        }
+
         /// <summary>
         /// Create a new instance of <see cref="GuestGpuAccessorHeader"/> from an gpu accessor.
         /// </summary>
@@ -347,6 +364,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache
                 ComputeLocalMemorySize = gpuAccessor.QueryComputeLocalMemorySize(),
                 ComputeSharedMemorySize = gpuAccessor.QueryComputeSharedMemorySize(),
                 PrimitiveTopology = gpuAccessor.QueryPrimitiveTopology(),
+                StateFlags = GetGpuStateFlags(gpuAccessor)
             };
         }
 

+ 2 - 2
Ryujinx.Graphics.Gpu/Shader/Cache/Definition/GuestGpuAccessorHeader.cs

@@ -55,8 +55,8 @@ namespace Ryujinx.Graphics.Gpu.Shader.Cache.Definition
         public ushort Reserved2;
 
         /// <summary>
-        /// Unused/reserved.
+        /// GPU boolean state that can influence shader compilation.
         /// </summary>
-        public byte Reserved3;
+        public GuestGpuStateFlags StateFlags;
     }
 }

+ 10 - 0
Ryujinx.Graphics.Gpu/Shader/Cache/Definition/GuestGpuStateFlags.cs

@@ -0,0 +1,10 @@
+using System;
+
+namespace Ryujinx.Graphics.Gpu.Shader.Cache.Definition
+{
+    [Flags]
+    enum GuestGpuStateFlags : byte
+    {
+        EarlyZForce = 1 << 0
+    }
+}

+ 9 - 0
Ryujinx.Graphics.Gpu/Shader/CachedGpuAccessor.cs

@@ -150,5 +150,14 @@ namespace Ryujinx.Graphics.Gpu.Shader
 
             return textureDescriptor;
         }
+
+        /// <summary>
+        /// Queries if host state forces early depth testing.
+        /// </summary>
+        /// <returns>True if early depth testing is forced</returns>
+        public bool QueryEarlyZForce()
+        {
+            return (_header.StateFlags & GuestGpuStateFlags.EarlyZForce) != 0;
+        }
     }
 }

+ 9 - 0
Ryujinx.Graphics.Gpu/Shader/GpuAccessor.cs

@@ -196,5 +196,14 @@ namespace Ryujinx.Graphics.Gpu.Shader
                 return _context.Methods.TextureManager.GetGraphicsTextureDescriptor(_state, _stageIndex, handle);
             }
         }
+
+        /// <summary>
+        /// Queries if host state forces early depth testing.
+        /// </summary>
+        /// <returns>True if early depth testing is forced</returns>
+        public bool QueryEarlyZForce()
+        {
+            return _state.Get<bool>(MethodOffset.EarlyZForce);
+        }
     }
 }

+ 1 - 0
Ryujinx.Graphics.Gpu/State/MethodOffset.cs

@@ -13,6 +13,7 @@ namespace Ryujinx.Graphics.Gpu.State
         LaunchDma                       = 0x6c,
         LoadInlineData                  = 0x6d,
         CopyDstTexture                  = 0x80,
+        EarlyZForce                     = 0x84,
         CopySrcTexture                  = 0x8c,
         DispatchParamsAddress           = 0xad,
         Dispatch                        = 0xaf,

+ 6 - 0
Ryujinx.Graphics.Shader/CodeGen/Glsl/Declarations.cs

@@ -141,6 +141,12 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
             {
                 if (context.Config.Stage == ShaderStage.Fragment)
                 {
+                    if (context.Config.GpuAccessor.QueryEarlyZForce())
+                    {
+                        context.AppendLine("layout(early_fragment_tests) in;");
+                        context.AppendLine();
+                    }
+
                     context.AppendLine($"uniform bool {DefaultNames.IsBgraName}[8];");
                     context.AppendLine();
                 }

+ 5 - 0
Ryujinx.Graphics.Shader/IGpuAccessor.cs

@@ -78,5 +78,10 @@
         {
             return TextureFormat.R8G8B8A8Unorm;
         }
+
+        bool QueryEarlyZForce()
+        {
+            return false;
+        }
     }
 }