From 23ac9b52778eaaac6f4f69c82af686ebab27dc6c Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 11 Oct 2018 10:39:59 +0200 Subject: [PATCH] [dxgi] Implement IDXGISwapChain2 stubs Most of the additions are stubs for now, but we should be able to implement most of the functionality at a later time. None of the backends implement this yet, but this should be relatively easy to do. --- src/dxgi/dxgi_swapchain.cpp | 65 ++++++++++++++++++++++++++++++++++++- src/dxgi/dxgi_swapchain.h | 24 +++++++++++++- 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/dxgi/dxgi_swapchain.cpp b/src/dxgi/dxgi_swapchain.cpp index 7182c7b0..8bcdc8b5 100644 --- a/src/dxgi/dxgi_swapchain.cpp +++ b/src/dxgi/dxgi_swapchain.cpp @@ -58,7 +58,8 @@ namespace dxvk { || riid == __uuidof(IDXGIObject) || riid == __uuidof(IDXGIDeviceSubObject) || riid == __uuidof(IDXGISwapChain) - || riid == __uuidof(IDXGISwapChain1)) { + || riid == __uuidof(IDXGISwapChain1) + || riid == __uuidof(IDXGISwapChain2)) { *ppvObject = ref(this); return S_OK; } @@ -385,6 +386,68 @@ namespace dxvk { } + HANDLE STDMETHODCALLTYPE DxgiSwapChain::GetFrameLatencyWaitableObject() { + Logger::err("DxgiSwapChain::GetFrameLatencyWaitableObject: Not implemented"); + return nullptr; + } + + + HRESULT STDMETHODCALLTYPE DxgiSwapChain::GetMatrixTransform( + DXGI_MATRIX_3X2_F* pMatrix) { + // We don't support composition swap chains + Logger::err("DxgiSwapChain::GetMatrixTransform: Not supported"); + return DXGI_ERROR_INVALID_CALL; + } + + + HRESULT STDMETHODCALLTYPE DxgiSwapChain::GetMaximumFrameLatency( + UINT* pMaxLatency) { + Logger::err("DxgiSwapChain::GetMaximumFrameLatency: Not implemented"); + return DXGI_ERROR_INVALID_CALL; + } + + + HRESULT STDMETHODCALLTYPE DxgiSwapChain::GetSourceSize( + UINT* pWidth, + UINT* pHeight) { + // TODO implement properly once supported + if (pWidth) *pWidth = m_desc.Width; + if (pHeight) *pHeight = m_desc.Height; + return S_OK; + } + + + HRESULT STDMETHODCALLTYPE DxgiSwapChain::SetMatrixTransform( + const DXGI_MATRIX_3X2_F* pMatrix) { + // We don't support composition swap chains + Logger::err("DxgiSwapChain::SetMatrixTransform: Not supported"); + return DXGI_ERROR_INVALID_CALL; + } + + + HRESULT STDMETHODCALLTYPE DxgiSwapChain::SetMaximumFrameLatency( + UINT MaxLatency) { + Logger::err("DxgiSwapChain::SetMaximumFrameLatency: Not implemented"); + return DXGI_ERROR_INVALID_CALL; + } + + + HRESULT STDMETHODCALLTYPE DxgiSwapChain::SetSourceSize( + UINT Width, + UINT Height) { + if (Width == 0 || Width > m_desc.Width + || Height == 0 || Height > m_desc.Height) + return E_INVALIDARG; + + RECT region; + region.left = 0; + region.top = 0; + region.right = Width; + region.bottom = Height; + return m_presenter->SetPresentRegion(®ion); + } + + HRESULT DxgiSwapChain::SetGammaControl(const DXGI_GAMMA_CONTROL* pGammaControl) { return m_presenter->SetGammaControl(DXGI_VK_GAMMA_CP_COUNT, pGammaControl->GammaCurve); } diff --git a/src/dxgi/dxgi_swapchain.h b/src/dxgi/dxgi_swapchain.h index 8f8cf59f..ffd1218e 100644 --- a/src/dxgi/dxgi_swapchain.h +++ b/src/dxgi/dxgi_swapchain.h @@ -19,7 +19,7 @@ namespace dxvk { class DxgiFactory; class DxgiOutput; - class DxgiSwapChain : public DxgiObject { + class DxgiSwapChain : public DxgiObject { public: @@ -117,6 +117,28 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE SetRotation( DXGI_MODE_ROTATION Rotation) final; + + HANDLE STDMETHODCALLTYPE GetFrameLatencyWaitableObject() final; + + HRESULT STDMETHODCALLTYPE GetMatrixTransform( + DXGI_MATRIX_3X2_F* pMatrix) final; + + HRESULT STDMETHODCALLTYPE GetMaximumFrameLatency( + UINT* pMaxLatency) final; + + HRESULT STDMETHODCALLTYPE GetSourceSize( + UINT* pWidth, + UINT* pHeight) final; + + HRESULT STDMETHODCALLTYPE SetMatrixTransform( + const DXGI_MATRIX_3X2_F* pMatrix) final; + + HRESULT STDMETHODCALLTYPE SetMaximumFrameLatency( + UINT MaxLatency) final; + + HRESULT STDMETHODCALLTYPE SetSourceSize( + UINT Width, + UINT Height) final; HRESULT SetGammaControl( const DXGI_GAMMA_CONTROL* pGammaControl);