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:
committed by
Marge Bot
parent
5eb1edcf9d
commit
0f0834275d
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user