mesa: fix reuse of deleted buffer object

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 <marek.olsak@amd.com>
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12810
Fixes: 842c91300f ("mesa: enable GL name reuse by default for all drivers except virgl")
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34091>
This commit is contained in:
Timothy Arceri 2025-03-14 13:25:26 +11:00 committed by Marge Bot
parent 5eb1edcf9d
commit 0f0834275d
3 changed files with 10 additions and 6 deletions

View file

@ -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;

View file

@ -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,

View file

@ -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;