On 07/31/2013 05:19 AM, Corey Richardson wrote:
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

Signed-off-by: Corey Richardson <co...@octayn.net>
---
  src/mesa/main/texparam.c | 28 ++++++++++++++++++++++++++--
  1 file changed, 26 insertions(+), 2 deletions(-)

diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c
index 141cbe3..f07d755 100644
--- a/src/mesa/main/texparam.c
+++ b/src/mesa/main/texparam.c
@@ -386,7 +386,14 @@ 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 = (params[0] >= texObj->ImmutableLevels) ?
+            texObj->ImmutableLevels - 1 : params[0];

This would be more clear as:

texObj->BaseLevel = MIN2(texObj->ImmutableLevels - 1, params[0]);


+      else
+         texObj->BaseLevel = params[0];
+
        return GL_TRUE;

     case GL_TEXTURE_MAX_LEVEL:
@@ -399,7 +406,24 @@ 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) {
+         if (*params < texObj->BaseLevel)
+            texObj->MaxLevel = texObj->BaseLevel;
+         else if (*params >= texObj->ImmutableLevels)
+            texObj->MaxLevel = texObj->ImmutableLevels - 1;
+         else
+            texObj->MaxLevel = params[0];

texObj->MaxLevel = CLAMP(params[0], texObj->BaseLevel, texObj->ImmutableLevels - 1);


+      }
+      else
+         texObj->MaxLevel = params[0];
+
        return GL_TRUE;

     case GL_GENERATE_MIPMAP_SGIS:


-Brian

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to