From 0338b705968f40a9a3deddea24c42391cbbecab9 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 18 Sep 2019 14:51:23 +0200 Subject: [PATCH] [dxgi] Implement IDXGIVkInteropAdapter for IDXGIAdapter --- src/dxgi/dxgi_adapter.cpp | 47 ++++++++++++++++++++++++++++++++++++++- src/dxgi/dxgi_adapter.h | 28 +++++++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/dxgi/dxgi_adapter.cpp b/src/dxgi/dxgi_adapter.cpp index 8da9b48e..1f5e0892 100644 --- a/src/dxgi/dxgi_adapter.cpp +++ b/src/dxgi/dxgi_adapter.cpp @@ -12,11 +12,51 @@ namespace dxvk { + DxgiVkAdapter::DxgiVkAdapter(DxgiAdapter* pAdapter) + : m_adapter(pAdapter) { + + } + + + ULONG STDMETHODCALLTYPE DxgiVkAdapter::AddRef() { + return m_adapter->AddRef(); + } + + + ULONG STDMETHODCALLTYPE DxgiVkAdapter::Release() { + return m_adapter->Release(); + } + + + HRESULT STDMETHODCALLTYPE DxgiVkAdapter::QueryInterface( + REFIID riid, + void** ppvObject) { + return m_adapter->QueryInterface(riid, ppvObject); + } + + + void STDMETHODCALLTYPE DxgiVkAdapter::GetVulkanHandles( + VkInstance* pInstance, + VkPhysicalDevice* pPhysDev) { + auto adapter = m_adapter->GetDXVKAdapter(); + auto instance = adapter->instance(); + + if (pInstance) + *pInstance = instance->handle(); + + if (pPhysDev) + *pPhysDev = adapter->handle(); + } + + + + DxgiAdapter::DxgiAdapter( DxgiFactory* factory, const Rc& adapter) : m_factory (factory), - m_adapter (adapter) { + m_adapter (adapter), + m_interop (this) { } @@ -42,6 +82,11 @@ namespace dxvk { *ppvObject = ref(this); return S_OK; } + + if (riid == __uuidof(IDXGIVkInteropAdapter)) { + *ppvObject = ref(&m_interop); + return S_OK; + } Logger::warn("DxgiAdapter::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/dxgi/dxgi_adapter.h b/src/dxgi/dxgi_adapter.h index 89439148..08e06190 100644 --- a/src/dxgi/dxgi_adapter.h +++ b/src/dxgi/dxgi_adapter.h @@ -9,8 +9,35 @@ namespace dxvk { + class DxgiAdapter; class DxgiFactory; class DxgiOutput; + + + class DxgiVkAdapter : public IDXGIVkInteropAdapter { + + public: + + DxgiVkAdapter(DxgiAdapter* pAdapter); + + ULONG STDMETHODCALLTYPE AddRef(); + + ULONG STDMETHODCALLTYPE Release(); + + HRESULT STDMETHODCALLTYPE QueryInterface( + REFIID riid, + void** ppvObject); + + void STDMETHODCALLTYPE GetVulkanHandles( + VkInstance* pInstance, + VkPhysicalDevice* pPhysDev); + + private: + + DxgiAdapter* m_adapter; + + }; + class DxgiAdapter : public DxgiObject { @@ -76,6 +103,7 @@ namespace dxvk { Com m_factory; Rc m_adapter; + DxgiVkAdapter m_interop; UINT64 m_memReservation[2] = { 0, 0 };