Commit eec86ff6 authored by Sunny Sachanandani's avatar Sunny Sachanandani Committed by Commit Bot

Reenable direct composition without video layers

Reenable direct composition surface on devices without hardware overlays
since it enables other power improvements like flip mode swap chain and
disabling DWM redirection surface.

To mitigate the original concerns about direct composition, this change
makes DCLayerTree lazy initialize the video context and processor when
a video layer is first used.  On devices that don't support hardware
overlays, the video context and processor will never be initialized.

Bug: 894675, 900702
Change-Id: I8c9d5b78718de2620ca177410d4916390e7cb219
Reviewed-on: https://chromium-review.googlesource.com/c/1318808
Commit-Queue: Sunny Sachanandani <sunnyps@chromium.org>
Reviewed-by: default avatarZhenyao Mo <zmo@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarAntoine Labour <piman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#606312}
parent 7b104ecc
...@@ -75,8 +75,8 @@ WebUIDataSource* CreateGpuHTMLSource() { ...@@ -75,8 +75,8 @@ WebUIDataSource* CreateGpuHTMLSource() {
} }
std::unique_ptr<base::DictionaryValue> NewDescriptionValuePair( std::unique_ptr<base::DictionaryValue> NewDescriptionValuePair(
const std::string& desc, base::StringPiece desc,
const std::string& value) { base::StringPiece value) {
std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
dict->SetString("description", desc); dict->SetString("description", desc);
dict->SetString("value", value); dict->SetString("value", value);
...@@ -84,7 +84,7 @@ std::unique_ptr<base::DictionaryValue> NewDescriptionValuePair( ...@@ -84,7 +84,7 @@ std::unique_ptr<base::DictionaryValue> NewDescriptionValuePair(
} }
std::unique_ptr<base::DictionaryValue> NewDescriptionValuePair( std::unique_ptr<base::DictionaryValue> NewDescriptionValuePair(
const std::string& desc, base::StringPiece desc,
std::unique_ptr<base::Value> value) { std::unique_ptr<base::Value> value) {
std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
dict->SetString("description", desc); dict->SetString("description", desc);
...@@ -181,8 +181,11 @@ std::unique_ptr<base::ListValue> BasicGpuInfoAsListValue( ...@@ -181,8 +181,11 @@ std::unique_ptr<base::ListValue> BasicGpuInfoAsListValue(
NewDescriptionValuePair("Desktop compositing", compositor)); NewDescriptionValuePair("Desktop compositing", compositor));
basic_info->Append(NewDescriptionValuePair( basic_info->Append(NewDescriptionValuePair(
"Direct composition overlays", "Direct composition",
std::make_unique<base::Value>(gpu_info.direct_composition_overlays))); std::make_unique<base::Value>(gpu_info.direct_composition)));
basic_info->Append(NewDescriptionValuePair(
"Supports overlays",
std::make_unique<base::Value>(gpu_info.supports_overlays)));
auto overlay_capabilities = std::make_unique<base::ListValue>(); auto overlay_capabilities = std::make_unique<base::ListValue>();
for (const auto& cap : gpu_info.overlay_capabilities) { for (const auto& cap : gpu_info.overlay_capabilities) {
......
...@@ -1353,7 +1353,7 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl::GetGpuFactories() { ...@@ -1353,7 +1353,7 @@ media::GpuVideoAcceleratorFactories* RenderThreadImpl::GetGpuFactories() {
enable_video_gpu_memory_buffers = enable_video_gpu_memory_buffers =
enable_video_gpu_memory_buffers && enable_video_gpu_memory_buffers &&
(cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames) || (cmd_line->HasSwitch(switches::kEnableGpuMemoryBufferVideoFrames) ||
gpu_channel_host->gpu_info().direct_composition_overlays); gpu_channel_host->gpu_info().supports_overlays);
#endif // defined(OS_WIN) #endif // defined(OS_WIN)
media::mojom::InterfaceFactoryPtr interface_factory; media::mojom::InterfaceFactoryPtr interface_factory;
......
...@@ -1387,6 +1387,21 @@ ...@@ -1387,6 +1387,21 @@
"max_texture_size_limit_4096" "max_texture_size_limit_4096"
] ]
}, },
{
"id": 149,
"description": "Direct composition flashes black initially on Win <10",
"cr_bugs": [588588],
"os": {
"type": "win",
"version": {
"op": "<",
"value": "10.0"
}
},
"features": [
"disable_direct_composition"
]
},
{ {
"id": 150, "id": 150,
"cr_bugs": [563714], "cr_bugs": [563714],
...@@ -2574,6 +2589,32 @@ ...@@ -2574,6 +2589,32 @@
"GL_EXT_disjoint_timer_query" "GL_EXT_disjoint_timer_query"
] ]
}, },
{
"id": 248,
"description": "Direct composition causes slow presents on Intel Sandybridge",
"cr_bugs": [775898, 785648],
"os": {
"type": "win"
},
"vendor_id": "0x8086",
"device_id": ["0x0116"],
"features": [
"disable_direct_composition"
]
},
{
"id": 249,
"description": "Direct composition causes slow presents on old Nvidia GPUs",
"cr_bugs": [775898],
"os": {
"type": "win"
},
"vendor_id": "0x10de",
"device_id": ["0x10d8"],
"features": [
"disable_direct_composition"
]
},
{ {
"id": 250, "id": 250,
"description": "Depth/stencil renderbuffers can't be resized on NVIDIA on early macOS 10.13", "description": "Depth/stencil renderbuffers can't be resized on NVIDIA on early macOS 10.13",
...@@ -2909,6 +2950,35 @@ ...@@ -2909,6 +2950,35 @@
"disable_aimagereader" "disable_aimagereader"
] ]
}, },
{
"id": 277,
"description": "Direct composition path is buggy on certain AMD devices/drivers",
"cr_bugs": [800950],
"os": {
"type": "win"
},
"vendor_id": "0x1002",
"driver_version": {
"op": "=",
"value": "8.970.100.9001"
},
"features": [
"disable_direct_composition"
]
},
{
"id": 278,
"description": "Direct composition path is buggy on certain AMD devices/drivers",
"cr_bugs": [800950],
"os": {
"type": "win"
},
"vendor_id": "0x1002",
"device_id": ["0x6900"],
"features": [
"disable_direct_composition"
]
},
{ {
"id": 279, "id": 279,
"description": "WindowServer crashes on VMWare bots using CA renderer", "description": "WindowServer crashes on VMWare bots using CA renderer",
......
...@@ -188,7 +188,8 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const { ...@@ -188,7 +188,8 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const {
bool passthrough_cmd_decoder; bool passthrough_cmd_decoder;
bool can_support_threaded_texture_mailbox; bool can_support_threaded_texture_mailbox;
#if defined(OS_WIN) #if defined(OS_WIN)
bool direct_composition_overlays; bool direct_composition;
bool supports_overlays;
OverlayCapabilities overlay_capabilities; OverlayCapabilities overlay_capabilities;
DxDiagNode dx_diagnostics; DxDiagNode dx_diagnostics;
Dx12VulkanVersionInfo dx12_vulkan_version_info; Dx12VulkanVersionInfo dx12_vulkan_version_info;
...@@ -247,7 +248,8 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const { ...@@ -247,7 +248,8 @@ void GPUInfo::EnumerateFields(Enumerator* enumerator) const {
can_support_threaded_texture_mailbox); can_support_threaded_texture_mailbox);
// TODO(kbr): add dx_diagnostics on Windows. // TODO(kbr): add dx_diagnostics on Windows.
#if defined(OS_WIN) #if defined(OS_WIN)
enumerator->AddBool("directCompositionOverlays", direct_composition_overlays); enumerator->AddBool("directComposition", direct_composition);
enumerator->AddBool("supportsOverlays", supports_overlays);
for (const auto& cap : overlay_capabilities) for (const auto& cap : overlay_capabilities)
EnumerateOverlayCapability(cap, enumerator); EnumerateOverlayCapability(cap, enumerator);
EnumerateDx12VulkanVersionInfo(dx12_vulkan_version_info, enumerator); EnumerateDx12VulkanVersionInfo(dx12_vulkan_version_info, enumerator);
......
...@@ -275,8 +275,11 @@ struct GPU_EXPORT GPUInfo { ...@@ -275,8 +275,11 @@ struct GPU_EXPORT GPUInfo {
bool can_support_threaded_texture_mailbox = false; bool can_support_threaded_texture_mailbox = false;
#if defined(OS_WIN) #if defined(OS_WIN)
// True if we use direct composition surface on Windows.
bool direct_composition = false;
// True if we use direct composition surface overlays on Windows. // True if we use direct composition surface overlays on Windows.
bool direct_composition_overlays = false; bool supports_overlays = false;
OverlayCapabilities overlay_capabilities; OverlayCapabilities overlay_capabilities;
......
...@@ -229,7 +229,7 @@ void AppendWorkaroundsToCommandLine(const GpuFeatureInfo& gpu_feature_info, ...@@ -229,7 +229,7 @@ void AppendWorkaroundsToCommandLine(const GpuFeatureInfo& gpu_feature_info,
command_line->AppendSwitch(switches::kDisableES3GLContext); command_line->AppendSwitch(switches::kDisableES3GLContext);
} }
if (gpu_feature_info.IsWorkaroundEnabled(DISABLE_DIRECT_COMPOSITION)) { if (gpu_feature_info.IsWorkaroundEnabled(DISABLE_DIRECT_COMPOSITION)) {
command_line->AppendSwitch(switches::kDisableDirectCompositionLayers); command_line->AppendSwitch(switches::kDisableDirectComposition);
} }
} }
......
...@@ -128,7 +128,9 @@ struct GpuInfo { ...@@ -128,7 +128,9 @@ struct GpuInfo {
bool can_support_threaded_texture_mailbox; bool can_support_threaded_texture_mailbox;
[EnableIf=is_win] [EnableIf=is_win]
bool direct_composition_overlays; bool direct_composition;
[EnableIf=is_win]
bool supports_overlays;
[EnableIf=is_win] [EnableIf=is_win]
array<OverlayCapability> overlay_capabilities; array<OverlayCapability> overlay_capabilities;
[EnableIf=is_win] [EnableIf=is_win]
......
...@@ -295,7 +295,8 @@ bool StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo>::Read( ...@@ -295,7 +295,8 @@ bool StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo>::Read(
out->oop_rasterization_supported = data.oop_rasterization_supported(); out->oop_rasterization_supported = data.oop_rasterization_supported();
#if defined(OS_WIN) #if defined(OS_WIN)
out->direct_composition_overlays = data.direct_composition_overlays(); out->direct_composition = data.direct_composition();
out->supports_overlays = data.supports_overlays();
#endif #endif
return data.ReadInitializationTime(&out->initialization_time) && return data.ReadInitializationTime(&out->initialization_time) &&
......
...@@ -286,8 +286,12 @@ struct StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo> { ...@@ -286,8 +286,12 @@ struct StructTraits<gpu::mojom::GpuInfoDataView, gpu::GPUInfo> {
} }
#if defined(OS_WIN) #if defined(OS_WIN)
static bool direct_composition_overlays(const gpu::GPUInfo& input) { static bool direct_composition(const gpu::GPUInfo& input) {
return input.direct_composition_overlays; return input.direct_composition;
}
static bool supports_overlays(const gpu::GPUInfo& input) {
return input.supports_overlays;
} }
static const gpu::OverlayCapabilities& overlay_capabilities( static const gpu::OverlayCapabilities& overlay_capabilities(
......
...@@ -154,7 +154,8 @@ TEST_F(StructTraitsTest, GpuInfo) { ...@@ -154,7 +154,8 @@ TEST_F(StructTraitsTest, GpuInfo) {
const bool in_process_gpu = true; const bool in_process_gpu = true;
const bool passthrough_cmd_decoder = true; const bool passthrough_cmd_decoder = true;
#if defined(OS_WIN) #if defined(OS_WIN)
const bool direct_composition_overlays = true; const bool direct_composition = true;
const bool supports_overlays = true;
const gpu::OverlayCapabilities overlay_capabilities = { const gpu::OverlayCapabilities overlay_capabilities = {
{OverlayFormat::kBGRA, false}, {OverlayFormat::kNV12, true}}; {OverlayFormat::kBGRA, false}, {OverlayFormat::kNV12, true}};
const DxDiagNode dx_diagnostics; const DxDiagNode dx_diagnostics;
...@@ -197,7 +198,8 @@ TEST_F(StructTraitsTest, GpuInfo) { ...@@ -197,7 +198,8 @@ TEST_F(StructTraitsTest, GpuInfo) {
input.in_process_gpu = in_process_gpu; input.in_process_gpu = in_process_gpu;
input.passthrough_cmd_decoder = passthrough_cmd_decoder; input.passthrough_cmd_decoder = passthrough_cmd_decoder;
#if defined(OS_WIN) #if defined(OS_WIN)
input.direct_composition_overlays = direct_composition_overlays; input.direct_composition = direct_composition;
input.supports_overlays = supports_overlays;
input.overlay_capabilities = overlay_capabilities; input.overlay_capabilities = overlay_capabilities;
input.dx_diagnostics = dx_diagnostics; input.dx_diagnostics = dx_diagnostics;
#endif #endif
...@@ -255,7 +257,8 @@ TEST_F(StructTraitsTest, GpuInfo) { ...@@ -255,7 +257,8 @@ TEST_F(StructTraitsTest, GpuInfo) {
EXPECT_EQ(in_process_gpu, output.in_process_gpu); EXPECT_EQ(in_process_gpu, output.in_process_gpu);
EXPECT_EQ(passthrough_cmd_decoder, output.passthrough_cmd_decoder); EXPECT_EQ(passthrough_cmd_decoder, output.passthrough_cmd_decoder);
#if defined(OS_WIN) #if defined(OS_WIN)
EXPECT_EQ(direct_composition_overlays, output.direct_composition_overlays); EXPECT_EQ(direct_composition, output.direct_composition);
EXPECT_EQ(supports_overlays, output.supports_overlays);
EXPECT_EQ(overlay_capabilities, output.overlay_capabilities); EXPECT_EQ(overlay_capabilities, output.overlay_capabilities);
EXPECT_EQ(dx_diagnostics.values, output.dx_diagnostics.values); EXPECT_EQ(dx_diagnostics.values, output.dx_diagnostics.values);
#endif #endif
......
...@@ -36,6 +36,12 @@ class GPU_IPC_SERVICE_EXPORT DirectCompositionSurfaceWin ...@@ -36,6 +36,12 @@ class GPU_IPC_SERVICE_EXPORT DirectCompositionSurfaceWin
base::WeakPtr<ImageTransportSurfaceDelegate> delegate, base::WeakPtr<ImageTransportSurfaceDelegate> delegate,
HWND parent_window); HWND parent_window);
// Returns true if direct composition is supported. We prefer to use direct
// composition event without hardware overlays, because it allows us to bypass
// blitting by DWM to the window redirection surface by using a flip mode swap
// chain. Overridden with --disable-direct-composition.
static bool IsDirectCompositionSupported();
// Returns true if hardware overlays are supported, and DirectComposition // Returns true if hardware overlays are supported, and DirectComposition
// surface and layers should be used. Overridden with // surface and layers should be used. Overridden with
// --enable-direct-composition-layers and --disable-direct-composition-layers. // --enable-direct-composition-layers and --disable-direct-composition-layers.
......
...@@ -62,7 +62,9 @@ bool CollectGraphicsInfo(GPUInfo* gpu_info, ...@@ -62,7 +62,9 @@ bool CollectGraphicsInfo(GPUInfo* gpu_info,
#if defined(OS_WIN) #if defined(OS_WIN)
if (gl::GetGLImplementation() == gl::kGLImplementationEGLGLES2) { if (gl::GetGLImplementation() == gl::kGLImplementationEGLGLES2) {
gpu_info->direct_composition_overlays = gpu_info->direct_composition =
DirectCompositionSurfaceWin::IsDirectCompositionSupported();
gpu_info->supports_overlays =
DirectCompositionSurfaceWin::AreOverlaysSupported(); DirectCompositionSurfaceWin::AreOverlaysSupported();
gpu_info->overlay_capabilities = gpu_info->overlay_capabilities =
DirectCompositionSurfaceWin::GetOverlayCapabilities(); DirectCompositionSurfaceWin::GetOverlayCapabilities();
......
...@@ -34,7 +34,7 @@ scoped_refptr<gl::GLSurface> ImageTransportSurface::CreateNativeSurface( ...@@ -34,7 +34,7 @@ scoped_refptr<gl::GLSurface> ImageTransportSurface::CreateNativeSurface(
auto vsync_provider = auto vsync_provider =
std::make_unique<gl::VSyncProviderWin>(surface_handle); std::make_unique<gl::VSyncProviderWin>(surface_handle);
if (DirectCompositionSurfaceWin::AreOverlaysSupported()) { if (DirectCompositionSurfaceWin::IsDirectCompositionSupported()) {
surface = base::MakeRefCounted<DirectCompositionSurfaceWin>( surface = base::MakeRefCounted<DirectCompositionSurfaceWin>(
std::move(vsync_provider), delegate, surface_handle); std::move(vsync_provider), delegate, surface_handle);
if (!surface->Initialize()) if (!surface->Initialize())
......
...@@ -98,6 +98,9 @@ const char kDisableGLExtensions[] = "disable-gl-extensions"; ...@@ -98,6 +98,9 @@ const char kDisableGLExtensions[] = "disable-gl-extensions";
// Enables SwapBuffersWithBounds if it is supported. // Enables SwapBuffersWithBounds if it is supported.
const char kEnableSwapBuffersWithBounds[] = "enable-swap-buffers-with-bounds"; const char kEnableSwapBuffersWithBounds[] = "enable-swap-buffers-with-bounds";
// Disables DirectComposition surface.
const char kDisableDirectComposition[] = "disable-direct-composition";
// Enables using DirectComposition layers, even if hardware overlays aren't // Enables using DirectComposition layers, even if hardware overlays aren't
// supported. // supported.
const char kEnableDirectCompositionLayers[] = const char kEnableDirectCompositionLayers[] =
...@@ -122,6 +125,7 @@ const char* const kGLSwitchesCopiedFromGpuProcessHost[] = { ...@@ -122,6 +125,7 @@ const char* const kGLSwitchesCopiedFromGpuProcessHost[] = {
kOverrideUseSoftwareGLForTests, kOverrideUseSoftwareGLForTests,
kUseANGLE, kUseANGLE,
kEnableSwapBuffersWithBounds, kEnableSwapBuffersWithBounds,
kDisableDirectComposition,
kEnableDirectCompositionLayers, kEnableDirectCompositionLayers,
kDisableDirectCompositionLayers, kDisableDirectCompositionLayers,
}; };
......
...@@ -54,6 +54,7 @@ GL_EXPORT extern const char kUseGpuInTests[]; ...@@ -54,6 +54,7 @@ GL_EXPORT extern const char kUseGpuInTests[];
GL_EXPORT extern const char kEnableSgiVideoSync[]; GL_EXPORT extern const char kEnableSgiVideoSync[];
GL_EXPORT extern const char kDisableGLExtensions[]; GL_EXPORT extern const char kDisableGLExtensions[];
GL_EXPORT extern const char kEnableSwapBuffersWithBounds[]; GL_EXPORT extern const char kEnableSwapBuffersWithBounds[];
GL_EXPORT extern const char kDisableDirectComposition[];
GL_EXPORT extern const char kEnableDirectCompositionLayers[]; GL_EXPORT extern const char kEnableDirectCompositionLayers[];
GL_EXPORT extern const char kDisableDirectCompositionLayers[]; GL_EXPORT extern const char kDisableDirectCompositionLayers[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment