mesa: make glFramebuffer* check immutable texture level bounds
When a texture is immutable, we can't tack on extra levels after-the-fact like we could with glTexImage. So check against that level limit and return an error if it's surpassed. This fixes: KHR-GL45.geometry_shader.layered_fbo.fb_texture_invalid_level_number (Based on a patch by Ilia Mirkin.) Reviewed-by: Antia Puentes <apuentes@igalia.com> [imirkin v2] Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
parent
5a47abb63e
commit
37e128b9b7
|
@ -3223,11 +3223,19 @@ check_layer(struct gl_context *ctx, GLenum target, GLint layer,
|
|||
* \return true if no errors, false if errors
|
||||
*/
|
||||
static bool
|
||||
check_level(struct gl_context *ctx, GLenum target, GLint level,
|
||||
const char *caller)
|
||||
check_level(struct gl_context *ctx, struct gl_texture_object *texObj,
|
||||
GLenum target, GLint level, const char *caller)
|
||||
{
|
||||
if ((level < 0) ||
|
||||
(level >= _mesa_max_texture_levels(ctx, target))) {
|
||||
/* Section 9.2.8 of the OpenGL 4.6 specification says:
|
||||
*
|
||||
* "If texture refers to an immutable-format texture, level must be
|
||||
* greater than or equal to zero and smaller than the value of
|
||||
* TEXTURE_VIEW_NUM_LEVELS for texture."
|
||||
*/
|
||||
const int max_levels = texObj->Immutable ? texObj->ImmutableLevels :
|
||||
_mesa_max_texture_levels(ctx, target);
|
||||
|
||||
if (level < 0 || level >= max_levels) {
|
||||
_mesa_error(ctx, GL_INVALID_VALUE,
|
||||
"%s(invalid level %d)", caller, level);
|
||||
return false;
|
||||
|
@ -3393,7 +3401,7 @@ framebuffer_texture_with_dims(int dims, GLenum target,
|
|||
if ((dims == 3) && !check_layer(ctx, texObj->Target, layer, caller))
|
||||
return;
|
||||
|
||||
if (!check_level(ctx, textarget, level, caller))
|
||||
if (!check_level(ctx, texObj, textarget, level, caller))
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -3539,7 +3547,7 @@ frame_buffer_texture(GLuint framebuffer, GLenum target,
|
|||
return;
|
||||
}
|
||||
|
||||
if (!check_level(ctx, texObj->Target, level, func))
|
||||
if (!check_level(ctx, texObj, texObj->Target, level, func))
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue