diff --git a/.pick_status.json b/.pick_status.json index c3e00f64eed..c2b3452d9a5 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -4084,7 +4084,7 @@ "description": "mesa: fix reuse of deleted sampler object", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "842c91300fd041cf35398d05d2995f16d76870ae", "notes": null diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index fbbb96388ad..ae91cf8ce0f 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -889,6 +889,8 @@ struct gl_sampler_object uint8_t glclamp_mask; /**< mask of GL_CLAMP wraps active */ + bool DeletePending; /**< true if sampler object is removed from the hash */ + /** GL_ARB_bindless_texture */ bool HandleAllocated; struct util_dynarray Handles; diff --git a/src/mesa/main/samplerobj.c b/src/mesa/main/samplerobj.c index afb18f8c574..87bab4a61b8 100644 --- a/src/mesa/main/samplerobj.c +++ b/src/mesa/main/samplerobj.c @@ -265,6 +265,8 @@ delete_samplers(struct gl_context *ctx, GLsizei count, const GLuint *samplers) } } + sampObj->DeletePending = true; + /* The ID is immediately freed for re-use */ _mesa_HashRemoveLocked(&ctx->Shared->SamplerObjects, samplers[i]); /* But the object exists until its reference count goes to zero */ @@ -402,7 +404,8 @@ bind_samplers(struct gl_context *ctx, GLuint first, GLsizei count, struct gl_sampler_object *sampObj; if (samplers[i] != 0) { - if (currentSampler && currentSampler->Name == samplers[i]) + if (currentSampler && !currentSampler->DeletePending && + currentSampler->Name == samplers[i]) sampObj = currentSampler; else sampObj = lookup_samplerobj_locked(ctx, samplers[i]);