Module: wine Branch: master Commit: b21f3c930eac9c8f5ff8fcb9383d4bec99e9ac6a URL: http://source.winehq.org/git/wine.git/?a=commit;h=b21f3c930eac9c8f5ff8fcb938...
Author: Henri Verbeet hverbeet@codeweavers.com Date: Fri Jul 8 10:59:04 2016 +0200
wined3d: Send buffer destruction through the command stream.
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/wined3d/buffer.c | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index 8adc2a1..a15613d 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -556,28 +556,35 @@ static void wined3d_buffer_drop_bo(struct wined3d_buffer *buffer) device_invalidate_state(device, STATE_STREAMSRC); }
+static void wined3d_buffer_destroy_object(void *object) +{ + struct wined3d_buffer *buffer = object; + struct wined3d_context *context; + + if (buffer->buffer_object) + { + context = context_acquire(buffer->resource.device, NULL); + delete_gl_buffer(buffer, context->gl_info); + context_release(context); + + HeapFree(GetProcessHeap(), 0, buffer->conversion_map); + } + + HeapFree(GetProcessHeap(), 0, buffer->maps); + HeapFree(GetProcessHeap(), 0, buffer); +} + ULONG CDECL wined3d_buffer_decref(struct wined3d_buffer *buffer) { ULONG refcount = InterlockedDecrement(&buffer->resource.ref); - struct wined3d_context *context;
TRACE("%p decreasing refcount to %u.\n", buffer, refcount);
if (!refcount) { - if (buffer->buffer_object) - { - context = context_acquire(buffer->resource.device, NULL); - delete_gl_buffer(buffer, context->gl_info); - context_release(context); - - HeapFree(GetProcessHeap(), 0, buffer->conversion_map); - } - - resource_cleanup(&buffer->resource); buffer->resource.parent_ops->wined3d_object_destroyed(buffer->resource.parent); - HeapFree(GetProcessHeap(), 0, buffer->maps); - HeapFree(GetProcessHeap(), 0, buffer); + resource_cleanup(&buffer->resource); + wined3d_cs_emit_destroy_object(buffer->resource.device->cs, wined3d_buffer_destroy_object, buffer); }
return refcount;