Index: gpu/ipc/service/direct_composition_surface_win.cc |
diff --git a/gpu/ipc/service/direct_composition_surface_win.cc b/gpu/ipc/service/direct_composition_surface_win.cc |
index 13b9a03827f0dc2a9d3f3abe14bd63308f045b15..160e2233adac41e9352a80467c186b0ab9289395 100644 |
--- a/gpu/ipc/service/direct_composition_surface_win.cc |
+++ b/gpu/ipc/service/direct_composition_surface_win.cc |
@@ -554,8 +554,7 @@ void DCLayerTree::SwapChainPresenter::PresentToSwapChain( |
CHECK(SUCCEEDED(hr)); |
} |
- // TODO(jbauman): Use correct colorspace. |
- gfx::ColorSpace src_color_space = gfx::ColorSpace::CreateREC709(); |
+ gfx::ColorSpace src_color_space = params.color_space; |
base::win::ScopedComPtr<ID3D11VideoContext1> context1; |
if (SUCCEEDED(video_context_.CopyTo(context1.GetAddressOf()))) { |
context1->VideoProcessorSetStreamColorSpace1( |
@@ -581,16 +580,46 @@ void DCLayerTree::SwapChainPresenter::PresentToSwapChain( |
if (SUCCEEDED(swap_chain_.CopyTo(swap_chain3.GetAddressOf()))) { |
DXGI_COLOR_SPACE_TYPE color_space = |
gfx::ColorSpaceWin::GetDXGIColorSpace(output_color_space); |
+ if (is_yuy2_swapchain_) { |
+ // Swapchains with YUY2 textures can't have RGB color spaces. |
+ switch (color_space) { |
+ case DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709: |
+ case DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709: |
+ color_space = DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P709; |
+ break; |
+ |
+ case DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P709: |
+ color_space = DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709; |
+ break; |
+ |
+ case DXGI_COLOR_SPACE_RGB_STUDIO_G22_NONE_P2020: |
+ color_space = DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020; |
+ break; |
+ |
+ case DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020: |
+ case DXGI_COLOR_SPACE_RGB_STUDIO_G2084_NONE_P2020: |
+ color_space = DXGI_COLOR_SPACE_YCBCR_STUDIO_G2084_LEFT_P2020; |
+ break; |
+ |
+ case DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P2020: |
+ color_space = DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020; |
+ break; |
+ |
+ default: |
+ break; |
+ } |
+ } |
HRESULT hr = swap_chain3->SetColorSpace1(color_space); |
- CHECK(SUCCEEDED(hr)); |
- if (context1) { |
- context1->VideoProcessorSetOutputColorSpace1(video_processor_.Get(), |
- color_space); |
- } else { |
- D3D11_VIDEO_PROCESSOR_COLOR_SPACE d3d11_color_space = |
- gfx::ColorSpaceWin::GetD3D11ColorSpace(output_color_space); |
- video_context_->VideoProcessorSetOutputColorSpace(video_processor_.Get(), |
- &d3d11_color_space); |
+ if (SUCCEEDED(hr)) { |
+ if (context1) { |
+ context1->VideoProcessorSetOutputColorSpace1(video_processor_.Get(), |
+ color_space); |
+ } else { |
+ D3D11_VIDEO_PROCESSOR_COLOR_SPACE d3d11_color_space = |
+ gfx::ColorSpaceWin::GetD3D11ColorSpace(output_color_space); |
+ video_context_->VideoProcessorSetOutputColorSpace( |
+ video_processor_.Get(), &d3d11_color_space); |
+ } |
} |
} |
@@ -892,7 +921,7 @@ bool DCLayerTree::CommitAndClearPendingOverlays() { |
false, gfx::Rect(), 0, gfx::Transform(), |
std::vector<scoped_refptr<gl::GLImage>>(), |
gfx::RectF(gfx::SizeF(surface_size)), gfx::Rect(surface_size), 0, 0, 1.0, |
- 0)); |
+ 0, gfx::ColorSpace())); |
// TODO(jbauman): Reuse swapchains that are switched between overlays and |
// underlays. |