Conor McCarthy : vkd3d: Always destroy created objects on d3d12_fence_init() failure.

Alexandre Julliard julliard at winehq.org
Fri May 13 15:23:14 CDT 2022


Module: vkd3d
Branch: master
Commit: a5c63dc4b977fc99366b2759bf6ae60c14ff5f5c
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=a5c63dc4b977fc99366b2759bf6ae60c14ff5f5c

Author: Conor McCarthy <cmccarthy at codeweavers.com>
Date:   Fri May 13 01:11:05 2022 +1000

vkd3d: Always destroy created objects on d3d12_fence_init() failure.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d/command.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c
index 55e6be58..b187c65b 100644
--- a/libs/vkd3d/command.c
+++ b/libs/vkd3d/command.c
@@ -1247,6 +1247,7 @@ static struct d3d12_fence *unsafe_impl_from_ID3D12Fence(ID3D12Fence *iface)
 static HRESULT d3d12_fence_init(struct d3d12_fence *fence, struct d3d12_device *device,
         UINT64 initial_value, D3D12_FENCE_FLAGS flags)
 {
+    const struct vkd3d_vk_device_procs *vk_procs = &device->vk_procs;
     VkResult vr;
     HRESULT hr;
     int rc;
@@ -1266,8 +1267,8 @@ static HRESULT d3d12_fence_init(struct d3d12_fence *fence, struct d3d12_device *
     if ((rc = vkd3d_cond_init(&fence->null_event_cond)))
     {
         ERR("Failed to initialize cond variable, error %d.\n", rc);
-        vkd3d_mutex_destroy(&fence->mutex);
-        return hresult_from_errno(rc);
+        hr = hresult_from_errno(rc);
+        goto fail_destroy_mutex;
     }
 
     if (flags)
@@ -1282,7 +1283,8 @@ static HRESULT d3d12_fence_init(struct d3d12_fence *fence, struct d3d12_device *
             &fence->timeline_semaphore)) < 0)
     {
         WARN("Failed to create timeline semaphore, vr %d.\n", vr);
-        return hresult_from_vk_result(vr);
+        hr = hresult_from_vk_result(vr);
+        goto fail_destroy_null_cond;
     }
     fence->pending_timeline_value = initial_value;
     fence->gpu_wait_count = 0;
@@ -1295,14 +1297,21 @@ static HRESULT d3d12_fence_init(struct d3d12_fence *fence, struct d3d12_device *
 
     if (FAILED(hr = vkd3d_private_store_init(&fence->private_store)))
     {
-        vkd3d_mutex_destroy(&fence->mutex);
-        vkd3d_cond_destroy(&fence->null_event_cond);
-        return hr;
+        goto fail_destroy_timeline_semaphore;
     }
 
     d3d12_device_add_ref(fence->device = device);
 
     return S_OK;
+
+fail_destroy_timeline_semaphore:
+    VK_CALL(vkDestroySemaphore(device->vk_device, fence->timeline_semaphore, NULL));
+fail_destroy_null_cond:
+    vkd3d_cond_destroy(&fence->null_event_cond);
+fail_destroy_mutex:
+    vkd3d_mutex_destroy(&fence->mutex);
+
+    return hr;
 }
 
 HRESULT d3d12_fence_create(struct d3d12_device *device,




More information about the wine-cvs mailing list