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

Avoid querying and setting texture bindings in hot code (#376)

ReinUsesLisp 7 лет назад
Родитель
Сommit
1cd7aaf504

+ 0 - 2
Ryujinx.Graphics/Gal/IGalShader.cs

@@ -11,8 +11,6 @@ namespace Ryujinx.Graphics.Gal
         IEnumerable<ShaderDeclInfo> GetConstBufferUsage(long Key);
         IEnumerable<ShaderDeclInfo> GetTextureUsage(long Key);
 
-        void EnsureTextureBinding(string UniformName, int Value);
-
         void Bind(long Key);
 
         void Unbind(GalShaderType Type);

+ 29 - 9
Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs

@@ -96,15 +96,6 @@ namespace Ryujinx.Graphics.Gal.OpenGL
             return Enumerable.Empty<ShaderDeclInfo>();
         }
 
-        public void EnsureTextureBinding(string UniformName, int Value)
-        {
-            BindProgram();
-
-            int Location = GL.GetUniformLocation(CurrentProgramHandle, UniformName);
-
-            GL.Uniform1(Location, Value);
-        }
-
         public unsafe void SetFlip(float X, float Y)
         {
             BindProgram();
@@ -188,6 +179,7 @@ namespace Ryujinx.Graphics.Gal.OpenGL
                 CheckProgramLink(Handle);
 
                 BindUniformBlocks(Handle);
+                BindTextureLocations(Handle);
 
                 Programs.Add(Current, Handle);
             }
@@ -258,6 +250,34 @@ namespace Ryujinx.Graphics.Gal.OpenGL
             BindUniformBlocksIfNotNull(Current.Fragment);
         }
 
+        private void BindTextureLocations(int ProgramHandle)
+        {
+            int Index = 0;
+
+            void BindTexturesIfNotNull(OGLShaderStage Stage)
+            {
+                if (Stage != null)
+                {
+                    foreach (ShaderDeclInfo Decl in Stage.TextureUsage)
+                    {
+                        int Location = GL.GetUniformLocation(ProgramHandle, Decl.Name);
+
+                        GL.Uniform1(Location, Index);
+
+                        Index++;
+                    }
+                }
+            }
+
+            GL.UseProgram(ProgramHandle);
+
+            BindTexturesIfNotNull(Current.Vertex);
+            BindTexturesIfNotNull(Current.TessControl);
+            BindTexturesIfNotNull(Current.TessEvaluation);
+            BindTexturesIfNotNull(Current.Geometry);
+            BindTexturesIfNotNull(Current.Fragment);
+        }
+
         private static void CheckProgramLink(int Handle)
         {
             int Status = 0;

+ 0 - 2
Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs

@@ -442,8 +442,6 @@ namespace Ryujinx.HLE.Gpu.Engines
 
                     UploadTexture(Vmm, TexIndex, TextureHandle);
 
-                    Gpu.Renderer.Shader.EnsureTextureBinding(DeclInfo.Name, TexIndex);
-
                     TexIndex++;
                 }
             }