diff options
author | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2022-10-07 18:38:40 +0300 |
---|---|---|
committer | Philip Rebohle <philip.rebohle@tu-dortmund.de> | 2022-10-09 14:24:37 +0300 |
commit | 73cc45ad07d3a17a6ebcf8504bfc269e41cf0fbc (patch) | |
tree | 71f5b991d40487d9717d5ca9f0b16f9f6f2c7405 | |
parent | 018b95db4368e17be89788ccdf7e6fe084161e8d (diff) |
[dxgi] Change swap chain interface to better map to D3D12 needsswapchain-frog
-rw-r--r-- | src/d3d11/d3d11_swapchain.cpp | 33 | ||||
-rw-r--r-- | src/d3d11/d3d11_swapchain.h | 13 | ||||
-rw-r--r-- | src/dxgi/dxgi_interfaces.h | 30 | ||||
-rw-r--r-- | src/dxgi/dxgi_swapchain.cpp | 87 |
4 files changed, 106 insertions, 57 deletions
diff --git a/src/d3d11/d3d11_swapchain.cpp b/src/d3d11/d3d11_swapchain.cpp index 4a7dad00..988013d0 100644 --- a/src/d3d11/d3d11_swapchain.cpp +++ b/src/d3d11/d3d11_swapchain.cpp @@ -131,8 +131,9 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11SwapChain::ChangeProperties( - const DXGI_SWAP_CHAIN_DESC1* pDesc) { - + const DXGI_SWAP_CHAIN_DESC1* pDesc, + const UINT* pNodeMasks, + IUnknown* const* ppPresentQueues) { m_dirty |= m_desc.Format != pDesc->Format || m_desc.Width != pDesc->Width || m_desc.Height != pDesc->Height @@ -255,6 +256,34 @@ namespace dxvk { } + UINT STDMETHODCALLTYPE D3D11SwapChain::CheckColorSpaceSupport( + DXGI_COLOR_SPACE_TYPE ColorSpace) { + UINT supportFlags = 0; + + if (ColorSpace == DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709) + supportFlags |= DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT; + + return supportFlags; + } + + + HRESULT STDMETHODCALLTYPE D3D11SwapChain::SetColorSpace( + DXGI_COLOR_SPACE_TYPE ColorSpace) { + // Ignore, will only ever be sRGB + return S_OK; + } + + + HRESULT STDMETHODCALLTYPE D3D11SwapChain::SetHDRMetaData( + const DXGI_VK_HDR_METADATA* pMetaData) { + // For some reason this call always seems to succeed on Windows + if (pMetaData->Type == DXGI_HDR_METADATA_TYPE_HDR10) + Logger::warn("D3D11: HDR10 metadata not supported"); + + return S_OK; + } + + HRESULT D3D11SwapChain::PresentImage(UINT SyncInterval) { Com<ID3D11DeviceContext> deviceContext = nullptr; m_parent->GetImmediateContext(&deviceContext); diff --git a/src/d3d11/d3d11_swapchain.h b/src/d3d11/d3d11_swapchain.h index 29f9b9a7..a7f535f2 100644 --- a/src/d3d11/d3d11_swapchain.h +++ b/src/d3d11/d3d11_swapchain.h @@ -52,7 +52,9 @@ namespace dxvk { HANDLE STDMETHODCALLTYPE GetFrameLatencyEvent(); HRESULT STDMETHODCALLTYPE ChangeProperties( - const DXGI_SWAP_CHAIN_DESC1* pDesc); + const DXGI_SWAP_CHAIN_DESC1* pDesc, + const UINT* pNodeMasks, + IUnknown* const* ppPresentQueues); HRESULT STDMETHODCALLTYPE SetPresentRegion( const RECT* pRegion); @@ -69,6 +71,15 @@ namespace dxvk { UINT PresentFlags, const DXGI_PRESENT_PARAMETERS* pPresentParameters); + UINT STDMETHODCALLTYPE CheckColorSpaceSupport( + DXGI_COLOR_SPACE_TYPE ColorSpace); + + HRESULT STDMETHODCALLTYPE SetColorSpace( + DXGI_COLOR_SPACE_TYPE ColorSpace); + + HRESULT STDMETHODCALLTYPE SetHDRMetaData( + const DXGI_VK_HDR_METADATA* pMetaData); + private: enum BindingIds : uint32_t { diff --git a/src/dxgi/dxgi_interfaces.h b/src/dxgi/dxgi_interfaces.h index ba16d19d..f555e3cb 100644 --- a/src/dxgi/dxgi_interfaces.h +++ b/src/dxgi/dxgi_interfaces.h @@ -31,13 +31,24 @@ struct DXGI_VK_MONITOR_DATA { /** + * \brief HDR metadata struct + */ +struct DXGI_VK_HDR_METADATA { + DXGI_HDR_METADATA_TYPE Type; + union { + DXGI_HDR_METADATA_HDR10 HDR10; + }; +}; + + +/** * \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") +MIDL_INTERFACE("e4a9059e-b569-46ab-8de7-501bd2bc7f7a") IDXGIVkSwapChain : public IUnknown { virtual HRESULT STDMETHODCALLTYPE GetDesc( DXGI_SWAP_CHAIN_DESC1* pDesc) = 0; @@ -62,7 +73,9 @@ IDXGIVkSwapChain : public IUnknown { virtual HANDLE STDMETHODCALLTYPE GetFrameLatencyEvent() = 0; virtual HRESULT STDMETHODCALLTYPE ChangeProperties( - const DXGI_SWAP_CHAIN_DESC1* pDesc) = 0; + const DXGI_SWAP_CHAIN_DESC1* pDesc, + const UINT* pNodeMasks, + IUnknown* const* ppPresentQueues) = 0; virtual HRESULT STDMETHODCALLTYPE SetPresentRegion( const RECT* pRegion) = 0; @@ -78,6 +91,15 @@ IDXGIVkSwapChain : public IUnknown { UINT SyncInterval, UINT PresentFlags, const DXGI_PRESENT_PARAMETERS* pPresentParameters) = 0; + + virtual UINT STDMETHODCALLTYPE CheckColorSpaceSupport( + DXGI_COLOR_SPACE_TYPE ColorSpace) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetColorSpace( + DXGI_COLOR_SPACE_TYPE ColorSpace) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetHDRMetaData( + const DXGI_VK_HDR_METADATA* pMetaData) = 0; }; @@ -374,7 +396,7 @@ struct __declspec(uuid("3a6d8f2c-b0e8-4ab4-b4dc-4fd24891bfa5")) IDXGIVkInteropAd struct __declspec(uuid("e2ef5fa5-dc21-4af7-90c4-f67ef6a09323")) IDXGIVkInteropDevice; struct __declspec(uuid("e2ef5fa5-dc21-4af7-90c4-f67ef6a09324")) IDXGIVkInteropDevice1; struct __declspec(uuid("5546cf8c-77e7-4341-b05d-8d4d5000e77d")) IDXGIVkInteropSurface; -struct __declspec(uuid("104001a6-7f36-4957-b932-86ade9567d91")) IDXGIVkSwapChain; +struct __declspec(uuid("e4a9059e-b569-46ab-8de7-501bd2bc7f7a")) IDXGIVkSwapChain; struct __declspec(uuid("e7d6c3ca-23a0-4e08-9f2f-ea5231df6633")) IDXGIVkSwapChainFactory; struct __declspec(uuid("53cb4ff0-c25a-4164-a891-0e83db0a7aac")) IWineDXGISwapChainFactory; #else @@ -385,7 +407,7 @@ __CRT_UUID_DECL(IDXGIVkInteropAdapter, 0x3a6d8f2c,0xb0e8,0x4ab4,0xb4,0xdc,0x __CRT_UUID_DECL(IDXGIVkInteropDevice, 0xe2ef5fa5,0xdc21,0x4af7,0x90,0xc4,0xf6,0x7e,0xf6,0xa0,0x93,0x23); __CRT_UUID_DECL(IDXGIVkInteropDevice1, 0xe2ef5fa5,0xdc21,0x4af7,0x90,0xc4,0xf6,0x7e,0xf6,0xa0,0x93,0x24); __CRT_UUID_DECL(IDXGIVkInteropSurface, 0x5546cf8c,0x77e7,0x4341,0xb0,0x5d,0x8d,0x4d,0x50,0x00,0xe7,0x7d); -__CRT_UUID_DECL(IDXGIVkSwapChain, 0x104001a6,0x7f36,0x4957,0xb9,0x32,0x86,0xad,0xe9,0x56,0x7d,0x91); +__CRT_UUID_DECL(IDXGIVkSwapChain, 0xe4a9059e,0xb569,0x46ab,0x8d,0xe7,0x50,0x1b,0xd2,0xbc,0x7f,0x7a); __CRT_UUID_DECL(IDXGIVkSwapChainFactory, 0xe7d6c3ca,0x23a0,0x4e08,0x9f,0x2f,0xea,0x52,0x31,0xdf,0x66,0x33); __CRT_UUID_DECL(IWineDXGISwapChainFactory, 0x53cb4ff0,0xc25a,0x4164,0xa8,0x91,0x0e,0x83,0xdb,0x0a,0x7a,0xac); #endif diff --git a/src/dxgi/dxgi_swapchain.cpp b/src/dxgi/dxgi_swapchain.cpp index f48a282c..8fe029a1 100644 --- a/src/dxgi/dxgi_swapchain.cpp +++ b/src/dxgi/dxgi_swapchain.cpp @@ -319,11 +319,24 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE DxgiSwapChain::ResizeBuffers( - UINT BufferCount, - UINT Width, - UINT Height, - DXGI_FORMAT NewFormat, - UINT SwapChainFlags) { + UINT BufferCount, + UINT Width, + UINT Height, + DXGI_FORMAT NewFormat, + UINT SwapChainFlags) { + return ResizeBuffers1(BufferCount, Width, Height, + NewFormat, SwapChainFlags, nullptr, nullptr); + } + + + HRESULT STDMETHODCALLTYPE DxgiSwapChain::ResizeBuffers1( + UINT BufferCount, + UINT Width, + UINT Height, + DXGI_FORMAT Format, + UINT SwapChainFlags, + const UINT* pCreationNodeMask, + IUnknown* const* ppPresentQueue) { if (!wsi::isWindow(m_window)) return DXGI_ERROR_INVALID_CALL; @@ -343,28 +356,10 @@ namespace dxvk { if (BufferCount != 0) m_desc.BufferCount = BufferCount; - if (NewFormat != DXGI_FORMAT_UNKNOWN) - m_desc.Format = NewFormat; + if (Format != DXGI_FORMAT_UNKNOWN) + m_desc.Format = Format; - return m_presenter->ChangeProperties(&m_desc); - } - - - HRESULT STDMETHODCALLTYPE DxgiSwapChain::ResizeBuffers1( - UINT BufferCount, - UINT Width, - UINT Height, - DXGI_FORMAT Format, - UINT SwapChainFlags, - const UINT* pCreationNodeMask, - IUnknown* const* ppPresentQueue) { - static bool s_errorShown = false; - - if (!std::exchange(s_errorShown, true)) - Logger::warn("DxgiSwapChain::ResizeBuffers1: Stub"); - - return ResizeBuffers(BufferCount, - Width, Height, Format, SwapChainFlags); + return m_presenter->ChangeProperties(&m_desc, pCreationNodeMask, ppPresentQueue); } @@ -515,11 +510,9 @@ namespace dxvk { || Height == 0 || Height > m_desc.Height) return E_INVALIDARG; - RECT region; - region.left = 0; - region.top = 0; - region.right = Width; - region.bottom = Height; + std::lock_guard<dxvk::mutex> lock(m_lockBuffer); + + RECT region = { 0, 0, LONG(Width), LONG(Height) }; return m_presenter->SetPresentRegion(®ion); } @@ -529,29 +522,19 @@ namespace dxvk { UINT* pColorSpaceSupport) { if (!pColorSpaceSupport) return E_INVALIDARG; - - UINT supportFlags = 0; - if (ColorSpace == DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709) - supportFlags |= DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT; - - *pColorSpaceSupport = supportFlags; - return S_OK; + return m_presenter->CheckColorSpaceSupport(ColorSpace); } HRESULT STDMETHODCALLTYPE DxgiSwapChain::SetColorSpace1(DXGI_COLOR_SPACE_TYPE ColorSpace) { - UINT support = 0; - - HRESULT hr = CheckColorSpaceSupport(ColorSpace, &support); - - if (FAILED(hr)) - return hr; + UINT support = m_presenter->CheckColorSpaceSupport(ColorSpace); if (!support) return E_INVALIDARG; - return S_OK; + std::lock_guard<dxvk::mutex> lock(m_lockBuffer); + return m_presenter->SetColorSpace(ColorSpace); } @@ -562,22 +545,26 @@ namespace dxvk { if (Size && !pMetaData) return E_INVALIDARG; + DXGI_VK_HDR_METADATA metadata = { Type }; + switch (Type) { case DXGI_HDR_METADATA_TYPE_NONE: - return S_OK; + break; case DXGI_HDR_METADATA_TYPE_HDR10: if (Size != sizeof(DXGI_HDR_METADATA_HDR10)) return E_INVALIDARG; - // For some reason this always seems to succeed on Windows - Logger::warn("DXGI: HDR not supported"); - return S_OK; + metadata.HDR10 = *static_cast<const DXGI_HDR_METADATA_HDR10*>(pMetaData); + break; default: - Logger::err(str::format("DXGI: Invalid HDR metadata type: ", Type)); + Logger::err(str::format("DXGI: Unsupported HDR metadata type: ", Type)); return E_INVALIDARG; } + + std::lock_guard<dxvk::mutex> lock(m_lockBuffer); + return m_presenter->SetHDRMetaData(&metadata); } |