Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51416 Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- 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 1deafc2d4c3..cd550062fb7 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -3682,30 +3682,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)); @@ -3713,6 +3707,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. */ @@ -3725,4 +3720,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; }
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/wined3d/cs.c | 4 ++++ 1 file changed, 4 insertions(+)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index cd550062fb7..6a5f0370a6b 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -66,6 +66,8 @@ static void wined3d_command_list_destroy_object(void *object) for (i = 0; i < list->upload_count; ++i) heap_free(list->uploads[i].sysmem);
+ heap_free(list->command_lists); + heap_free(list->uploads); heap_free(list->resources); heap_free(list->data); heap_free(list); @@ -95,6 +97,8 @@ ULONG CDECL wined3d_command_list_decref(struct wined3d_command_list *list) wined3d_command_list_decref(list->command_lists[i]); for (i = 0; i < list->resource_count; ++i) wined3d_resource_decref(list->resources[i]); + for (i = 0; i < list->upload_count; ++i) + wined3d_resource_decref(list->uploads[i].resource);
wined3d_cs_destroy_object(device->cs, wined3d_command_list_destroy_object, list); }
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/wined3d/cs.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/dlls/wined3d/cs.c b/dlls/wined3d/cs.c index 6a5f0370a6b..75e4ad03269 100644 --- a/dlls/wined3d/cs.c +++ b/dlls/wined3d/cs.c @@ -3658,13 +3658,18 @@ void CDECL wined3d_deferred_context_destroy(struct wined3d_device_context *conte
for (i = 0; i < deferred->resource_count; ++i) wined3d_resource_decref(deferred->resources[i]); + heap_free(deferred->resources);
for (i = 0; i < deferred->upload_count; ++i) { wined3d_resource_decref(deferred->uploads[i].resource); heap_free(deferred->uploads[i].sysmem); } - heap_free(deferred->resources); + heap_free(deferred->uploads); + + for (i = 0; i < deferred->command_list_count; ++i) + wined3d_command_list_decref(deferred->command_lists[i]); + heap_free(deferred->command_lists);
wined3d_state_destroy(deferred->c.state); heap_free(deferred->data);
Signed-off-by: Henri Verbeet hverbeet@codeweavers.com
On Wed, 7 Jul 2021 at 18:40, Zebediah Figura zfigura@codeweavers.com wrote:
@@ -3725,4 +3720,14 @@ HRESULT CDECL wined3d_deferred_context_record_command_list(struct wined3d_device +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;
}
The separate labels are somewhat superfluous here. Because "object" is allocated with heap_alloc_zero(), when e.g. the "object->data" allocation were to fail, "object->resources" and "object->uploads" would be NULL, and there should be no issue calling heap_free() on them.