vkd3d: Get rid of redundant recreate swapchain call.
It just called create_vulkan_swapchain anyways. Also, add in extra parameter to support temporary user buffer fallbacks. Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
This commit is contained in:
parent
ac211d5f6a
commit
2e16a777ca
|
@ -1400,7 +1400,7 @@ static bool d3d12_swapchain_has_nonzero_surface_size(struct d3d12_swapchain *swa
|
||||||
return surface_caps.maxImageExtent.width != 0 && surface_caps.maxImageExtent.height != 0;
|
return surface_caps.maxImageExtent.width != 0 && surface_caps.maxImageExtent.height != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *swapchain)
|
static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *swapchain, bool force_surface_lost)
|
||||||
{
|
{
|
||||||
VkPhysicalDevice vk_physical_device = d3d12_swapchain_device(swapchain)->vk_physical_device;
|
VkPhysicalDevice vk_physical_device = d3d12_swapchain_device(swapchain)->vk_physical_device;
|
||||||
const struct vkd3d_vk_device_procs *vk_procs = d3d12_swapchain_procs(swapchain);
|
const struct vkd3d_vk_device_procs *vk_procs = d3d12_swapchain_procs(swapchain);
|
||||||
|
@ -1427,8 +1427,19 @@ static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *s
|
||||||
swapchain->vk_surface, &swapchain->desc, &vk_swapchain_format)))
|
swapchain->vk_surface, &swapchain->desc, &vk_swapchain_format)))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
vr = VK_CALL(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vk_physical_device,
|
if (force_surface_lost)
|
||||||
swapchain->vk_surface, &surface_caps));
|
{
|
||||||
|
/* If we cannot successfully present after 2 attempts, we must assume the swapchain
|
||||||
|
* is in an unstable state with many resizes happening async. Until things stabilize,
|
||||||
|
* force a dummy swapchain for now so that we can make forward progress.
|
||||||
|
* When we don't have a proper swapchain, we will attempt again next present. */
|
||||||
|
vr = VK_ERROR_SURFACE_LOST_KHR;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vr = VK_CALL(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(vk_physical_device,
|
||||||
|
swapchain->vk_surface, &surface_caps));
|
||||||
|
}
|
||||||
|
|
||||||
if (vr == VK_ERROR_SURFACE_LOST_KHR)
|
if (vr == VK_ERROR_SURFACE_LOST_KHR)
|
||||||
{
|
{
|
||||||
|
@ -1589,16 +1600,6 @@ static HRESULT d3d12_swapchain_create_vulkan_swapchain(struct d3d12_swapchain *s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT d3d12_swapchain_recreate_vulkan_swapchain(struct d3d12_swapchain *swapchain)
|
|
||||||
{
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain)))
|
|
||||||
ERR("Failed to recreate Vulkan swapchain, hr %#x.\n", hr);
|
|
||||||
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline struct d3d12_swapchain *d3d12_swapchain_from_IDXGISwapChain(dxgi_swapchain_iface *iface)
|
static inline struct d3d12_swapchain *d3d12_swapchain_from_IDXGISwapChain(dxgi_swapchain_iface *iface)
|
||||||
{
|
{
|
||||||
return CONTAINING_RECORD(iface, struct d3d12_swapchain, IDXGISwapChain_iface);
|
return CONTAINING_RECORD(iface, struct d3d12_swapchain, IDXGISwapChain_iface);
|
||||||
|
@ -1778,7 +1779,7 @@ static HRESULT d3d12_swapchain_set_sync_interval(struct d3d12_swapchain *swapcha
|
||||||
|
|
||||||
d3d12_swapchain_destroy_resources(swapchain, false);
|
d3d12_swapchain_destroy_resources(swapchain, false);
|
||||||
swapchain->present_mode = present_mode;
|
swapchain->present_mode = present_mode;
|
||||||
return d3d12_swapchain_recreate_vulkan_swapchain(swapchain);
|
return d3d12_swapchain_create_vulkan_swapchain(swapchain, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VkResult d3d12_swapchain_queue_present(struct d3d12_swapchain *swapchain, VkQueue vk_queue)
|
static VkResult d3d12_swapchain_queue_present(struct d3d12_swapchain *swapchain, VkQueue vk_queue)
|
||||||
|
@ -1983,7 +1984,7 @@ static HRESULT d3d12_swapchain_present(struct d3d12_swapchain *swapchain,
|
||||||
|
|
||||||
d3d12_swapchain_destroy_resources(swapchain, false);
|
d3d12_swapchain_destroy_resources(swapchain, false);
|
||||||
|
|
||||||
if (FAILED(hr = d3d12_swapchain_recreate_vulkan_swapchain(swapchain)))
|
if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain, false)))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if (!(vk_queue = vkd3d_acquire_vk_queue(d3d12_swapchain_queue_iface(swapchain))))
|
if (!(vk_queue = vkd3d_acquire_vk_queue(d3d12_swapchain_queue_iface(swapchain))))
|
||||||
|
@ -2275,7 +2276,7 @@ static HRESULT d3d12_swapchain_resize_buffers(struct d3d12_swapchain *swapchain,
|
||||||
|
|
||||||
d3d12_swapchain_destroy_resources(swapchain, true);
|
d3d12_swapchain_destroy_resources(swapchain, true);
|
||||||
swapchain->desc = new_desc;
|
swapchain->desc = new_desc;
|
||||||
return d3d12_swapchain_recreate_vulkan_swapchain(swapchain);
|
return d3d12_swapchain_create_vulkan_swapchain(swapchain, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeBuffers(dxgi_swapchain_iface *iface,
|
static HRESULT STDMETHODCALLTYPE d3d12_swapchain_ResizeBuffers(dxgi_swapchain_iface *iface,
|
||||||
|
@ -2856,7 +2857,7 @@ static HRESULT d3d12_swapchain_init(struct d3d12_swapchain *swapchain, IDXGIFact
|
||||||
ID3D12CommandQueue_AddRef(&queue->ID3D12CommandQueue_iface);
|
ID3D12CommandQueue_AddRef(&queue->ID3D12CommandQueue_iface);
|
||||||
d3d12_device_add_ref(queue->device);
|
d3d12_device_add_ref(queue->device);
|
||||||
|
|
||||||
if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain)))
|
if (FAILED(hr = d3d12_swapchain_create_vulkan_swapchain(swapchain, false)))
|
||||||
{
|
{
|
||||||
d3d12_swapchain_destroy(swapchain);
|
d3d12_swapchain_destroy(swapchain);
|
||||||
return hr;
|
return hr;
|
||||||
|
|
Loading…
Reference in New Issue