media: Flag guard 10-bit ARM HWDRM overlays
Some platforms that support AR30 overlays have bugs in them, so add a
flag to subsample to ARGB8888. This flag will be disabled by default
until this feature stabilizes.
Bug: b:340569186
Test: Manual testing on MT8188
Change-Id: I8c2089baef1932f1cdc3ef8c3c33f86c8a2317ea
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5616872
Reviewed-by: Jeff Kardatzke <jkardatzke@google.com>
Commit-Queue: Justin Green <greenjustin@google.com>
Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
Reviewed-by: Vasiliy Telezhnikov <vasilyt@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1314050}
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index bcadf22..b14bad5 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -7824,6 +7824,11 @@
flag_descriptions::kEnableProtectedVulkanDetilingDescription,
kOsCrOS | kOsLacros,
FEATURE_VALUE_TYPE(media::kEnableProtectedVulkanDetiling)},
+ {"enable-arm-hwdrm-10bit-overlays",
+ flag_descriptions::kEnableArmHwdrm10bitOverlaysName,
+ flag_descriptions::kEnableArmHwdrm10bitOverlaysDescription,
+ kOsCrOS | kOsLacros,
+ FEATURE_VALUE_TYPE(media::kEnableArmHwdrm10bitOverlays)},
#if BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA)
{"enable-arm-hwdrm", flag_descriptions::kEnableArmHwdrmName,
flag_descriptions::kEnableArmHwdrmDescription, kOsCrOS | kOsLacros,
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 7b30824..9615092 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -7909,6 +7909,12 @@
"Enable Protected Vulkan Detiling";
const char kEnableProtectedVulkanDetilingDescription[] =
"Use a Vulkan shader for protected Vulkan detiling.";
+const char kEnableArmHwdrm10bitOverlaysName[] =
+ "Enable ARM HW DRM 10-bit Overlays";
+const char kEnableArmHwdrm10bitOverlaysDescription[] =
+ "Enable 10-bit overlays for ARM HW DRM content. If disabled, 10-bit "
+ "HW DRM content will be subsampled to 8-bit before scanout. This flag "
+ "has no effect on 8-bit content.";
#if BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA)
const char kEnableArmHwdrmName[] = "Enable ARM HW DRM";
const char kEnableArmHwdrmDescription[] = "Enable HW backed Widevine L1 DRM";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 8c68de5..d3ecb001 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -4592,6 +4592,8 @@
extern const char kPreferSoftwareMT21Description[];
extern const char kEnableProtectedVulkanDetilingName[];
extern const char kEnableProtectedVulkanDetilingDescription[];
+extern const char kEnableArmHwdrm10bitOverlaysName[];
+extern const char kEnableArmHwdrm10bitOverlaysDescription[];
#if BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA)
extern const char kEnableArmHwdrmName[];
extern const char kEnableArmHwdrmDescription[];
diff --git a/components/viz/service/display/skia_renderer.cc b/components/viz/service/display/skia_renderer.cc
index 589de94..f32d888 100644
--- a/components/viz/service/display/skia_renderer.cc
+++ b/components/viz/service/display/skia_renderer.cc
@@ -60,6 +60,7 @@
#include "gpu/command_buffer/common/swap_buffers_complete_params.h"
#include "gpu/command_buffer/common/sync_token.h"
#include "gpu/config/gpu_finch_features.h"
+#include "media/base/media_switches.h"
#include "skia/ext/opacity_filter_canvas.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkColor.h"
@@ -1213,8 +1214,10 @@
protected_buffer_queue_->Reshape(
gfx::Size(kMaxProtectedContentWidth, kMaxProtectedContentHeight),
gfx::ColorSpace::CreateSRGB(),
- is_10bit ? gfx::BufferFormat::BGRA_1010102
- : gfx::BufferFormat::BGRA_8888);
+ (is_10bit &&
+ base::FeatureList::IsEnabled(media::kEnableArmHwdrm10bitOverlays))
+ ? gfx::BufferFormat::BGRA_1010102
+ : gfx::BufferFormat::BGRA_8888);
return protected_buffer_queue_->GetCurrentBuffer();
}
@@ -2995,8 +2998,10 @@
static_cast<float>(overlay.display_rect.height() /
static_cast<float>(kMaxProtectedContentHeight)));
overlay.mailbox = detiled_image;
- overlay.format = is_10bit ? gfx::BufferFormat::BGRA_1010102
- : gfx::BufferFormat::BGRA_8888;
+ overlay.format = (is_10bit && base::FeatureList::IsEnabled(
+ media::kEnableArmHwdrm10bitOverlays))
+ ? gfx::BufferFormat::BGRA_1010102
+ : gfx::BufferFormat::BGRA_8888;
overlay.transform = gfx::OVERLAY_TRANSFORM_NONE;
continue;
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc
index cf95df1..5c7ca94 100644
--- a/media/base/media_switches.cc
+++ b/media/base/media_switches.cc
@@ -1282,6 +1282,13 @@
BASE_FEATURE(kEnableProtectedVulkanDetiling,
"EnableProtectedVulkanDetiling",
base::FEATURE_ENABLED_BY_DEFAULT);
+// Enable AR30 overlays for 10-bit ARM HWDRM content. If disabled, we will use
+// ARGB8888 instead.
+// Owner: greenjustin@google.com
+// Expiry: When AR30 overlays are stable on devices that support them.
+BASE_FEATURE(kEnableArmHwdrm10bitOverlays,
+ "EnableArmHwdrm10bitOverlays",
+ base::FEATURE_DISABLED_BY_DEFAULT);
#if BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA)
// Enable use of HW based L1 Widevine DRM via the cdm-oemcrypto daemon on
// ChromeOS. This flag is temporary while we finish development.
diff --git a/media/base/media_switches.h b/media/base/media_switches.h
index a66d808..9300f5b 100644
--- a/media/base/media_switches.h
+++ b/media/base/media_switches.h
@@ -426,6 +426,7 @@
MEDIA_EXPORT BASE_DECLARE_FEATURE(kPreferGLImageProcessor);
MEDIA_EXPORT BASE_DECLARE_FEATURE(kPreferSoftwareMT21);
MEDIA_EXPORT BASE_DECLARE_FEATURE(kEnableProtectedVulkanDetiling);
+MEDIA_EXPORT BASE_DECLARE_FEATURE(kEnableArmHwdrm10bitOverlays);
#if BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA)
MEDIA_EXPORT BASE_DECLARE_FEATURE(kEnableArmHwdrm);
#endif // BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA)
diff --git a/media/gpu/chromeos/vulkan_image_processor.cc b/media/gpu/chromeos/vulkan_image_processor.cc
index 5a0bff2..a7be7f6 100644
--- a/media/gpu/chromeos/vulkan_image_processor.cc
+++ b/media/gpu/chromeos/vulkan_image_processor.cc
@@ -10,6 +10,7 @@
#include "base/task/thread_pool.h"
#include "gpu/vulkan/init/vulkan_factory.h"
#include "gpu/vulkan/vulkan_function_pointers.h"
+#include "media/base/media_switches.h"
#include "media/gpu/chromeos/platform_video_frame_utils.h"
#include "media/gpu/chromeos/shaders/shaders.h"
#include "media/gpu/macros.h"
@@ -885,8 +886,15 @@
return nullptr;
}
- VkFormat out_format = format == kMM21 ? VK_FORMAT_B8G8R8A8_UNORM
- : VK_FORMAT_A2R10G10B10_UNORM_PACK32;
+ VkFormat out_format =
+ (format == kMT2T
+#if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) && \
+ defined(ARCH_CPU_ARM_FAMILY)
+ && base::FeatureList::IsEnabled(media::kEnableArmHwdrm10bitOverlays)
+#endif
+ )
+ ? VK_FORMAT_A2R10G10B10_UNORM_PACK32
+ : VK_FORMAT_B8G8R8A8_UNORM;
auto convert_render_pass = VulkanRenderPass::Create(
out_format, vulkan_device_queue->GetVulkanDevice());
if (!convert_render_pass) {