Skip to content

Commit abd3840

Browse files
committed
fix wrong color space
1 parent 868b613 commit abd3840

2 files changed

Lines changed: 22 additions & 3 deletions

File tree

Win32CaptureSample/SimpleCapture.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

8688
void 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

9296
bool 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+
122140
void SimpleCapture::OnFrameArrived(winrt::Direct3D11CaptureFramePool const& sender, winrt::IInspectable const&)
123141
{
124142
auto swapChainResizedToFrame = false;

Win32CaptureSample/SimpleCapture.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ class SimpleCapture
5656
void ResizeSwapChain();
5757
bool TryResizeSwapChain(winrt::Windows::Graphics::Capture::Direct3D11CaptureFrame const& frame);
5858
bool TryUpdatePixelFormat();
59+
DXGI_COLOR_SPACE_TYPE GetColorSpaceFromPixelFormat(DXGI_FORMAT format);
5960

6061
private:
6162
winrt::Windows::Graphics::Capture::GraphicsCaptureItem m_item{ nullptr };
@@ -64,7 +65,7 @@ class SimpleCapture
6465
winrt::Windows::Graphics::SizeInt32 m_lastSize;
6566

6667
winrt::Windows::Graphics::DirectX::Direct3D11::IDirect3DDevice m_device{ nullptr };
67-
winrt::com_ptr<IDXGISwapChain1> m_swapChain{ nullptr };
68+
winrt::com_ptr<IDXGISwapChain3> m_swapChain{ nullptr };
6869
winrt::com_ptr<ID3D11Device> m_d3dDevice{ nullptr };
6970
winrt::com_ptr<ID3D11DeviceContext> m_d3dContext{ nullptr };
7071
winrt::Windows::Graphics::DirectX::DirectXPixelFormat m_pixelFormat;

0 commit comments

Comments
 (0)