diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2022-10-18 13:17:03 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2022-11-11 18:46:44 +0300 |
commit | 4c3938591c46225f95c6a94dc9403cdcabcfb278 (patch) | |
tree | 040218ba5fd14b61fd360574a3583eda10f99c4b | |
parent | e1916d542b1e854ca09b167b65cdfa0d412f2bfb (diff) |
vkd3d: Conditionally expose new swapchain implementation.
It is still very experimental, and it's useful to toggle between them
for A/B testing.
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
-rw-r--r-- | include/vkd3d.h | 1 | ||||
-rw-r--r-- | libs/vkd3d/command.c | 12 | ||||
-rw-r--r-- | libs/vkd3d/device.c | 1 | ||||
-rw-r--r-- | libs/vkd3d/swapchain_new.c | 1 |
4 files changed, 14 insertions, 1 deletions
diff --git a/include/vkd3d.h b/include/vkd3d.h index 0445d9b9..3583a04c 100644 --- a/include/vkd3d.h +++ b/include/vkd3d.h @@ -94,6 +94,7 @@ extern "C" { #define VKD3D_CONFIG_FLAG_USE_HOST_IMPORT_FALLBACK (1ull << 32) #define VKD3D_CONFIG_FLAG_PREALLOCATE_SRV_MIP_CLAMPS (1ull << 33) #define VKD3D_CONFIG_FLAG_FORCE_INITIAL_TRANSITION (1ull << 34) +#define VKD3D_CONFIG_FLAG_SWAPCHAIN_EXPERIMENTAL (1ull << 35) typedef HRESULT (*PFN_vkd3d_signal_event)(HANDLE event); diff --git a/libs/vkd3d/command.c b/libs/vkd3d/command.c index 69ea37e5..8163adb0 100644 --- a/libs/vkd3d/command.c +++ b/libs/vkd3d/command.c @@ -11414,13 +11414,21 @@ static HRESULT STDMETHODCALLTYPE d3d12_command_queue_QueryInterface(ID3D12Comman } #ifdef VKD3D_BUILD_STANDALONE_D3D12 - if (IsEqualGUID(riid, &IID_IWineDXGISwapChainFactory)) + if (!(vkd3d_config_flags & VKD3D_CONFIG_FLAG_SWAPCHAIN_EXPERIMENTAL) && IsEqualGUID(riid, &IID_IWineDXGISwapChainFactory)) { struct d3d12_command_queue *command_queue = impl_from_ID3D12CommandQueue(iface); IWineDXGISwapChainFactory_AddRef(&command_queue->swapchain_factory.IWineDXGISwapChainFactory_iface); *object = &command_queue->swapchain_factory; return S_OK; } + else if ((vkd3d_config_flags & VKD3D_CONFIG_FLAG_SWAPCHAIN_EXPERIMENTAL) && IsEqualGUID(riid, &IID_IDXGIVkSwapChainFactory)) + { + struct d3d12_command_queue *command_queue = impl_from_ID3D12CommandQueue(iface); + IDXGIVkSwapChainFactory_AddRef(&command_queue->vk_swap_chain_factory.IDXGIVkSwapChainFactory_iface); + *object = &command_queue->vk_swap_chain_factory; + INFO("Exposing experimental swapchain interface.\n"); + return S_OK; + } #endif WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid)); @@ -13146,6 +13154,8 @@ static HRESULT d3d12_command_queue_init(struct d3d12_command_queue *queue, #ifdef VKD3D_BUILD_STANDALONE_D3D12 if (FAILED(hr = d3d12_swapchain_factory_init(queue, &queue->swapchain_factory))) goto fail_swapchain_factory; + if (FAILED(hr = dxgi_vk_swap_chain_factory_init(queue, &queue->vk_swap_chain_factory))) + goto fail_swapchain_factory; #endif d3d12_device_add_ref(queue->device = device); diff --git a/libs/vkd3d/device.c b/libs/vkd3d/device.c index 7c05eb1a..220237d2 100644 --- a/libs/vkd3d/device.c +++ b/libs/vkd3d/device.c @@ -726,6 +726,7 @@ static const struct vkd3d_debug_option vkd3d_config_options[] = {"host_import_fallback", VKD3D_CONFIG_FLAG_USE_HOST_IMPORT_FALLBACK}, {"preallocate_srv_mip_clamps", VKD3D_CONFIG_FLAG_PREALLOCATE_SRV_MIP_CLAMPS}, {"force_initial_transition", VKD3D_CONFIG_FLAG_FORCE_INITIAL_TRANSITION}, + {"swapchain_experimental", VKD3D_CONFIG_FLAG_SWAPCHAIN_EXPERIMENTAL}, }; static void vkd3d_config_flags_init_once(void) diff --git a/libs/vkd3d/swapchain_new.c b/libs/vkd3d/swapchain_new.c index 3975661f..a428742d 100644 --- a/libs/vkd3d/swapchain_new.c +++ b/libs/vkd3d/swapchain_new.c @@ -630,6 +630,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_vk_swap_chain_Present(IDXGIVkSwapChain *if /* Need to process this task in queue thread to deal with wait-before-signal. * All interesting works happens in the callback. */ + chain->user.blit_count += 1; d3d12_command_queue_enqueue_callback(chain->queue, dxgi_vk_swap_chain_present_callback, chain); if (!(chain->desc.Flags & DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT)) |