Avoid querying and setting texture bindings in hot code (#376)
This commit is contained in:
parent
57dfa09e3a
commit
1cd7aaf504
3 changed files with 29 additions and 13 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -442,8 +442,6 @@ namespace Ryujinx.HLE.Gpu.Engines
|
|||
|
||||
UploadTexture(Vmm, TexIndex, TextureHandle);
|
||||
|
||||
Gpu.Renderer.Shader.EnsureTextureBinding(DeclInfo.Name, TexIndex);
|
||||
|
||||
TexIndex++;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue