mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 07:28:11 +02:00
mesa: update the shader programs->TexturesUsed array at link time
If an application never calls glUniform() to set sampler variable values they'll remain 0 (the default value/unit). Now call _mesa_update_shader_textures_used() at link time in case glUniform() is never called. program->TextureUsed[] will then be correct for state validation.
This commit is contained in:
parent
df94fd1764
commit
517401af07
3 changed files with 26 additions and 4 deletions
|
|
@ -1415,10 +1415,22 @@ _mesa_use_program(GLcontext *ctx, GLuint program)
|
|||
|
||||
|
||||
/**
|
||||
* Update the vertex and fragment program's TexturesUsed arrays.
|
||||
* Update the vertex/fragment program's TexturesUsed array.
|
||||
*
|
||||
* This needs to be called after glUniform(set sampler var) is called.
|
||||
* A call to glUniform(samplerVar, value) causes a sampler to point to a
|
||||
* particular texture unit. We know the sampler's texture target
|
||||
* (1D/2D/3D/etc) from compile time but the sampler's texture unit is
|
||||
* set by glUniform() calls.
|
||||
*
|
||||
* So, scan the program->SamplerUnits[] and program->SamplerTargets[]
|
||||
* information to update the prog->TexturesUsed[] values.
|
||||
* Each value of TexturesUsed[unit] is one of zero, TEXTURE_1D_INDEX,
|
||||
* TEXTURE_2D_INDEX, TEXTURE_3D_INDEX, etc.
|
||||
* We'll use that info for state validation before rendering.
|
||||
*/
|
||||
static void
|
||||
update_textures_used(struct gl_program *prog)
|
||||
void
|
||||
_mesa_update_shader_textures_used(struct gl_program *prog)
|
||||
{
|
||||
GLuint s;
|
||||
|
||||
|
|
@ -1544,7 +1556,7 @@ set_program_uniform(GLcontext *ctx, struct gl_program *program,
|
|||
|
||||
/* This maps a sampler to a texture unit: */
|
||||
program->SamplerUnits[sampler] = texUnit;
|
||||
update_textures_used(program);
|
||||
_mesa_update_shader_textures_used(program);
|
||||
|
||||
FLUSH_VERTICES(ctx, _NEW_TEXTURE);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,6 +79,10 @@ extern struct gl_shader *
|
|||
_mesa_lookup_shader(GLcontext *ctx, GLuint name);
|
||||
|
||||
|
||||
extern void
|
||||
_mesa_update_shader_textures_used(struct gl_program *prog);
|
||||
|
||||
|
||||
extern void
|
||||
_mesa_use_program(GLcontext *ctx, GLuint program);
|
||||
|
||||
|
|
|
|||
|
|
@ -562,6 +562,9 @@ _slang_link(GLcontext *ctx,
|
|||
|
||||
|
||||
if (fragProg && shProg->FragmentProgram) {
|
||||
/* Compute initial program's TexturesUsed info */
|
||||
_mesa_update_shader_textures_used(&shProg->FragmentProgram->Base);
|
||||
|
||||
/* notify driver that a new fragment program has been compiled/linked */
|
||||
ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_PROGRAM_ARB,
|
||||
&shProg->FragmentProgram->Base);
|
||||
|
|
@ -577,6 +580,9 @@ _slang_link(GLcontext *ctx,
|
|||
}
|
||||
|
||||
if (vertProg && shProg->VertexProgram) {
|
||||
/* Compute initial program's TexturesUsed info */
|
||||
_mesa_update_shader_textures_used(&shProg->VertexProgram->Base);
|
||||
|
||||
/* notify driver that a new vertex program has been compiled/linked */
|
||||
ctx->Driver.ProgramStringNotify(ctx, GL_VERTEX_PROGRAM_ARB,
|
||||
&shProg->VertexProgram->Base);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue