@@ -33,8 +33,10 @@ SimpleCapture::SimpleCapture(
3333 m_d3dDevice = GetDXGIInterfaceFromObject<ID3D11Device>(m_device);
3434 m_d3dDevice->GetImmediateContext (m_d3dContext.put ());
3535
36+ auto format = static_cast <DXGI_FORMAT>(m_pixelFormat);
3637 m_swapChain = util::CreateDXGISwapChain (m_d3dDevice, static_cast <uint32_t >(m_item.Size ().Width ), static_cast <uint32_t >(m_item.Size ().Height ),
37- static_cast <DXGI_FORMAT>(m_pixelFormat), 2 );
38+ format, 2 ).as <IDXGISwapChain3>();
39+ winrt::check_hresult (m_swapChain->SetColorSpace1 (GetColorSpaceFromPixelFormat (format)));
3840
3941 // We use 'CreateFreeThreaded' instead of 'Create' so that the FrameArrived
4042 // event fires on a thread other than our UI thread. If you use the 'Create'
@@ -85,8 +87,10 @@ void SimpleCapture::Close()
8587
8688void SimpleCapture::ResizeSwapChain ()
8789{
90+ auto format = static_cast <DXGI_FORMAT>(m_pixelFormat);
8891 winrt::check_hresult (m_swapChain->ResizeBuffers (2 , static_cast <uint32_t >(m_lastSize.Width ), static_cast <uint32_t >(m_lastSize.Height ),
89- static_cast <DXGI_FORMAT>(m_pixelFormat), 0 ));
92+ format, 0 ));
93+ winrt::check_hresult (m_swapChain->SetColorSpace1 (GetColorSpaceFromPixelFormat (format)));
9094}
9195
9296bool SimpleCapture::TryResizeSwapChain (winrt::Direct3D11CaptureFrame const & frame)
@@ -119,6 +123,20 @@ bool SimpleCapture::TryUpdatePixelFormat()
119123 return false ;
120124}
121125
126+ DXGI_COLOR_SPACE_TYPE SimpleCapture::GetColorSpaceFromPixelFormat (DXGI_FORMAT format)
127+ {
128+ switch (format)
129+ {
130+ case DXGI_FORMAT_B8G8R8A8_UNORM:
131+ case DXGI_FORMAT_R8G8B8A8_UNORM:
132+ return DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709;
133+ case DXGI_FORMAT_R16G16B16A16_FLOAT:
134+ return DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709;
135+ default :
136+ throw winrt::hresult_error (E_INVALIDARG, L" Unknown color space for pixel format." );
137+ }
138+ }
139+
122140void SimpleCapture::OnFrameArrived (winrt::Direct3D11CaptureFramePool const & sender, winrt::IInspectable const &)
123141{
124142 auto swapChainResizedToFrame = false ;
0 commit comments