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) {