diff --git a/src/mesa/glapi/glapi/gen/gl_API.xml b/src/mesa/glapi/glapi/gen/gl_API.xml
index aa5ddda68a0..533c5205fa5 100644
--- a/src/mesa/glapi/glapi/gen/gl_API.xml
+++ b/src/mesa/glapi/glapi/gen/gl_API.xml
@@ -11097,6 +11097,11 @@
+
+
+
+
+
diff --git a/src/mesa/glapi/glapi/gen/static_data.py b/src/mesa/glapi/glapi/gen/static_data.py
index 1693e8f348e..74ac2405c52 100644
--- a/src/mesa/glapi/glapi/gen/static_data.py
+++ b/src/mesa/glapi/glapi/gen/static_data.py
@@ -1612,6 +1612,7 @@ all_functions = [
"DrawArraysInstancedBaseInstanceDrawID",
"DrawElementsInstancedBaseVertexBaseInstanceDrawID",
"InternalInvalidateFramebufferAncillaryMESA",
+ "InternalReleaseBufferMESA",
"DrawElementsPacked",
"DrawElementsUserBufPacked",
"TexStorageAttribs2DEXT",
diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c
index 86d00a242cd..e7aadacaf10 100644
--- a/src/mesa/main/glthread.c
+++ b/src/mesa/main/glthread.c
@@ -284,7 +284,7 @@ _mesa_glthread_destroy(struct gl_context *ctx)
util_queue_fence_destroy(&glthread->batches[i].fence);
_mesa_DeinitHashTable(&glthread->VAOs, free_vao, NULL);
- _mesa_glthread_release_upload_buffer(ctx);
+ _mesa_glthread_release_upload_buffer(ctx, false);
}
}
diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h
index 39594b368e7..1447d686ce1 100644
--- a/src/mesa/main/glthread.h
+++ b/src/mesa/main/glthread.h
@@ -331,7 +331,7 @@ void _mesa_glthread_flush_batch(struct gl_context *ctx);
void _mesa_glthread_finish(struct gl_context *ctx);
void _mesa_glthread_finish_before(struct gl_context *ctx, const char *func);
bool _mesa_glthread_invalidate_zsbuf(struct gl_context *ctx);
-void _mesa_glthread_release_upload_buffer(struct gl_context *ctx);
+void _mesa_glthread_release_upload_buffer(struct gl_context *ctx, bool async_release);
void _mesa_glthread_upload(struct gl_context *ctx, const void *data,
GLsizeiptr size, unsigned *out_offset,
struct gl_buffer_object **out_buffer,
@@ -405,6 +405,8 @@ void _mesa_glthread_unbind_uploaded_vbos(struct gl_context *ctx);
void _mesa_glthread_PixelStorei(struct gl_context *ctx, GLenum pname,
GLint param);
+void _mesa_InternalReleaseBufferMESA(void *buffer);
+
#ifdef __cplusplus
}
#endif
diff --git a/src/mesa/main/glthread_bufferobj.c b/src/mesa/main/glthread_bufferobj.c
index 7d4b15cb216..66499a9c90f 100644
--- a/src/mesa/main/glthread_bufferobj.c
+++ b/src/mesa/main/glthread_bufferobj.c
@@ -64,8 +64,15 @@ new_upload_buffer(struct gl_context *ctx, GLsizeiptr size, uint8_t **ptr)
return obj;
}
+void _mesa_InternalReleaseBufferMESA(void *buffer)
+{
+ GET_CURRENT_CONTEXT(ctx);
+ struct gl_buffer_object *buf = buffer;
+ _mesa_reference_buffer_object(ctx, &buf, NULL);
+}
+
void
-_mesa_glthread_release_upload_buffer(struct gl_context *ctx)
+_mesa_glthread_release_upload_buffer(struct gl_context *ctx, bool async_release)
{
struct glthread_state *glthread = &ctx->GLThread;
@@ -79,7 +86,14 @@ _mesa_glthread_release_upload_buffer(struct gl_context *ctx)
p_atomic_add(&glthread->upload_buffer->RefCount,
-(PRIVATE_REFCOUNT - glthread->upload_buffer->CtxRefCount));
}
- _mesa_reference_buffer_object(ctx, &glthread->upload_buffer, NULL);
+
+ if (async_release) {
+ /* Defer to avoid calling tc_resource_release from this thread. */
+ _mesa_marshal_InternalReleaseBufferMESA(glthread->upload_buffer);
+ glthread->upload_buffer = NULL;
+ } else {
+ _mesa_reference_buffer_object(ctx, &glthread->upload_buffer, NULL);
+ }
}
void
@@ -120,7 +134,7 @@ _mesa_glthread_upload(struct gl_context *ctx, const void *data,
return;
}
- _mesa_glthread_release_upload_buffer(ctx);
+ _mesa_glthread_release_upload_buffer(ctx, true);
glthread->upload_buffer =
new_upload_buffer(ctx, default_size, &glthread->upload_ptr);