On Thu, Oct 8, 2015 at 7:20 AM, Brian Paul <bri...@vmware.com> wrote: > 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. > --- > src/mesa/drivers/common/meta_copy_image.c | 5 ++++- > src/mesa/main/shared.c | 5 +++++ > src/mesa/main/texobj.c | 27 ++++++++++++++++++--------- > src/mesa/main/textureview.c | 2 ++ > 4 files changed, 29 insertions(+), 10 deletions(-) > > diff --git a/src/mesa/drivers/common/meta_copy_image.c > b/src/mesa/drivers/common/meta_copy_image.c > index 33490ee..04b9caf 100644 > --- a/src/mesa/drivers/common/meta_copy_image.c > +++ b/src/mesa/drivers/common/meta_copy_image.c > @@ -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)) { > diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c > index 1acaf59..c37b31d 100644 > --- a/src/mesa/main/shared.c > +++ b/src/mesa/main/shared.c > @@ -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 */ > diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c > index 66eacf8..60c55ae 100644 > --- a/src/mesa/main/texobj.c > +++ b/src/mesa/main/texobj.c > @@ -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); > } > > diff --git a/src/mesa/main/textureview.c b/src/mesa/main/textureview.c > index 5a3282a..04b7d73 100644 > --- a/src/mesa/main/textureview.c > +++ b/src/mesa/main/textureview.c > @@ -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)) { > -- > 1.9.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Reviewed-by: Anuj Phogat <anuj.pho...@gmail.com> _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev