summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorCorey Richardson <[email protected]>2013-07-31 10:46:12 -0400
committerMatt Turner <[email protected]>2013-08-01 10:23:39 -0700
commitabdbd02e5928c881510da0f76b4e49fd92ddfe50 (patch)
tree0674e2dd4785ea6b08b9e45004edfffb96c7e791 /src
parent986ae4306cea787ed0c71a52b6e92fce14a2a498 (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]>
Diffstat (limited to 'src')
-rw-r--r--src/mesa/main/texparam.c22
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: