aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2018-08-23 01:54:32 -0300
committergdkchan <gab.dark.100@gmail.com>2018-08-23 01:54:32 -0300
commit1cd7aaf5044c87cba6c59d71bdf2694e626d1545 (patch)
treee96e95c6f2b66062315e70e450b1ed146926847b
parent57dfa09e3aa47ef7407d9952519311e6ee67dc90 (diff)
Avoid querying and setting texture bindings in hot code (#376)
-rw-r--r--Ryujinx.Graphics/Gal/IGalShader.cs2
-rw-r--r--Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs38
-rw-r--r--Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs2
3 files changed, 29 insertions, 13 deletions
diff --git a/Ryujinx.Graphics/Gal/IGalShader.cs b/Ryujinx.Graphics/Gal/IGalShader.cs
index e906e6cd..4b951fa6 100644
--- a/Ryujinx.Graphics/Gal/IGalShader.cs
+++ b/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);
diff --git a/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs b/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs
index 9c7b8668..0108a0da 100644
--- a/Ryujinx.Graphics/Gal/OpenGL/OGLShader.cs
+++ b/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;
diff --git a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs b/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs
index 1d0834dd..419f6901 100644
--- a/Ryujinx.HLE/Gpu/Engines/NvGpuEngine3d.cs
+++ b/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++;
}
}