Commit f8148e4d authored by Zhenyao Mo's avatar Zhenyao Mo Committed by Commit Bot

Reland "Work around where BRGA8 overlays are supported but not reported."

This is a reland of b7c98d05

Original change's description:
> Work around where BRGA8 overlays are supported but not reported.
> 
> On Intel GPUs where YUV hardware overlays are supported, BRGA8
> overlays seem to be supported, but the system fails to report
> that.
> 
> BUG=1119491
> TEST=manual, gpu_unittests
> R=magchen@chromium.org
> 
> Change-Id: I304aef3731f142c13c945ca22ce0df81afbcd21d
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2364580
> Commit-Queue: Zhenyao Mo <zmo@chromium.org>
> Reviewed-by: Maggie Chen <magchen@chromium.org>
> Reviewed-by: Sunny Sachanandani <sunnyps@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#799901}

Bug: 1119491
Change-Id: I1dc05b5f07e5ab8c8b6dcf5e45feaf0a28fe3531
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2367699Reviewed-by: default avatarZhenyao Mo <zmo@chromium.org>
Reviewed-by: default avatarMaggie Chen <magchen@chromium.org>
Commit-Queue: Zhenyao Mo <zmo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#800361}
parent d47a5eaa
...@@ -3487,6 +3487,18 @@ ...@@ -3487,6 +3487,18 @@
"features": [ "features": [
"force_rgb10a2_overlay_support_flags" "force_rgb10a2_overlay_support_flags"
] ]
},
{
"id": 347,
"cr_bugs": [1119491],
"description": "Intel GPUs fail to report BGRA8 overlay support",
"os": {
"type": "win"
},
"vendor_id": "0x8086",
"features": [
"enable_bgra8_overlays_with_yuv_overlay_support"
]
} }
] ]
} }
...@@ -61,6 +61,7 @@ dont_use_eglclientwaitsync_with_timeout ...@@ -61,6 +61,7 @@ dont_use_eglclientwaitsync_with_timeout
dont_use_loops_to_initialize_variables dont_use_loops_to_initialize_variables
emulate_abs_int_function emulate_abs_int_function
emulate_isnan_on_float emulate_isnan_on_float
enable_bgra8_overlays_with_yuv_overlay_support
etc1_power_of_two_only etc1_power_of_two_only
exit_on_context_lost exit_on_context_lost
flush_on_framebuffer_change flush_on_framebuffer_change
......
...@@ -82,13 +82,18 @@ bool CollectGraphicsInfo(GPUInfo* gpu_info) { ...@@ -82,13 +82,18 @@ bool CollectGraphicsInfo(GPUInfo* gpu_info) {
return success; return success;
} }
void InitializePlatformOverlaySettings(GPUInfo* gpu_info) { void InitializePlatformOverlaySettings(GPUInfo* gpu_info,
const GpuFeatureInfo& gpu_feature_info) {
#if defined(OS_WIN) #if defined(OS_WIN)
// This has to be called after a context is created, active GPU is identified, // This has to be called after a context is created, active GPU is identified,
// and GPU driver bug workarounds are computed again. Otherwise the workaround // and GPU driver bug workarounds are computed again. Otherwise the workaround
// |disable_direct_composition| may not be correctly applied. // |disable_direct_composition| may not be correctly applied.
// Also, this has to be called after falling back to SwiftShader decision is // Also, this has to be called after falling back to SwiftShader decision is
// finalized because this function depends on GL is ANGLE's GLES or not. // finalized because this function depends on GL is ANGLE's GLES or not.
if (gpu_feature_info.IsWorkaroundEnabled(
gpu::ENABLE_BGRA8_OVERLAYS_WITH_YUV_OVERLAY_SUPPORT)) {
gl::DirectCompositionSurfaceWin::EnableBGRA8OverlaysWithYUVOverlaySupport();
}
DCHECK(gpu_info); DCHECK(gpu_info);
CollectHardwareOverlayInfo(&gpu_info->overlay_info); CollectHardwareOverlayInfo(&gpu_info->overlay_info);
#elif defined(OS_ANDROID) #elif defined(OS_ANDROID)
...@@ -483,7 +488,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandLine* command_line, ...@@ -483,7 +488,7 @@ bool GpuInit::InitializeAndStartSandbox(base::CommandLine* command_line,
} }
} }
InitializePlatformOverlaySettings(&gpu_info_); InitializePlatformOverlaySettings(&gpu_info_, gpu_feature_info_);
#if defined(OS_LINUX) || defined(OS_CHROMEOS) #if defined(OS_LINUX) || defined(OS_CHROMEOS)
// Driver may create a compatibility profile context when collect graphics // Driver may create a compatibility profile context when collect graphics
...@@ -675,7 +680,7 @@ void GpuInit::InitializeInProcess(base::CommandLine* command_line, ...@@ -675,7 +680,7 @@ void GpuInit::InitializeInProcess(base::CommandLine* command_line,
} }
} }
InitializePlatformOverlaySettings(&gpu_info_); InitializePlatformOverlaySettings(&gpu_info_, gpu_feature_info_);
#if defined(OS_LINUX) || defined(OS_CHROMEOS) #if defined(OS_LINUX) || defined(OS_CHROMEOS)
// Driver may create a compatibility profile context when collect graphics // Driver may create a compatibility profile context when collect graphics
......
...@@ -102,6 +102,10 @@ UINT g_yuy2_overlay_support_flags = 0; ...@@ -102,6 +102,10 @@ UINT g_yuy2_overlay_support_flags = 0;
UINT g_bgra8_overlay_support_flags = 0; UINT g_bgra8_overlay_support_flags = 0;
UINT g_rgb10a2_overlay_support_flags = 0; UINT g_rgb10a2_overlay_support_flags = 0;
// When this is set, if NV12 or YUY2 overlays are supported, set BGRA8 overlays
// as supported as well.
bool g_enable_bgra8_overlays_with_yuv_overlay_support = false;
void SetOverlaySupportFlagsForFormats(UINT nv12_flags, void SetOverlaySupportFlagsForFormats(UINT nv12_flags,
UINT yuy2_flags, UINT yuy2_flags,
UINT bgra8_flags, UINT bgra8_flags,
...@@ -219,6 +223,13 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays, ...@@ -219,6 +223,13 @@ void GetGpuDriverOverlayInfo(bool* supports_overlays,
*overlay_format_used = DXGI_FORMAT_YUY2; *overlay_format_used = DXGI_FORMAT_YUY2;
*supports_overlays = true; *supports_overlays = true;
} }
if (g_enable_bgra8_overlays_with_yuv_overlay_support) {
if (FlagsSupportsOverlays(*nv12_overlay_support_flags))
*bgra8_overlay_support_flags = *nv12_overlay_support_flags;
else if (FlagsSupportsOverlays(*yuy2_overlay_support_flags))
*bgra8_overlay_support_flags = *yuy2_overlay_support_flags;
}
if (*supports_overlays) { if (*supports_overlays) {
DXGI_OUTPUT_DESC monitor_desc = {}; DXGI_OUTPUT_DESC monitor_desc = {};
if (SUCCEEDED(output3->GetDesc(&monitor_desc))) { if (SUCCEEDED(output3->GetDesc(&monitor_desc))) {
...@@ -654,6 +665,13 @@ void DirectCompositionSurfaceWin::SetOverlayHDRGpuInfoUpdateCallback( ...@@ -654,6 +665,13 @@ void DirectCompositionSurfaceWin::SetOverlayHDRGpuInfoUpdateCallback(
g_overlay_hdr_gpu_info_callback = std::move(callback); g_overlay_hdr_gpu_info_callback = std::move(callback);
} }
// static
void DirectCompositionSurfaceWin::EnableBGRA8OverlaysWithYUVOverlaySupport() {
// This has to be set before initializing overlay caps.
DCHECK(!OverlayCapsValid());
g_enable_bgra8_overlays_with_yuv_overlay_support = true;
}
bool DirectCompositionSurfaceWin::Initialize(GLSurfaceFormat format) { bool DirectCompositionSurfaceWin::Initialize(GLSurfaceFormat format) {
d3d11_device_ = QueryD3D11DeviceObjectFromANGLE(); d3d11_device_ = QueryD3D11DeviceObjectFromANGLE();
if (!d3d11_device_) { if (!d3d11_device_) {
......
...@@ -99,6 +99,11 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL, ...@@ -99,6 +99,11 @@ class GL_EXPORT DirectCompositionSurfaceWin : public GLSurfaceEGL,
static void SetOverlayHDRGpuInfoUpdateCallback( static void SetOverlayHDRGpuInfoUpdateCallback(
OverlayHDRInfoUpdateCallback callback); OverlayHDRInfoUpdateCallback callback);
// On Intel GPUs where YUV overlays are supported, BGRA8 overlays are
// supported as well but IDXGIOutput3::CheckOverlaySupport() returns
// unsupported. So allow manually enabling BGRA8 overlay support.
static void EnableBGRA8OverlaysWithYUVOverlaySupport();
// GLSurfaceEGL implementation. // GLSurfaceEGL implementation.
bool Initialize(GLSurfaceFormat format) override; bool Initialize(GLSurfaceFormat format) override;
void Destroy() override; void Destroy() override;
......
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