[PATCH 5/8] dxgi: Factor out d3d12_swapchain_recreate_vulkan_swapchain().
Józef Kucia
jkucia at codeweavers.com
Fri Mar 1 06:31:28 CST 2019
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/dxgi/swapchain.c | 64 +++++++++++++++++++------------------------
1 file changed, 28 insertions(+), 36 deletions(-)
diff --git a/dlls/dxgi/swapchain.c b/dlls/dxgi/swapchain.c
index f2f89b9f7a84..22feeaeb825f 100644
--- a/dlls/dxgi/swapchain.c
+++ b/dlls/dxgi/swapchain.c
@@ -1411,7 +1411,7 @@ static HRESULT d3d12_swapchain_create_buffers(struct d3d12_swapchain *swapchain,
return S_OK;
}
-static HRESULT d3d12_swapchain_acquire_next_image(struct d3d12_swapchain *swapchain)
+static VkResult d3d12_swapchain_acquire_next_image(struct d3d12_swapchain *swapchain)
{
const struct dxgi_vk_funcs *vk_funcs = &swapchain->vk_funcs;
VkDevice vk_device = swapchain->vk_device;
@@ -1422,21 +1422,18 @@ static HRESULT d3d12_swapchain_acquire_next_image(struct d3d12_swapchain *swapch
VK_NULL_HANDLE, vk_fence, &swapchain->current_buffer_index)) < 0)
{
ERR("Failed to acquire next Vulkan image, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
+ return vr;
}
if ((vr = vk_funcs->p_vkWaitForFences(vk_device, 1, &vk_fence, VK_TRUE, UINT64_MAX)) != VK_SUCCESS)
{
ERR("Failed to wait for fence, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
+ return vr;
}
if ((vr = vk_funcs->p_vkResetFences(vk_device, 1, &vk_fence)) < 0)
- {
ERR("Failed to reset fence, vr %d.\n", vr);
- return hresult_from_vk_result(vr);
- }
- return S_OK;
+ return vr;
}
static void d3d12_swapchain_destroy_buffers(struct d3d12_swapchain *swapchain, BOOL destroy_user_buffers)
@@ -1594,6 +1591,23 @@ static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *s
return d3d12_swapchain_create_buffers(swapchain, vk_swapchain_format, vk_format);
}
+static HRESULT d3d12_swapchain_recreate_vulkan_swapchain(struct d3d12_swapchain *swapchain)
+{
+ VkResult vr;
+ HRESULT hr;
+
+ if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain)))
+ {
+ ERR("Failed to recreate Vulkan swapchain, hr %#x.\n", hr);
+ return hr;
+ }
+
+ if ((vr = d3d12_swapchain_acquire_next_image(swapchain)) < 0)
+ ERR("Failed to acquire Vulkan image after recreating swapchain, vr %d.\n", vr);
+
+ return hresult_from_vk_result(vr);
+}
+
static inline struct d3d12_swapchain *d3d12_swapchain_from_IDXGISwapChain3(IDXGISwapChain3 *iface)
{
return CONTAINING_RECORD(iface, struct d3d12_swapchain, IDXGISwapChain3_iface);
@@ -1811,7 +1825,6 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeBuffers(IDXGISwapChain3 *
DXGI_SWAP_CHAIN_DESC1 *desc, new_desc;
unsigned int i;
ULONG refcount;
- HRESULT hr;
TRACE("iface %p, buffer_count %u, width %u, height %u, format %s, flags %#x.\n",
iface, buffer_count, width, height, debug_dxgi_format(format), flags);
@@ -1864,13 +1877,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeBuffers(IDXGISwapChain3 *
d3d12_swapchain_destroy_buffers(swapchain, TRUE);
swapchain->desc = new_desc;
- if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain)))
- {
- ERR("Failed to recreate Vulkan swapchain, hr %#x.\n", hr);
- return hr;
- }
-
- return d3d12_swapchain_acquire_next_image(swapchain);
+ return d3d12_swapchain_recreate_vulkan_swapchain(swapchain);
}
static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeTarget(IDXGISwapChain3 *iface,
@@ -1971,7 +1978,6 @@ static HRESULT d3d12_swapchain_set_sync_interval(struct d3d12_swapchain *swapcha
unsigned int sync_interval)
{
VkPresentModeKHR present_mode;
- HRESULT hr;
switch (sync_interval)
{
@@ -2011,16 +2017,8 @@ static HRESULT d3d12_swapchain_set_sync_interval(struct d3d12_swapchain *swapcha
}
d3d12_swapchain_destroy_buffers(swapchain, FALSE);
-
swapchain->present_mode = present_mode;
-
- if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain)))
- {
- ERR("Failed to recreate Vulkan swapchain, hr %#x.\n", hr);
- return hr;
- }
-
- return d3d12_swapchain_acquire_next_image(swapchain);
+ return d3d12_swapchain_recreate_vulkan_swapchain(swapchain);
}
static VkResult d3d12_swapchain_queue_present(struct d3d12_swapchain *swapchain, VkQueue vk_queue)
@@ -2116,13 +2114,7 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_Present1(IDXGISwapChain3 *iface
TRACE("Recreating Vulkan swapchain.\n");
d3d12_swapchain_destroy_buffers(swapchain, FALSE);
- if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain)))
- {
- ERR("Failed to recreate Vulkan swapchain, hr %#x.\n", hr);
- return hr;
- }
-
- if (FAILED(hr = d3d12_swapchain_acquire_next_image(swapchain)))
+ if (FAILED(hr = d3d12_swapchain_recreate_vulkan_swapchain(swapchain)))
return hr;
if (!(vk_queue = vkd3d_acquire_vk_queue(swapchain->command_queue)))
@@ -2143,7 +2135,8 @@ static HRESULT STDMETHODCALLTYPE d3d12_swapchain_Present1(IDXGISwapChain3 *iface
return hresult_from_vk_result(vr);
}
- return d3d12_swapchain_acquire_next_image(swapchain);
+ vr = d3d12_swapchain_acquire_next_image(swapchain);
+ return hresult_from_vk_result(vr);
}
static BOOL STDMETHODCALLTYPE d3d12_swapchain_IsTemporaryMonoSupported(IDXGISwapChain3 *iface)
@@ -2575,11 +2568,10 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IWineDXGI
}
swapchain->vk_fence = vk_fence;
- if (FAILED(hr = d3d12_swapchain_acquire_next_image(swapchain)))
+ if ((vr = d3d12_swapchain_acquire_next_image(swapchain)) < 0)
{
- WARN("Failed to acquire Vulkan image, hr %#x.\n", hr);
d3d12_swapchain_destroy(swapchain);
- return hr;
+ return hresult_from_vk_result(vr);
}
IWineDXGIFactory_AddRef(swapchain->factory = factory);
--
2.19.2
More information about the wine-devel
mailing list