From: Giovanni Mascellani gmascellani@codeweavers.com
--- libs/vkd3d/command.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 32439eec7..6e20f7df3 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -6273,7 +6273,7 @@ static void STDMETHODCALLTYPE d3d12_command_queue_ExecuteCommandLists(ID3D12Comm if (!(op = d3d12_command_queue_op_array_require_space(&command_queue->op_queue))) { ERR("Failed to add op.\n"); - return; + goto done; } op->opcode = VKD3D_CS_OP_EXECUTE; op->u.execute.buffers = buffers; @@ -6281,6 +6281,7 @@ static void STDMETHODCALLTYPE d3d12_command_queue_ExecuteCommandLists(ID3D12Comm
d3d12_command_queue_submit_locked(command_queue);
+done: vkd3d_mutex_unlock(&command_queue->op_mutex); return; }
From: Giovanni Mascellani gmascellani@codeweavers.com
--- libs/vkd3d/command.c | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 6e20f7df3..28e658b45 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -6349,6 +6349,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_queue_Signal(ID3D12CommandQueue *
if (!(op = d3d12_command_queue_op_array_require_space(&command_queue->op_queue))) { + ERR("Failed to add op.\n"); hr = E_OUTOFMEMORY; goto done; } @@ -6687,6 +6688,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_queue_Wait(ID3D12CommandQueue *if
if (!(op = d3d12_command_queue_op_array_require_space(&command_queue->op_queue))) { + ERR("Failed to add op.\n"); hr = E_OUTOFMEMORY; goto done; }
From: Giovanni Mascellani gmascellani@codeweavers.com
--- libs/vkd3d/command.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 28e658b45..64a5b7f86 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -6063,8 +6063,31 @@ static ULONG STDMETHODCALLTYPE d3d12_command_queue_AddRef(ID3D12CommandQueue *if return refcount; }
+static void d3d12_command_queue_destroy_op(struct vkd3d_cs_op_data *op) +{ + switch (op->opcode) + { + case VKD3D_CS_OP_WAIT: + d3d12_fence_decref(op->u.wait.fence); + break; + + case VKD3D_CS_OP_SIGNAL: + d3d12_fence_decref(op->u.signal.fence); + break; + + case VKD3D_CS_OP_EXECUTE: + vkd3d_free(op->u.execute.buffers); + break; + } +} + static void d3d12_command_queue_op_array_destroy(struct d3d12_command_queue_op_array *array) { + unsigned int i; + + for (i = 0; i < array->count; ++i) + d3d12_command_queue_destroy_op(&array->ops[i]); + vkd3d_free(array->ops); }
@@ -6214,8 +6237,6 @@ static void d3d12_command_queue_execute(struct d3d12_command_queue *command_queu ERR("Failed to submit queue(s), vr %d.\n", vr);
vkd3d_queue_release(vkd3d_queue); - - vkd3d_free(buffers); }
static void d3d12_command_queue_submit_locked(struct d3d12_command_queue *queue) @@ -6925,12 +6946,10 @@ static HRESULT d3d12_command_queue_flush_ops_locked(struct d3d12_command_queue * return d3d12_command_queue_fixup_after_flush_locked(queue); } d3d12_command_queue_wait_locked(queue, fence, op->u.wait.value); - d3d12_fence_decref(fence); break;
case VKD3D_CS_OP_SIGNAL: d3d12_command_queue_signal(queue, op->u.signal.fence, op->u.signal.value); - d3d12_fence_decref(op->u.signal.fence); break;
case VKD3D_CS_OP_EXECUTE: @@ -6941,6 +6960,8 @@ static HRESULT d3d12_command_queue_flush_ops_locked(struct d3d12_command_queue * vkd3d_unreachable(); }
+ d3d12_command_queue_destroy_op(op); + *flushed_any |= true; }
This merge request was approved by Conor McCarthy.
I'm getting some -Wswitch warnings for VKD3D_CS_OP_UPDATE_MAPPINGS and VKD3D_CS_OP_COPY_MAPPINGS in d3d12_command_queue_destroy_op(), which probably makes sense after 3935e8647f850f856496e8bb226c32f79866b9c3 and 3aa83e877d6737ce045c7f9b47253093850cbb84.