Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/HansKristian-Work/vkd3d-proton.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2022-10-18 13:17:03 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2022-11-11 18:46:44 +0300
commit4c3938591c46225f95c6a94dc9403cdcabcfb278 (patch)
tree040218ba5fd14b61fd360574a3583eda10f99c4b
parente1916d542b1e854ca09b167b65cdfa0d412f2bfb (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.h1
-rw-r--r--libs/vkd3d/command.c12
-rw-r--r--libs/vkd3d/device.c1
-rw-r--r--libs/vkd3d/swapchain_new.c1
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))