Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rebohle <philip.rebohle@tu-dortmund.de>2022-10-07 18:38:40 +0300
committerPhilip Rebohle <philip.rebohle@tu-dortmund.de>2022-10-09 14:24:37 +0300
commit73cc45ad07d3a17a6ebcf8504bfc269e41cf0fbc (patch)
tree71f5b991d40487d9717d5ca9f0b16f9f6f2c7405
parent018b95db4368e17be89788ccdf7e6fe084161e8d (diff)
[dxgi] Change swap chain interface to better map to D3D12 needsswapchain-frog
-rw-r--r--src/d3d11/d3d11_swapchain.cpp33
-rw-r--r--src/d3d11/d3d11_swapchain.h13
-rw-r--r--src/dxgi/dxgi_interfaces.h30
-rw-r--r--src/dxgi/dxgi_swapchain.cpp87
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(&region);
}
@@ -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);
}