diff options
author | Corey Richardson <[email protected]> | 2013-07-31 10:46:12 -0400 |
---|---|---|
committer | Matt Turner <[email protected]> | 2013-08-01 10:23:39 -0700 |
commit | abdbd02e5928c881510da0f76b4e49fd92ddfe50 (patch) | |
tree | 0674e2dd4785ea6b08b9e45004edfffb96c7e791 | |
parent | 986ae4306cea787ed0c71a52b6e92fce14a2a498 (diff) |
Correct clamping of TEXTURE_{MAX, BASE}_LEVEL
Previously, if TEXTURE_IMMUTABLE_FORMAT was TRUE, the levels were allowed to
be set like usual, but ARB_texture_storage states:
> if TEXTURE_IMMUTABLE_FORMAT is TRUE, then level_base is clamped to the range
> [0, <levels> - 1] and level_max is then clamped to the range [level_base,
> <levels> - 1], where <levels> is the parameter passed the call to
> TexStorage* for the texture object
Reviewed-by: Matt Turner <[email protected]>
Signed-off-by: Corey Richardson <[email protected]>
-rw-r--r-- | src/mesa/main/texparam.c | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index 32109951cb5..757ae80ec8d 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -386,7 +386,13 @@ set_tex_parameteri(struct gl_context *ctx, return GL_FALSE; } incomplete(ctx, texObj); - texObj->BaseLevel = params[0]; + + /** See note about ARB_texture_storage below */ + if (texObj->Immutable) + texObj->BaseLevel = MIN2(texObj->ImmutableLevels - 1, params[0]); + else + texObj->BaseLevel = params[0]; + return GL_TRUE; case GL_TEXTURE_MAX_LEVEL: @@ -399,7 +405,19 @@ set_tex_parameteri(struct gl_context *ctx, return GL_FALSE; } incomplete(ctx, texObj); - texObj->MaxLevel = params[0]; + + /** From ARB_texture_storage: + * However, if TEXTURE_IMMUTABLE_FORMAT is TRUE, then level_base is + * clamped to the range [0, <levels> - 1] and level_max is then clamped to + * the range [level_base, <levels> - 1], where <levels> is the parameter + * passed the call to TexStorage* for the texture object. + */ + if (texObj->Immutable) + texObj->MaxLevel = CLAMP(params[0], texObj->BaseLevel, + texObj->ImmutableLevels - 1); + else + texObj->MaxLevel = params[0]; + return GL_TRUE; case GL_GENERATE_MIPMAP_SGIS: |