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 1e170573c25fcc1aa608793da3d21bea6be388d9..70e272adbd24e115767f3e4ef5506d627dd58c75 100644 |
--- a/gpu/ipc/service/direct_composition_surface_win.cc |
+++ b/gpu/ipc/service/direct_composition_surface_win.cc |
@@ -104,6 +104,54 @@ class PresentationHistory { |
DISALLOW_COPY_AND_ASSIGN(PresentationHistory); |
}; |
+// This is the raw support info, which shouldn't depend on field trial state. |
+bool HardwareSupportsOverlays() { |
+ if (!gl::GLSurfaceEGL::IsDirectCompositionSupported()) |
+ return false; |
+ |
+ base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
+ if (command_line->HasSwitch(switches::kEnableDirectCompositionLayers)) |
+ return true; |
+ if (command_line->HasSwitch(switches::kDisableDirectCompositionLayers)) |
+ return false; |
+ |
+ // Before Windows 10 Anniversary Update (Redstone 1), overlay planes |
+ // wouldn't be assigned to non-UWP apps. |
+ if (base::win::GetVersion() < base::win::VERSION_WIN10_R1) |
+ return false; |
+ |
+ base::win::ScopedComPtr<ID3D11Device> d3d11_device = |
+ gl::QueryD3D11DeviceObjectFromANGLE(); |
+ DCHECK(d3d11_device); |
+ |
+ base::win::ScopedComPtr<IDXGIDevice> dxgi_device; |
+ d3d11_device.QueryInterface(dxgi_device.Receive()); |
+ base::win::ScopedComPtr<IDXGIAdapter> dxgi_adapter; |
+ dxgi_device->GetAdapter(dxgi_adapter.Receive()); |
+ |
+ unsigned int i = 0; |
+ while (true) { |
+ base::win::ScopedComPtr<IDXGIOutput> output; |
+ if (FAILED(dxgi_adapter->EnumOutputs(i++, output.Receive()))) |
+ break; |
+ base::win::ScopedComPtr<IDXGIOutput3> output3; |
+ if (FAILED(output.QueryInterface(output3.Receive()))) |
+ continue; |
+ |
+ UINT flags = 0; |
+ if (FAILED(output3->CheckOverlaySupport(DXGI_FORMAT_YUY2, |
+ d3d11_device.Get(), &flags))) |
+ continue; |
+ |
+ // Direct-only support might be ok in some circumstances, but since the |
+ // overlay processor isn't set up to try to distinguish, only try to use |
+ // overlays when scaling's enabled. |
+ if (flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
// Only one DirectComposition surface can be rendered into at a time. Track |
// here which IDCompositionSurface is being rendered into. If another context |
// is made current, then this surface will be suspended. |
@@ -798,53 +846,10 @@ DirectCompositionSurfaceWin::~DirectCompositionSurfaceWin() { |
// static |
bool DirectCompositionSurfaceWin::AreOverlaysSupported() { |
- if (!base::FeatureList::IsEnabled(switches::kDirectCompositionOverlays)) |
- return false; |
- |
- if (!gl::GLSurfaceEGL::IsDirectCompositionSupported()) |
- return false; |
- |
- base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); |
- if (command_line->HasSwitch(switches::kEnableDirectCompositionLayers)) |
- return true; |
- if (command_line->HasSwitch(switches::kDisableDirectCompositionLayers)) |
+ if (!HardwareSupportsOverlays()) |
return false; |
- // Before Windows 10 Anniversary Update (Redstone 1), overlay planes |
- // wouldn't be assigned to non-UWP apps. |
- if (base::win::GetVersion() < base::win::VERSION_WIN10_R1) |
- return false; |
- |
- base::win::ScopedComPtr<ID3D11Device> d3d11_device = |
- gl::QueryD3D11DeviceObjectFromANGLE(); |
- DCHECK(d3d11_device); |
- |
- base::win::ScopedComPtr<IDXGIDevice> dxgi_device; |
- d3d11_device.QueryInterface(dxgi_device.Receive()); |
- base::win::ScopedComPtr<IDXGIAdapter> dxgi_adapter; |
- dxgi_device->GetAdapter(dxgi_adapter.Receive()); |
- |
- unsigned int i = 0; |
- while (true) { |
- base::win::ScopedComPtr<IDXGIOutput> output; |
- if (FAILED(dxgi_adapter->EnumOutputs(i++, output.Receive()))) |
- break; |
- base::win::ScopedComPtr<IDXGIOutput3> output3; |
- if (FAILED(output.QueryInterface(output3.Receive()))) |
- continue; |
- |
- UINT flags = 0; |
- if (FAILED(output3->CheckOverlaySupport(DXGI_FORMAT_YUY2, |
- d3d11_device.Get(), &flags))) |
- continue; |
- |
- // Direct-only support might be ok in some circumstances, but since the |
- // overlay processor isn't set up to try to distinguish, only try to use |
- // overlays when scaling's enabled. |
- if (flags & DXGI_OVERLAY_SUPPORT_FLAG_SCALING) |
- return true; |
- } |
- return false; |
+ return base::FeatureList::IsEnabled(switches::kDirectCompositionOverlays); |
} |
bool DirectCompositionSurfaceWin::InitializeNativeWindow() { |