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-28 18:32:10 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2022-11-11 18:49:31 +0300
commitb7e21f9d2a6e3fbb190d1ae156141ef4d4b1c087 (patch)
tree82aa34660867234812497e6477302ae552a9819b
parente00cf0ea2a6289c4a68c1e5edf6804826fee364d (diff)
idl: Update swapchain implementation to IDXGIVkSurfaceFactory.swapchain-rewrite
Signed-off-by: Hans-Kristian Arntzen <post@arntzen-software.no>
-rw-r--r--include/vkd3d_swapchain_factory.idl15
-rw-r--r--include/vkd3d_vk_includes.h4
-rw-r--r--libs/vkd3d/swapchain_new.c27
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,
@@ -50,6 +51,18 @@ typedef struct 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,
uuid(e4a9059e-b569-46ab-8de7-501bd2bc7f7a)
]
interface IDXGIVkSwapChain : IUnknown {
@@ -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;