From 0f0834275df223a5eb72289148e693043597e455 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Fri, 14 Mar 2025 13:25:26 +1100 Subject: [PATCH] mesa: fix reuse of deleted buffer object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deleting a buffer 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 Reviewed-by: Pierre-Eric Pelloux-Prayer Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12810 Fixes: 842c91300fd0 ("mesa: enable GL name reuse by default for all drivers except virgl") Part-of: --- src/mesa/main/bufferobj.c | 7 +++---- src/mesa/main/bufferobj.h | 5 +++++ src/mesa/main/varray.c | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index 534a96859c7..d4081fb16d4 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -1347,8 +1347,7 @@ bind_buffer_object(struct gl_context *ctx, /* Get pointer to old buffer object (to be unbound) */ oldBufObj = *bindTarget; - GLuint old_name = oldBufObj && !oldBufObj->DeletePending ? oldBufObj->Name : 0; - if (unlikely(old_name == buffer)) + if (unlikely(_mesa_is_same_buffer_object(oldBufObj, buffer))) return; /* rebinding the same buffer object- no change */ newBufObj = _mesa_lookup_bufferobj(ctx, buffer); @@ -1588,7 +1587,7 @@ set_buffer_multi_binding(struct gl_context *ctx, { struct gl_buffer_object *bufObj; - if (binding->BufferObject && binding->BufferObject->Name == buffers[idx]) + if (_mesa_is_same_buffer_object(binding->BufferObject, buffers[idx])) bufObj = binding->BufferObject; else { bool error; @@ -4698,7 +4697,7 @@ bind_xfb_buffers(struct gl_context *ctx, size = sizes[i]; } - if (boundBufObj && boundBufObj->Name == buffers[i]) + if (_mesa_is_same_buffer_object(boundBufObj, buffers[i])) bufObj = boundBufObj; else { bool error; diff --git a/src/mesa/main/bufferobj.h b/src/mesa/main/bufferobj.h index 0b4c8f80a85..f89bf1be25f 100644 --- a/src/mesa/main/bufferobj.h +++ b/src/mesa/main/bufferobj.h @@ -239,6 +239,11 @@ _mesa_reference_buffer_object_shared(struct gl_context *ctx, _mesa_reference_buffer_object_(ctx, ptr, bufObj, true); } +static inline bool +_mesa_is_same_buffer_object(struct gl_buffer_object *buf, GLuint name) { + return buf && !buf->DeletePending && buf->Name == name; +} + extern void _mesa_buffer_data(struct gl_context *ctx, struct gl_buffer_object *bufObj, GLenum target, GLsizeiptr size, const GLvoid *data, diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c index 9b883e30785..8bf277937dc 100644 --- a/src/mesa/main/varray.c +++ b/src/mesa/main/varray.c @@ -3198,7 +3198,7 @@ vertex_array_vertex_buffer(struct gl_context *ctx, struct gl_buffer_object *current_buf = vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj; - if (current_buf && buffer == current_buf->Name) { + if (_mesa_is_same_buffer_object(current_buf, buffer)) { vbo = current_buf; } else if (buffer != 0) { vbo = _mesa_lookup_bufferobj(ctx, buffer); @@ -3459,7 +3459,7 @@ vertex_array_vertex_buffers(struct gl_context *ctx, if (buffers[i] == 0) vbo = NULL; - else if (binding->BufferObj && binding->BufferObj->Name == buffers[i]) + else if (_mesa_is_same_buffer_object(binding->BufferObj, buffers[i])) vbo = binding->BufferObj; else { bool error;