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:
@@ -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. */
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user