1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-03-15 07:29:17 +01:00

[dxgi] Implement IDXGISwapChain4

This commit is contained in:
Philip Rebohle 2019-09-20 16:48:57 +02:00
parent 5cb7f26bb7
commit 32410a4f2b
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 56 additions and 9 deletions

View File

@ -62,7 +62,8 @@ namespace dxvk {
|| riid == __uuidof(IDXGISwapChain) || riid == __uuidof(IDXGISwapChain)
|| riid == __uuidof(IDXGISwapChain1) || riid == __uuidof(IDXGISwapChain1)
|| riid == __uuidof(IDXGISwapChain2) || riid == __uuidof(IDXGISwapChain2)
|| riid == __uuidof(IDXGISwapChain3)) { || riid == __uuidof(IDXGISwapChain3)
|| riid == __uuidof(IDXGISwapChain4)) {
*ppvObject = ref(this); *ppvObject = ref(this);
return S_OK; return S_OK;
} }
@ -468,16 +469,57 @@ namespace dxvk {
HRESULT STDMETHODCALLTYPE DxgiSwapChain::CheckColorSpaceSupport( HRESULT STDMETHODCALLTYPE DxgiSwapChain::CheckColorSpaceSupport(
DXGI_COLOR_SPACE_TYPE ColorSpace, DXGI_COLOR_SPACE_TYPE ColorSpace,
UINT* pColorSpaceSupport) { UINT* pColorSpaceSupport) {
Logger::err("DxgiSwapChain::CheckColorSpaceSupport: Not implemented"); if (!pColorSpaceSupport)
return E_INVALIDARG;
*pColorSpaceSupport = 0; UINT supportFlags = 0;
return E_NOTIMPL;
if (ColorSpace == DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709)
supportFlags |= DXGI_SWAP_CHAIN_COLOR_SPACE_SUPPORT_FLAG_PRESENT;
*pColorSpaceSupport = supportFlags;
return S_OK;
} }
HRESULT STDMETHODCALLTYPE DxgiSwapChain::SetColorSpace1(DXGI_COLOR_SPACE_TYPE ColorSpace) { HRESULT STDMETHODCALLTYPE DxgiSwapChain::SetColorSpace1(DXGI_COLOR_SPACE_TYPE ColorSpace) {
Logger::err("DxgiSwapChain::SetColorSpace1: Not implemented"); UINT support = 0;
return E_NOTIMPL;
HRESULT hr = CheckColorSpaceSupport(ColorSpace, &support);
if (FAILED(hr))
return hr;
if (!support)
return E_INVALIDARG;
return S_OK;
}
HRESULT STDMETHODCALLTYPE DxgiSwapChain::SetHDRMetaData(
DXGI_HDR_METADATA_TYPE Type,
UINT Size,
void* pMetaData) {
if (Size && !pMetaData)
return E_INVALIDARG;
switch (Type) {
case DXGI_HDR_METADATA_TYPE_NONE:
return S_OK;
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;
default:
Logger::err(str::format("DXGI: Invalid HDR metadata type: ", Type));
return E_INVALIDARG;
}
} }

View File

@ -17,7 +17,7 @@ namespace dxvk {
class DxgiFactory; class DxgiFactory;
class DxgiOutput; class DxgiOutput;
class DxgiSwapChain : public DxgiObject<IDXGISwapChain3> { class DxgiSwapChain : public DxgiObject<IDXGISwapChain4> {
public: public:
@ -156,6 +156,11 @@ namespace dxvk {
HRESULT STDMETHODCALLTYPE SetColorSpace1( HRESULT STDMETHODCALLTYPE SetColorSpace1(
DXGI_COLOR_SPACE_TYPE ColorSpace) final; DXGI_COLOR_SPACE_TYPE ColorSpace) final;
HRESULT STDMETHODCALLTYPE SetHDRMetaData(
DXGI_HDR_METADATA_TYPE Type,
UINT Size,
void* pMetaData) final;
HRESULT STDMETHODCALLTYPE SetGammaControl( HRESULT STDMETHODCALLTYPE SetGammaControl(
UINT NumPoints, UINT NumPoints,
const DXGI_RGB* pGammaCurve); const DXGI_RGB* pGammaCurve);