mesa: Allow sampling from units >= MAX_TEXTURE_UNITS in shaders.

The total number of units used by a shader is limited to MAX_TEXTURE_UNITS,
but the actual indices are only limited by MAX_COMBINED_TEXTURE_IMAGE_UNITS,
since they're shared between vertex and fragment shaders.

NOTE: This is a candidate for the 7.11 branch.

Signed-off-by: Henri Verbeet <hverbeet@gmail.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
Henri Verbeet
2011-07-04 00:57:42 +02:00
parent 2e35d90fb9
commit 86adc2b29e
3 changed files with 4 additions and 4 deletions

View File

@@ -1856,7 +1856,7 @@ struct gl_program
GLbitfield SystemValuesRead; /**< Bitmask of SYSTEM_VALUE_x inputs used */ GLbitfield SystemValuesRead; /**< Bitmask of SYSTEM_VALUE_x inputs used */
GLbitfield InputFlags[MAX_PROGRAM_INPUTS]; /**< PROG_PARAM_BIT_x flags */ GLbitfield InputFlags[MAX_PROGRAM_INPUTS]; /**< PROG_PARAM_BIT_x flags */
GLbitfield OutputFlags[MAX_PROGRAM_OUTPUTS]; /**< PROG_PARAM_BIT_x flags */ GLbitfield OutputFlags[MAX_PROGRAM_OUTPUTS]; /**< PROG_PARAM_BIT_x flags */
GLbitfield TexturesUsed[MAX_TEXTURE_UNITS]; /**< TEXTURE_x_BIT bitmask */ GLbitfield TexturesUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS]; /**< TEXTURE_x_BIT bitmask */
GLbitfield SamplersUsed; /**< Bitfield of which samplers are used */ GLbitfield SamplersUsed; /**< Bitfield of which samplers are used */
GLbitfield ShadowSamplers; /**< Texture units used for shadow sampling. */ GLbitfield ShadowSamplers; /**< Texture units used for shadow sampling. */

View File

@@ -1032,7 +1032,7 @@ validate_samplers(const struct gl_program *prog, char *errMsg)
"TEXTURE_2D", "TEXTURE_2D",
"TEXTURE_1D", "TEXTURE_1D",
}; };
GLint targetUsed[MAX_TEXTURE_IMAGE_UNITS]; GLint targetUsed[MAX_COMBINED_TEXTURE_IMAGE_UNITS];
GLbitfield samplersUsed = prog->SamplersUsed; GLbitfield samplersUsed = prog->SamplersUsed;
GLuint i; GLuint i;

View File

@@ -580,7 +580,7 @@ _mesa_update_shader_textures_used(struct gl_program *prog)
if (prog->SamplersUsed & (1 << s)) { if (prog->SamplersUsed & (1 << s)) {
GLuint unit = prog->SamplerUnits[s]; GLuint unit = prog->SamplerUnits[s];
GLuint tgt = prog->SamplerTargets[s]; GLuint tgt = prog->SamplerTargets[s];
assert(unit < MAX_TEXTURE_IMAGE_UNITS); assert(unit < Elements(prog->TexturesUsed));
assert(tgt < NUM_TEXTURE_TARGETS); assert(tgt < NUM_TEXTURE_TARGETS);
prog->TexturesUsed[unit] |= (1 << tgt); prog->TexturesUsed[unit] |= (1 << tgt);
} }
@@ -674,7 +674,7 @@ set_program_uniform(struct gl_context *ctx, struct gl_program *program,
GLuint texUnit = ((GLuint *) values)[i]; GLuint texUnit = ((GLuint *) values)[i];
/* check that the sampler (tex unit index) is legal */ /* check that the sampler (tex unit index) is legal */
if (texUnit >= ctx->Const.MaxTextureImageUnits) { if (texUnit >= ctx->Const.MaxCombinedTextureImageUnits) {
_mesa_error(ctx, GL_INVALID_VALUE, _mesa_error(ctx, GL_INVALID_VALUE,
"glUniform1(invalid sampler/tex unit index for '%s')", "glUniform1(invalid sampler/tex unit index for '%s')",
param->Name); param->Name);