mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-23 12:40:29 +01:00
mesa: fix reuse of deleted sampler object
Deleting a sampler object will only cause it to be unbound from the current context. To avoid reusing something that it still bound in another context we need to check the DeletePending flag first. Reviewed-by: Marek Olšák <marek.olsak@amd.com> Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Fixes:842c9130("mesa: enable GL name reuse by default for all drivers except virgl") Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34091> (cherry picked from commit9bb696588d)
This commit is contained in:
parent
d44e9736d1
commit
4a158b971c
3 changed files with 7 additions and 2 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue