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