diff --git a/src/d3d11/d3d11_present.cpp b/src/d3d11/d3d11_present.cpp index f88e0a7d8..a8fe3d986 100644 --- a/src/d3d11/d3d11_present.cpp +++ b/src/d3d11/d3d11_present.cpp @@ -100,5 +100,22 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Presenter::GetDevice(REFGUID riid, void** ppvDevice) { return m_device->QueryInterface(riid, ppvDevice); } + + + HRESULT STDMETHODCALLTYPE D3D11Presenter::CreateSwapChainForHwnd( + HWND hWnd, + const DXGI_SWAP_CHAIN_DESC1* pDesc, + IDXGIVkSwapChain** ppSwapChain) { + InitReturnPtr(ppSwapChain); + + try { + *ppSwapChain = ref(new D3D11SwapChain( + static_cast(m_device), hWnd, pDesc)); + return S_OK; + } catch (const DxvkError& e) { + Logger::err(e.message()); + return E_FAIL; + } + } } diff --git a/src/d3d11/d3d11_present.h b/src/d3d11/d3d11_present.h index a543ddbb1..58d0dd7dc 100644 --- a/src/d3d11/d3d11_present.h +++ b/src/d3d11/d3d11_present.h @@ -4,6 +4,7 @@ #include "../dxgi/dxgi_interfaces.h" #include "d3d11_include.h" +#include "d3d11_swapchain.h" #include "d3d11_texture.h" namespace dxvk { @@ -63,6 +64,11 @@ namespace dxvk { REFGUID riid, void** ppvDevice); + HRESULT STDMETHODCALLTYPE CreateSwapChainForHwnd( + HWND hWnd, + const DXGI_SWAP_CHAIN_DESC1* pDesc, + IDXGIVkSwapChain** ppSwapChain); + private: IDXGIObject* m_container; diff --git a/src/d3d11/meson.build b/src/d3d11/meson.build index a8596b765..bdef24a5f 100644 --- a/src/d3d11/meson.build +++ b/src/d3d11/meson.build @@ -39,6 +39,7 @@ d3d11_src = [ 'd3d11_sampler.cpp', 'd3d11_shader.cpp', 'd3d11_state.cpp', + 'd3d11_swapchain.cpp', 'd3d11_texture.cpp', 'd3d11_util.cpp', 'd3d11_view_dsv.cpp', @@ -47,7 +48,7 @@ d3d11_src = [ 'd3d11_view_uav.cpp', ] -d3d11_dll = shared_library('d3d11'+dll_ext, d3d11_src + d3d10_src, +d3d11_dll = shared_library('d3d11'+dll_ext, d3d11_src + d3d10_src, glsl_generator.process(dxgi_shaders), name_prefix : '', dependencies : [ lib_dxgi, dxbc_dep, dxvk_dep ], include_directories : dxvk_include_path, diff --git a/src/dxgi/dxgi_device.h b/src/dxgi/dxgi_device.h index bb1a27dde..afecd6476 100644 --- a/src/dxgi/dxgi_device.h +++ b/src/dxgi/dxgi_device.h @@ -89,7 +89,7 @@ namespace dxvk { Rc STDMETHODCALLTYPE GetDXVKDevice() final; - Rc STDMETHODCALLTYPE GetFrameSyncEvent(); + Rc STDMETHODCALLTYPE GetFrameSyncEvent() final; private: diff --git a/src/dxgi/dxgi_interfaces.h b/src/dxgi/dxgi_interfaces.h index fd1d2e0d9..96b676a62 100644 --- a/src/dxgi/dxgi_interfaces.h +++ b/src/dxgi/dxgi_interfaces.h @@ -10,11 +10,50 @@ namespace dxvk { class DxvkAdapter; class DxvkBuffer; class DxvkDevice; + class DxvkEvent; class DxvkImage; } struct IDXGIVkInteropDevice; +/** + * \brief Private DXGI presenter + * + * Presenter interface that allows the DXGI swap + * chain implementation to remain API-agnostic, + * so that common code can stay in one class. + */ +MIDL_INTERFACE("104001a6-7f36-4957-b932-86ade9567d91") +IDXGIVkSwapChain : public IUnknown { + static const GUID guid; + + virtual HRESULT STDMETHODCALLTYPE GetDesc( + DXGI_SWAP_CHAIN_DESC1* pDesc) = 0; + + virtual HRESULT STDMETHODCALLTYPE GetImage( + UINT BufferId, + REFIID riid, + void** ppBuffer) = 0; + + virtual UINT STDMETHODCALLTYPE GetImageIndex() = 0; + + virtual HRESULT STDMETHODCALLTYPE ChangeProperties( + const DXGI_SWAP_CHAIN_DESC1* pDesc) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetPresentRegion( + const RECT* pRegion) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetGammaControl( + UINT NumControlPoints, + const DXGI_RGB* pControlPoints) = 0; + + virtual HRESULT STDMETHODCALLTYPE Present( + UINT SyncInterval, + UINT PresentFlags, + const DXGI_PRESENT_PARAMETERS* pPresentParameters) = 0; +}; + + /** * \brief Private DXGI device interface * @@ -29,6 +68,8 @@ IDXGIVkDevice : public IDXGIDevice2 { virtual ~IDXGIVkDevice() { } virtual dxvk::Rc STDMETHODCALLTYPE GetDXVKDevice() = 0; + + virtual dxvk::Rc STDMETHODCALLTYPE GetFrameSyncEvent() = 0; }; @@ -143,6 +184,11 @@ IDXGIVkPresenter : public IUnknown { virtual HRESULT STDMETHODCALLTYPE GetDevice( REFGUID riid, void** ppDevice) = 0; + + virtual HRESULT STDMETHODCALLTYPE CreateSwapChainForHwnd( + HWND hWnd, + const DXGI_SWAP_CHAIN_DESC1* pDesc, + IDXGIVkSwapChain** ppSwapChain) = 0; }; @@ -294,6 +340,7 @@ struct __declspec(uuid("5679becd-8547-4d93-96a1-e61a1ce7ef37")) IDXGIVkBackBuffe struct __declspec(uuid("79352328-16f2-4f81-9746-9c2e2ccd43cf")) IDXGIVkPresenter; struct __declspec(uuid("e2ef5fa5-dc21-4af7-90c4-f67ef6a09323")) IDXGIVkInteropDevice; struct __declspec(uuid("5546cf8c-77e7-4341-b05d-8d4d5000e77d")) IDXGIVkInteropSurface; +struct __declspec(uuid("104001a6-7f36-4957-b932-86ade9567d91")) IDXGIVkSwapChain; #else DXVK_DEFINE_GUID(IDXGIVkAdapter); DXVK_DEFINE_GUID(IDXGIVkDevice); @@ -301,4 +348,5 @@ DXVK_DEFINE_GUID(IDXGIVkBackBuffer); DXVK_DEFINE_GUID(IDXGIVkPresenter); DXVK_DEFINE_GUID(IDXGIVkInteropDevice); DXVK_DEFINE_GUID(IDXGIVkInteropSurface); +DXVK_DEFINE_GUID(IDXGIVkSwapChain); #endif \ No newline at end of file diff --git a/src/util/com/com_guid.cpp b/src/util/com/com_guid.cpp index 1e8c0d4fe..f1d429c68 100644 --- a/src/util/com/com_guid.cpp +++ b/src/util/com/com_guid.cpp @@ -10,6 +10,7 @@ const GUID IDXGIVkBackBuffer::guid = {0x5679becd,0x8547,0x4d93,{0x96,0xa1,0 const GUID IDXGIVkPresenter::guid = {0x79352328,0x16f2,0x4f81,{0x97,0x46,0x9c,0x2e,0x2c,0xcd,0x43,0xcf}}; const GUID IDXGIVkInteropDevice::guid = {0xe2ef5fa5,0xdc21,0x4af7,{0x90,0xc4,0xf6,0x7e,0xf6,0xa0,0x93,0x23}}; const GUID IDXGIVkInteropSurface::guid = {0x5546cf8c,0x77e7,0x4341,{0xb0,0x5d,0x8d,0x4d,0x50,0x00,0xe7,0x7d}}; +const GUID IDXGIVkSwapChain::guid = {0x104001a6,0x7f36,0x4957,{0xb9,0x32,0x86,0xad,0xe9,0x56,0x7d,0x91}}; std::ostream& operator << (std::ostream& os, REFIID guid) { os << std::hex << std::setfill('0')