From b7e21f9d2a6e3fbb190d1ae156141ef4d4b1c087 Mon Sep 17 00:00:00 2001 From: Hans-Kristian Arntzen Date: Fri, 28 Oct 2022 17:32:10 +0200 Subject: idl: Update swapchain implementation to IDXGIVkSurfaceFactory. Signed-off-by: Hans-Kristian Arntzen --- include/vkd3d_swapchain_factory.idl | 15 ++++++++++++++- include/vkd3d_vk_includes.h | 4 ++++ libs/vkd3d/swapchain_new.c | 27 +++++++-------------------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/include/vkd3d_swapchain_factory.idl b/include/vkd3d_swapchain_factory.idl index f8da1c98..c3f755cf 100644 --- a/include/vkd3d_swapchain_factory.idl +++ b/include/vkd3d_swapchain_factory.idl @@ -20,6 +20,7 @@ import "vkd3d_windows.h"; import "vkd3d_dxgibase.idl"; import "vkd3d_dxgi1_5.idl"; +import "vkd3d_vk_includes.h"; [ object, @@ -47,6 +48,18 @@ typedef struct DXGI_VK_HDR_METADATA }; } DXGI_VK_HDR_METADATA; +[ + object, + local, + uuid(1e7895a1-1bc3-4f9c-a670-290a4bc9581a) +] +interface IDXGIVkSurfaceFactory : IUnknown { + VkResult CreateSurface( + VkInstance instance, + VkPhysicalDevice adapter, + VkSurfaceKHR *pSurface); +}; + [ object, local, @@ -112,7 +125,7 @@ interface IDXGIVkSwapChain : IUnknown { ] interface IDXGIVkSwapChainFactory : IUnknown { HRESULT CreateSwapChain( - HWND hWnd, + IDXGIVkSurfaceFactory* pSurfaceFactory, const DXGI_SWAP_CHAIN_DESC1* pDesc, IDXGIVkSwapChain** ppSwapChain); } diff --git a/include/vkd3d_vk_includes.h b/include/vkd3d_vk_includes.h index e16169a0..f0cf81c1 100644 --- a/include/vkd3d_vk_includes.h +++ b/include/vkd3d_vk_includes.h @@ -21,9 +21,11 @@ #if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__) ) || defined(_M_X64) || defined(__ia64) || defined (_M_IA64) || defined(__aarch64__) || defined(__powerpc64__) typedef struct VkCuFunctionNVX_T *VkCuFunctionNVX; typedef struct VkCuModuleNVX_T *VkCuModuleNVX; + typedef struct VkSurfaceKHR_T *VkSurfaceKHR; #else typedef UINT64 VkCuFunctionNVX; typedef UINT64 VkCuModuleNVX; + typedef UINT64 VkSurfaceKHR; #endif typedef struct VkPhysicalDevice_T *VkPhysicalDevice; @@ -31,6 +33,8 @@ typedef struct VkCommandBuffer_T *VkCommandBuffer; typedef struct VkInstance_T *VkInstance; typedef struct VkDevice_T *VkDevice; +typedef enum VkResult VkResult; + typedef enum D3D12_VK_EXTENSION { D3D12_VK_NVX_BINARY_IMPORT = 0x1, diff --git a/libs/vkd3d/swapchain_new.c b/libs/vkd3d/swapchain_new.c index 4604f464..50b7f6ba 100644 --- a/libs/vkd3d/swapchain_new.c +++ b/libs/vkd3d/swapchain_new.c @@ -763,12 +763,9 @@ static CONST_VTBL struct IDXGIVkSwapChainVtbl dxgi_vk_swap_chain_vtbl = dxgi_vk_swap_chain_SetHDRMetaData, }; -static HRESULT dxgi_vk_swap_chain_create_surface(struct dxgi_vk_swap_chain *chain, HWND hwnd) +static HRESULT dxgi_vk_swap_chain_create_surface(struct dxgi_vk_swap_chain *chain, IDXGIVkSurfaceFactory *pFactory) { const struct vkd3d_vk_device_procs *vk_procs = &chain->queue->device->vk_procs; -#ifdef VK_KHR_win32_surface - VkWin32SurfaceCreateInfoKHR create_info; -#endif VkPhysicalDevice vk_physical_device; VkInstance vk_instance; VkBool32 supported; @@ -776,18 +773,7 @@ static HRESULT dxgi_vk_swap_chain_create_surface(struct dxgi_vk_swap_chain *chai vk_instance = chain->queue->device->vkd3d_instance->vk_instance; vk_physical_device = chain->queue->device->vk_physical_device; - -#ifdef VK_KHR_win32_surface - create_info.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR; - create_info.pNext = NULL; - create_info.hwnd = hwnd; - create_info.hinstance = GetModuleHandleA("d3d12.dll"); - create_info.flags = 0; - vr = VK_CALL(vkCreateWin32SurfaceKHR(vk_instance, &create_info, NULL, &chain->vk_surface)); -#else - /* TODO: With dxvk-native integration, we can modify this as needed. */ - vr = VK_ERROR_SURFACE_LOST_KHR; -#endif + vr = IDXGIVkSurfaceFactory_CreateSurface(pFactory, vk_instance, vk_physical_device, &chain->vk_surface); if (vr < 0) return hresult_from_vk_result(vr); @@ -1701,7 +1687,8 @@ static HRESULT dxgi_vk_swap_chain_init_waiter_thread(struct dxgi_vk_swap_chain * return S_OK; } -static HRESULT dxgi_vk_swap_chain_init(struct dxgi_vk_swap_chain *chain, HWND hwnd, const DXGI_SWAP_CHAIN_DESC1 *pDesc, struct d3d12_command_queue *queue) +static HRESULT dxgi_vk_swap_chain_init(struct dxgi_vk_swap_chain *chain, IDXGIVkSurfaceFactory *pFactory, + const DXGI_SWAP_CHAIN_DESC1 *pDesc, struct d3d12_command_queue *queue) { HRESULT hr; @@ -1716,7 +1703,7 @@ static HRESULT dxgi_vk_swap_chain_init(struct dxgi_vk_swap_chain *chain, HWND hw if (FAILED(hr = dxgi_vk_swap_chain_init_sync_objects(chain))) goto err; - if (FAILED(hr = dxgi_vk_swap_chain_create_surface(chain, hwnd))) + if (FAILED(hr = dxgi_vk_swap_chain_create_surface(chain, pFactory))) goto err; if (FAILED(hr = dxgi_vk_swap_chain_init_waiter_thread(chain))) @@ -1731,7 +1718,7 @@ err: } static HRESULT STDMETHODCALLTYPE dxgi_vk_swap_chain_factory_CreateSwapChain(IDXGIVkSwapChainFactory *iface, - HWND hWnd, const DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIVkSwapChain **ppSwapchain) + IDXGIVkSurfaceFactory *pFactory, const DXGI_SWAP_CHAIN_DESC1 *pDesc, IDXGIVkSwapChain **ppSwapchain) { struct dxgi_vk_swap_chain_factory *factory = impl_from_IDXGIVkSwapChainFactory(iface); struct dxgi_vk_swap_chain *chain; @@ -1741,7 +1728,7 @@ static HRESULT STDMETHODCALLTYPE dxgi_vk_swap_chain_factory_CreateSwapChain(IDXG if (!chain) return E_OUTOFMEMORY; - if (FAILED(hr = dxgi_vk_swap_chain_init(chain, hWnd, pDesc, factory->queue))) + if (FAILED(hr = dxgi_vk_swap_chain_init(chain, pFactory, pDesc, factory->queue))) { vkd3d_free(chain); return hr; -- cgit v1.2.3