Second and last part of https://gitlab.winehq.org/wine/wine/-/merge_requests/2930.
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/dxgi/swapchain.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 0b8d09d8b96..44504794d95 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -1456,8 +1456,7 @@ static VkResult d3d12_swapchain_record_swapchain_blit(struct d3d12_swapchain *sw return vr; }
-static HRESULT d3d12_swapchain_create_command_buffers(struct d3d12_swapchain *swapchain, - uint32_t queue_family_index) +static HRESULT d3d12_swapchain_create_command_buffers(struct d3d12_swapchain *swapchain) { const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs; VkDevice vk_device = swapchain->vk_device; @@ -1470,7 +1469,7 @@ static HRESULT d3d12_swapchain_create_command_buffers(struct d3d12_swapchain *sw pool_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; pool_info.pNext = NULL; pool_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; - pool_info.queueFamilyIndex = queue_family_index; + pool_info.queueFamilyIndex = vkd3d_get_vk_queue_family_index(swapchain->command_queue);
assert(swapchain->vk_cmd_pool == VK_NULL_HANDLE); if ((vr = vk_funcs->p_vkCreateCommandPool(vk_device, &pool_info, @@ -1558,16 +1557,12 @@ static HRESULT d3d12_swapchain_create_image_resources(struct d3d12_swapchain *sw
static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain) { - ID3D12CommandQueue *queue = swapchain->command_queue; - uint32_t queue_family_index; HRESULT hr;
- queue_family_index = vkd3d_get_vk_queue_family_index(queue); - if (FAILED(hr = d3d12_swapchain_create_user_buffers(swapchain))) return hr;
- if (FAILED(hr = d3d12_swapchain_create_command_buffers(swapchain, queue_family_index))) + if (FAILED(hr = d3d12_swapchain_create_command_buffers(swapchain))) return hr;
return d3d12_swapchain_create_image_resources(swapchain);
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/dxgi/swapchain.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 44504794d95..12bfa49aa05 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -1555,19 +1555,6 @@ static HRESULT d3d12_swapchain_create_image_resources(struct d3d12_swapchain *sw return S_OK; }
-static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain) -{ - HRESULT hr; - - if (FAILED(hr = d3d12_swapchain_create_user_buffers(swapchain))) - return hr; - - if (FAILED(hr = d3d12_swapchain_create_command_buffers(swapchain))) - return hr; - - return d3d12_swapchain_create_image_resources(swapchain); -} - static VkResult d3d12_swapchain_acquire_next_vulkan_image(struct d3d12_swapchain *swapchain) { const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs; @@ -1782,10 +1769,16 @@ static HRESULT d3d12_swapchain_create_resources(struct d3d12_swapchain *swapchai return DXGI_ERROR_INVALID_CALL; }
+ if (FAILED(hr = d3d12_swapchain_create_user_buffers(swapchain))) + return hr; + + if (FAILED(hr = d3d12_swapchain_create_image_resources(swapchain))) + return hr; + if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain))) return hr;
- return d3d12_swapchain_create_buffers(swapchain); + return d3d12_swapchain_create_command_buffers(swapchain); }
static inline struct d3d12_swapchain *d3d12_swapchain_from_IDXGISwapChain4(IDXGISwapChain4 *iface)
From: Giovanni Mascellani gmascellani@codeweavers.com
This is probably a leftover of when Vulkan swapchain images were used directly. --- dlls/dxgi/swapchain.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 12bfa49aa05..9343b149235 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -1604,7 +1604,7 @@ static void d3d12_swapchain_destroy_buffers(struct d3d12_swapchain *swapchain, B
for (i = 0; i < swapchain->desc.BufferCount; ++i) { - if (swapchain->buffers[i] && (destroy_user_buffers || !swapchain->vk_images[0])) + if (swapchain->buffers[i] && destroy_user_buffers) { vkd3d_resource_decref(swapchain->buffers[i]); swapchain->buffers[i] = NULL;
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/dxgi/swapchain.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 9343b149235..480447342e4 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -1271,9 +1271,6 @@ static HRESULT d3d12_swapchain_create_user_buffers(struct d3d12_swapchain *swapc VkResult vr; HRESULT hr;
- if (swapchain->vk_images[0]) - return S_OK; - memset(&image_info, 0, sizeof(image_info)); image_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; image_info.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; @@ -1519,9 +1516,6 @@ static HRESULT d3d12_swapchain_create_image_resources(struct d3d12_swapchain *sw unsigned int i; HRESULT hr;
- if (swapchain->buffers[0]) - return S_OK; - resource_info.type = VKD3D_STRUCTURE_TYPE_IMAGE_RESOURCE_CREATE_INFO; resource_info.next = NULL; resource_info.desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; @@ -1540,6 +1534,9 @@ static HRESULT d3d12_swapchain_create_image_resources(struct d3d12_swapchain *sw
for (i = 0; i < swapchain->desc.BufferCount; ++i) { + assert(swapchain->vk_images[i]); + assert(!swapchain->buffers[i]); + resource_info.vk_image = swapchain->vk_images[i];
if (FAILED(hr = vkd3d_create_image_resource(device, &resource_info, &swapchain->buffers[i]))) @@ -1759,6 +1756,16 @@ static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *s return S_OK; }
+static HRESULT d3d12_swapchain_create_vulkan_resources(struct d3d12_swapchain *swapchain) +{ + HRESULT hr; + + if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain))) + return hr; + + return d3d12_swapchain_create_command_buffers(swapchain); +} + static HRESULT d3d12_swapchain_create_resources(struct d3d12_swapchain *swapchain) { HRESULT hr; @@ -1775,10 +1782,7 @@ static HRESULT d3d12_swapchain_create_resources(struct d3d12_swapchain *swapchai if (FAILED(hr = d3d12_swapchain_create_image_resources(swapchain))) return hr;
- if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain))) - return hr; - - return d3d12_swapchain_create_command_buffers(swapchain); + return d3d12_swapchain_create_vulkan_resources(swapchain); }
static inline struct d3d12_swapchain *d3d12_swapchain_from_IDXGISwapChain4(IDXGISwapChain4 *iface) @@ -1964,7 +1968,7 @@ static HRESULT d3d12_swapchain_set_sync_interval(struct d3d12_swapchain *swapcha
d3d12_swapchain_destroy_buffers(swapchain, FALSE); swapchain->present_mode = present_mode; - return d3d12_swapchain_create_resources(swapchain); + return d3d12_swapchain_create_vulkan_resources(swapchain); }
static VkResult d3d12_swapchain_queue_present(struct d3d12_swapchain *swapchain, VkQueue vk_queue) @@ -2071,7 +2075,7 @@ static HRESULT d3d12_swapchain_present(struct d3d12_swapchain *swapchain, TRACE("Recreating Vulkan swapchain.\n");
d3d12_swapchain_destroy_buffers(swapchain, FALSE); - if (FAILED(hr = d3d12_swapchain_create_resources(swapchain))) + if (FAILED(hr = d3d12_swapchain_create_vulkan_resources(swapchain))) return hr;
if (!(vk_queue = vkd3d_acquire_vk_queue(swapchain->command_queue)))
From: Giovanni Mascellani gmascellani@codeweavers.com
--- dlls/dxgi/swapchain.c | 47 +++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 20 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c index 480447342e4..f760e931bb1 100644 --- a/dlls/dxgi/swapchain.c +++ b/dlls/dxgi/swapchain.c @@ -1579,7 +1579,7 @@ static VkResult d3d12_swapchain_acquire_next_vulkan_image(struct d3d12_swapchain return vr; }
-static void d3d12_swapchain_destroy_buffers(struct d3d12_swapchain *swapchain, BOOL destroy_user_buffers) +static void d3d12_swapchain_destroy_vulkan_resources(struct d3d12_swapchain *swapchain) { const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs; VkQueue vk_queue; @@ -1599,34 +1599,41 @@ static void d3d12_swapchain_destroy_buffers(struct d3d12_swapchain *swapchain, B } }
+ if (swapchain->vk_device) + { + for (i = 0; i < swapchain->buffer_count; ++i) + { + vk_funcs->p_vkDestroySemaphore(swapchain->vk_device, swapchain->vk_semaphores[i], NULL); + swapchain->vk_semaphores[i] = VK_NULL_HANDLE; + } + + vk_funcs->p_vkDestroyCommandPool(swapchain->vk_device, swapchain->vk_cmd_pool, NULL); + swapchain->vk_cmd_pool = VK_NULL_HANDLE; + } +} + +static void d3d12_swapchain_destroy_resources(struct d3d12_swapchain *swapchain) +{ + const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs; + unsigned int i; + + d3d12_swapchain_destroy_vulkan_resources(swapchain); + for (i = 0; i < swapchain->desc.BufferCount; ++i) { - if (swapchain->buffers[i] && destroy_user_buffers) + if (swapchain->buffers[i]) { vkd3d_resource_decref(swapchain->buffers[i]); swapchain->buffers[i] = NULL; } - if (swapchain->vk_device && destroy_user_buffers) + if (swapchain->vk_device) { vk_funcs->p_vkDestroyImage(swapchain->vk_device, swapchain->vk_images[i], NULL); swapchain->vk_images[i] = VK_NULL_HANDLE; - } - }
- if (swapchain->vk_device) - { - for (i = 0; i < swapchain->buffer_count; ++i) - { - vk_funcs->p_vkDestroySemaphore(swapchain->vk_device, swapchain->vk_semaphores[i], NULL); - swapchain->vk_semaphores[i] = VK_NULL_HANDLE; - } - if (destroy_user_buffers) - { vk_funcs->p_vkFreeMemory(swapchain->vk_device, swapchain->vk_memory, NULL); swapchain->vk_memory = VK_NULL_HANDLE; } - vk_funcs->p_vkDestroyCommandPool(swapchain->vk_device, swapchain->vk_cmd_pool, NULL); - swapchain->vk_cmd_pool = VK_NULL_HANDLE; } }
@@ -1831,7 +1838,7 @@ static void d3d12_swapchain_destroy(struct d3d12_swapchain *swapchain) const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs; void *vulkan_module = vk_funcs->vulkan_module;
- d3d12_swapchain_destroy_buffers(swapchain, TRUE); + d3d12_swapchain_destroy_resources(swapchain);
if (swapchain->frame_latency_event) CloseHandle(swapchain->frame_latency_event); @@ -1966,7 +1973,7 @@ static HRESULT d3d12_swapchain_set_sync_interval(struct d3d12_swapchain *swapcha return S_OK; }
- d3d12_swapchain_destroy_buffers(swapchain, FALSE); + d3d12_swapchain_destroy_vulkan_resources(swapchain); swapchain->present_mode = present_mode; return d3d12_swapchain_create_vulkan_resources(swapchain); } @@ -2074,7 +2081,7 @@ static HRESULT d3d12_swapchain_present(struct d3d12_swapchain *swapchain,
TRACE("Recreating Vulkan swapchain.\n");
- d3d12_swapchain_destroy_buffers(swapchain, FALSE); + d3d12_swapchain_destroy_vulkan_resources(swapchain); if (FAILED(hr = d3d12_swapchain_create_vulkan_resources(swapchain))) return hr;
@@ -2352,7 +2359,7 @@ static HRESULT d3d12_swapchain_resize_buffers(struct d3d12_swapchain *swapchain, && desc->Format == new_desc.Format && desc->BufferCount == new_desc.BufferCount) return S_OK;
- d3d12_swapchain_destroy_buffers(swapchain, TRUE); + d3d12_swapchain_destroy_resources(swapchain); swapchain->desc = new_desc; return d3d12_swapchain_create_resources(swapchain); }
This merge request was approved by Zebediah Figura.
This merge request was approved by Jan Sikorski.