mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-02 01:28:07 +02:00
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:
parent
5eb1edcf9d
commit
0f0834275d
3 changed files with 10 additions and 6 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue