diff --git a/.pick_status.json b/.pick_status.json index b3834bb4429..f250990628e 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1957,7 +1957,7 @@ "description": "glthread: fix an upload buffer leak", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "befbd54864d2959b83e3d2d46d0825f19cb4fc46" }, diff --git a/src/mesa/main/glthread.c b/src/mesa/main/glthread.c index edda1a54b34..22bb3924125 100644 --- a/src/mesa/main/glthread.c +++ b/src/mesa/main/glthread.c @@ -186,6 +186,7 @@ _mesa_glthread_destroy(struct gl_context *ctx, const char *reason) _mesa_HashDeleteAll(glthread->VAOs, free_vao, NULL); _mesa_DeleteHashTable(glthread->VAOs); + _mesa_glthread_release_upload_buffer(ctx); ctx->GLThread.enabled = false; ctx->CurrentClientDispatch = ctx->CurrentServerDispatch; diff --git a/src/mesa/main/glthread.h b/src/mesa/main/glthread.h index 001be6a7544..e37ec080365 100644 --- a/src/mesa/main/glthread.h +++ b/src/mesa/main/glthread.h @@ -275,6 +275,7 @@ void _mesa_glthread_init_dispatch7(struct gl_context *ctx, 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); +void _mesa_glthread_release_upload_buffer(struct gl_context *ctx); void _mesa_glthread_upload(struct gl_context *ctx, const void *data, GLsizeiptr size, unsigned *out_offset, struct gl_buffer_object **out_buffer, diff --git a/src/mesa/main/glthread_bufferobj.c b/src/mesa/main/glthread_bufferobj.c index aa64d0596a2..4af0ebb6acf 100644 --- a/src/mesa/main/glthread_bufferobj.c +++ b/src/mesa/main/glthread_bufferobj.c @@ -62,6 +62,19 @@ new_upload_buffer(struct gl_context *ctx, GLsizeiptr size, uint8_t **ptr) return obj; } +void +_mesa_glthread_release_upload_buffer(struct gl_context *ctx) +{ + struct glthread_state *glthread = &ctx->GLThread; + + if (glthread->upload_buffer_private_refcount > 0) { + p_atomic_add(&glthread->upload_buffer->RefCount, + -glthread->upload_buffer_private_refcount); + glthread->upload_buffer_private_refcount = 0; + } + _mesa_reference_buffer_object(ctx, &glthread->upload_buffer, NULL); +} + void _mesa_glthread_upload(struct gl_context *ctx, const void *data, GLsizeiptr size, unsigned *out_offset, @@ -100,12 +113,8 @@ _mesa_glthread_upload(struct gl_context *ctx, const void *data, return; } - if (glthread->upload_buffer_private_refcount > 0) { - p_atomic_add(&glthread->upload_buffer->RefCount, - -glthread->upload_buffer_private_refcount); - glthread->upload_buffer_private_refcount = 0; - } - _mesa_reference_buffer_object(ctx, &glthread->upload_buffer, NULL); + _mesa_glthread_release_upload_buffer(ctx); + glthread->upload_buffer = new_upload_buffer(ctx, default_size, &glthread->upload_ptr); glthread->upload_offset = 0;