android/surface_control: Add usage flag required for use with HwC.

Hardware composer requires buffers to have a flag set if they are going
to be used as overlays. The framework currently sets it for buffers it
creates internally. Make sure to also set it for buffers allocated by
Chrome used with the SurfaceControl API.

R=liberato@chromium.org, piman@chromium.org

Bug: 943706
Change-Id: I9677c4833cf711ead8e5467e64a395d3c2ae56e4
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1529408
Reviewed-by: Antoine Labour <piman@chromium.org>
Reviewed-by: Frank Liberato <liberato@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Khushal <khushalsagar@chromium.org>
Auto-Submit: Khushal <khushalsagar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#642839}
diff --git a/gpu/ipc/common/gpu_memory_buffer_impl_android_hardware_buffer.cc b/gpu/ipc/common/gpu_memory_buffer_impl_android_hardware_buffer.cc
index d739de42..8c67295 100644
--- a/gpu/ipc/common/gpu_memory_buffer_impl_android_hardware_buffer.cc
+++ b/gpu/ipc/common/gpu_memory_buffer_impl_android_hardware_buffer.cc
@@ -13,6 +13,7 @@
 #include "base/memory/ptr_util.h"
 #include "gpu/ipc/common/gpu_memory_buffer_support.h"
 #include "ui/gfx/geometry/size.h"
+#include "ui/gl/android/android_surface_control_compat.h"
 
 namespace gpu {
 
@@ -47,6 +48,8 @@
     case gfx::BufferUsage::SCANOUT:
       desc.usage = AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE |
                    AHARDWAREBUFFER_USAGE_GPU_COLOR_OUTPUT;
+      if (usage == gfx::BufferUsage::SCANOUT)
+        desc.usage |= gl::SurfaceControl::RequiredUsage();
       break;
     default:
       NOTREACHED();
diff --git a/media/gpu/android/image_reader_gl_owner.cc b/media/gpu/android/image_reader_gl_owner.cc
index 37c231a..257130d4 100644
--- a/media/gpu/android/image_reader_gl_owner.cc
+++ b/media/gpu/android/image_reader_gl_owner.cc
@@ -19,6 +19,7 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "gpu/command_buffer/service/abstract_texture.h"
 #include "gpu/ipc/common/android/android_image_reader_utils.h"
+#include "ui/gl/android/android_surface_control_compat.h"
 #include "ui/gl/gl_fence_android_native_fence_sync.h"
 #include "ui/gl/gl_utils.h"
 #include "ui/gl/scoped_binders.h"
@@ -100,9 +101,10 @@
   AImageReader* reader = nullptr;
   // The usage flag below should be used when the buffer will be read from by
   // the GPU as a texture.
-  const uint64_t usage = mode == Mode::kAImageReaderSecure
-                             ? AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT
-                             : AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
+  uint64_t usage = mode == Mode::kAImageReaderSecure
+                       ? AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT
+                       : AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE;
+  usage |= gl::SurfaceControl::RequiredUsage();
 
   // Create a new reader for images of the desired size and format.
   media_status_t return_code = loader_.AImageReader_newWithUsage(
diff --git a/ui/gl/android/android_surface_control_compat.cc b/ui/gl/android/android_surface_control_compat.cc
index cd57a88..a2ffb6c5 100644
--- a/ui/gl/android/android_surface_control_compat.cc
+++ b/ui/gl/android/android_surface_control_compat.cc
@@ -44,6 +44,10 @@
   ADATASPACE_BT2020_PQ = 163971072,
 };
 
+enum {
+  AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY = 1ULL << 11,
+};
+
 // ASurfaceTransaction
 using pASurfaceTransaction_create = ASurfaceTransaction* (*)(void);
 using pASurfaceTransaction_delete = void (*)(ASurfaceTransaction*);
@@ -278,10 +282,8 @@
 
 // static
 bool SurfaceControl::IsSupported() {
-  if (!base::android::BuildInfo::GetInstance()->is_at_least_q()) {
-    LOG(ERROR) << "SurfaceControl requires at least Q";
+  if (!base::android::BuildInfo::GetInstance()->is_at_least_q())
     return false;
-  }
   return SurfaceControlMethods::Get().supported;
 }
 
@@ -289,6 +291,12 @@
   return ColorSpaceToADataSpace(color_space) != ADATASPACE_UNKNOWN;
 }
 
+uint64_t SurfaceControl::RequiredUsage() {
+  if (!IsSupported())
+    return 0u;
+  return AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY;
+}
+
 SurfaceControl::Surface::Surface() = default;
 
 SurfaceControl::Surface::Surface(const Surface& parent, const char* name) {
diff --git a/ui/gl/android/android_surface_control_compat.h b/ui/gl/android/android_surface_control_compat.h
index 580621d..7a292f4 100644
--- a/ui/gl/android/android_surface_control_compat.h
+++ b/ui/gl/android/android_surface_control_compat.h
@@ -35,6 +35,10 @@
   // Returns true if overlays with |color_space| are supported by the platform.
   static bool SupportsColorSpace(const gfx::ColorSpace& color_space);
 
+  // Returns the usage flags required for using an AHardwareBuffer with the
+  // SurfaceControl API, if it is supported.
+  static uint64_t RequiredUsage();
+
   class GL_EXPORT Surface : public base::RefCounted<Surface> {
    public:
     Surface();