On 10/06/2015 01:00 PM, Ian Romanick wrote: > On 10/05/2015 11:18 AM, Brian Paul 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. >> --- >> src/mesa/main/shared.c | 5 +++++ >> src/mesa/main/texobj.c | 27 ++++++++++++++++++--------- >> src/mesa/main/textureview.c | 2 ++ >> 3 files changed, 25 insertions(+), 9 deletions(-) >> >> 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; >> - } >> - > > I think target is unused in this function now, so it should be removed > as a parameter.
Never mind. It is still passed to NewTextureObject. >> /* 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)) { >> > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev