mesa,meta: move gl_texture_object::TargetIndex initializations
authorBrian Paul <brianp@vmware.com>
Mon, 5 Oct 2015 14:14:56 +0000 (08:14 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 8 Oct 2015 19:53:33 +0000 (13:53 -0600)
Before, we were unconditionally assigning the TargetIndex field in
_mesa_BindTexture(), even if it was already set properly.  Now we
initialize TargetIndex wherever we initialize the Target field, in
_mesa_initialize_texture_object(), finish_texture_init(), etc.

v2: also update the meta_copy_image code.  In make_view() the
view_tex_obj->Target field was set, but not the TargetIndex field.
Also, remove a second, redundant assignment to view_tex_obj->Target.
Add sanity check assertions too.

Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
Tested-by: Mark Janes <mark.a.janes@intel.com>
src/mesa/drivers/common/meta_copy_image.c
src/mesa/main/shared.c
src/mesa/main/texobj.c
src/mesa/main/textureview.c

index 33490ee6615061dbed640fc2c5b49bcdff1f3d83..04b9cafe30885ff9d9d1b7aa5a43c79efbf7efda 100644 (file)
@@ -108,7 +108,11 @@ make_view(struct gl_context *ctx, struct gl_texture_image *tex_image,
       return false;
    }
 
+   assert(tex_obj->Target != 0);
+   assert(tex_obj->TargetIndex < NUM_TEXTURE_TARGETS);
+
    view_tex_obj->Target = tex_obj->Target;
+   view_tex_obj->TargetIndex = tex_obj->TargetIndex;
 
    *view_tex_image = _mesa_get_tex_image(ctx, view_tex_obj, tex_obj->Target, 0);
 
@@ -129,7 +133,6 @@ make_view(struct gl_context *ctx, struct gl_texture_image *tex_image,
    view_tex_obj->NumLayers = tex_obj->NumLayers;
    view_tex_obj->Immutable = tex_obj->Immutable;
    view_tex_obj->ImmutableLevels = tex_obj->ImmutableLevels;
-   view_tex_obj->Target = tex_obj->Target;
 
    if (ctx->Driver.TextureView != NULL &&
        !ctx->Driver.TextureView(ctx, view_tex_obj, tex_obj)) {
index 1acaf59f432aef0d745b338b842ecd5e379f097a..c37b31d1753e45455627382d936c18febceaa2d4 100644 (file)
@@ -107,6 +107,11 @@ _mesa_alloc_shared_state(struct gl_context *ctx)
       };
       STATIC_ASSERT(ARRAY_SIZE(targets) == NUM_TEXTURE_TARGETS);
       shared->DefaultTex[i] = ctx->Driver.NewTextureObject(ctx, 0, targets[i]);
+      /* Need to explicitly set/overwrite the TargetIndex field here since
+       * the call to _mesa_tex_target_to_index() in NewTextureObject() may
+       * fail if the texture target is not supported.
+       */
+      shared->DefaultTex[i]->TargetIndex = i;
    }
 
    /* sanity check */
index 66eacf850f4b4731acb0a393c44e37c3cd18d80b..60c55aeb206db1394868571a8cd3c497c157c1e3 100644 (file)
@@ -286,6 +286,12 @@ _mesa_initialize_texture_object( struct gl_context *ctx,
    obj->RefCount = 1;
    obj->Name = name;
    obj->Target = target;
+   if (target != 0) {
+      obj->TargetIndex = _mesa_tex_target_to_index(ctx, target);
+   }
+   else {
+      obj->TargetIndex = NUM_TEXTURE_TARGETS; /* invalid/error value */
+   }
    obj->Priority = 1.0F;
    obj->BaseLevel = 0;
    obj->MaxLevel = 1000;
@@ -340,6 +346,10 @@ finish_texture_init(struct gl_context *ctx, GLenum target,
    GLenum filter = GL_LINEAR;
    assert(obj->Target == 0);
 
+   obj->Target = target;
+   obj->TargetIndex = _mesa_tex_target_to_index(ctx, target);
+   assert(obj->TargetIndex < NUM_TEXTURE_TARGETS);
+
    switch (target) {
       case GL_TEXTURE_2D_MULTISAMPLE:
       case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
@@ -1200,7 +1210,6 @@ create_textures(struct gl_context *ctx, GLenum target,
    GLuint first;
    GLint i;
    const char *func = dsa ? "Create" : "Gen";
-   const GLint targetIndex = _mesa_tex_target_to_index(ctx, target);
 
    if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE))
       _mesa_debug(ctx, "gl%sTextures %d\n", func, n);
@@ -1231,11 +1240,6 @@ create_textures(struct gl_context *ctx, GLenum target,
          return;
       }
 
-      /* Initialize the target index if target is non-zero. */
-      if (target != 0) {
-         texObj->TargetIndex = targetIndex;
-      }
-
       /* insert into hash table */
       _mesa_HashInsert(ctx->Shared->TexObjects, texObj->Name, texObj);
 
@@ -1356,8 +1360,12 @@ unbind_texobj_from_texunits(struct gl_context *ctx,
    const gl_texture_index index = texObj->TargetIndex;
    GLuint u;
 
-   if (texObj->Target == 0)
+   if (texObj->Target == 0) {
+      /* texture was never bound */
       return;
+   }
+
+   assert(index < NUM_TEXTURE_TARGETS);
 
    for (u = 0; u < ctx->Texture.NumCurrentTexUsed; u++) {
       struct gl_texture_unit *unit = &ctx->Texture.Unit[u];
@@ -1725,10 +1733,11 @@ _mesa_BindTexture( GLenum target, GLuint texName )
          _mesa_HashInsert(ctx->Shared->TexObjects, texName, newTexObj);
          mtx_unlock(&ctx->Shared->Mutex);
       }
-      newTexObj->Target = target;
-      newTexObj->TargetIndex = targetIndex;
    }
 
+   assert(newTexObj->Target == target);
+   assert(newTexObj->TargetIndex == targetIndex);
+
    bind_texture(ctx, ctx->Texture.CurrentUnit, newTexObj);
 }
 
index 5a3282a40c15d791c346662cf857fbb7f5872a82..04b7d73da5c9ff25db91066b5bede62e5f0638ff 100644 (file)
@@ -681,6 +681,8 @@ _mesa_TextureView(GLuint texture, GLenum target, GLuint origtexture,
    texObj->Immutable = GL_TRUE;
    texObj->ImmutableLevels = origTexObj->ImmutableLevels;
    texObj->Target = target;
+   texObj->TargetIndex = _mesa_tex_target_to_index(ctx, target);
+   assert(texObj->TargetIndex < NUM_TEXTURE_TARGETS);
 
    if (ctx->Driver.TextureView != NULL &&
        !ctx->Driver.TextureView(ctx, texObj, origTexObj)) {