From 3f60840cdcdb601ff4c7c05865eafe506a3d7944 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Wed, 7 Jul 2021 11:40:05 -0500 Subject: [PATCH] wined3d: Move the uploads array in wined3d_deferred_context_record_command_list(). Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51416 Signed-off-by: Zebediah Figura Signed-off-by: Henri Verbeet Signed-off-by: Alexandre Julliard --- dlls/wined3d/cs.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index f7e5009df46..089946cd83d 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -3698,30 +3698,24 @@ HRESULT CDECL wined3d_deferred_context_record_command_list(struct wined3d_device object->device = deferred->c.device; if (!(object->data = heap_alloc(deferred->data_size))) - { - heap_free(object); - return E_OUTOFMEMORY; - } + goto out_free_list; object->data_size = deferred->data_size; memcpy(object->data, deferred->data, deferred->data_size); if (!(object->resources = heap_alloc(deferred->resource_count * sizeof(*object->resources)))) - { - heap_free(object->data); - heap_free(object); - return E_OUTOFMEMORY; - } + goto out_free_data; object->resource_count = deferred->resource_count; memcpy(object->resources, deferred->resources, deferred->resource_count * sizeof(*object->resources)); /* Transfer our references to the resources to the command list. */ + if (!(object->uploads = heap_alloc(deferred->upload_count * sizeof(*object->uploads)))) + goto out_free_resources; + object->upload_count = deferred->upload_count; + memcpy(object->uploads, deferred->uploads, deferred->upload_count * sizeof(*object->uploads)); + /* Transfer our references to the resources to the command list. */ + if (!(object->command_lists = heap_alloc(deferred->command_list_count * sizeof(*object->command_lists)))) - { - heap_free(object->resources); - heap_free(object->data); - heap_free(object); - return E_OUTOFMEMORY; - } + goto out_free_uploads; object->command_list_count = deferred->command_list_count; memcpy(object->command_lists, deferred->command_lists, deferred->command_list_count * sizeof(*object->command_lists)); @@ -3729,6 +3723,7 @@ HRESULT CDECL wined3d_deferred_context_record_command_list(struct wined3d_device deferred->data_size = 0; deferred->resource_count = 0; + deferred->upload_count = 0; deferred->command_list_count = 0; /* This is in fact recorded into a subsequent command list. */ @@ -3741,4 +3736,14 @@ HRESULT CDECL wined3d_deferred_context_record_command_list(struct wined3d_device *list = object; return S_OK; + +out_free_uploads: + heap_free(object->uploads); +out_free_resources: + heap_free(object->resources); +out_free_data: + heap_free(object->data); +out_free_list: + heap_free(object); + return E_OUTOFMEMORY; }