From d95f6c3dbdffcd5cff7e5c01cb2ff9bebdacad26 Mon Sep 17 00:00:00 2001
From: Boris Sazonov <bsazonov@chromium.org>
Date: Thu, 28 Nov 2024 12:19:00 +0000
Subject: [PATCH] Revert "Use DawnAHardwareBufferImageRepresentation for all
 dawn backends"

This reverts commit f5334a65d6702212918a0a410b308c65fc3e9bc5.

Reason for revert: caused failures on Android (see https://crbug.com/381386757).

Original change's description:
> Use DawnAHardwareBufferImageRepresentation for all dawn backends
>
> Dawn now supports direct AHardwareBuffer import on all Android
> backends.
>
> Bug: 42241435
> Change-Id: I14e98bf78ba687294ad101e5401850ca4f175b74
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6019930
> Reviewed-by: Kai Ninomiya <kainino@chromium.org>
> Commit-Queue: Geoff Lang <geofflang@chromium.org>
> Cr-Commit-Position: refs/heads/main@{#1388986}

Bug: 42241435, 381386757
Change-Id: I278ab553c8a40637c17b0d7bec6c1000bacf8595
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6054214
Commit-Queue: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Owners-Override: Boris Sazonov <bsazonov@chromium.org>
Auto-Submit: Boris Sazonov <bsazonov@chromium.org>
Commit-Queue: Boris Sazonov <bsazonov@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1389340}
---
 .../ahardwarebuffer_image_backing_factory.cc  | 23 ++++++++++++++++++-
 ...rebuffer_image_backing_factory_unittest.cc | 17 ++++----------
 ...wn_ahardwarebuffer_image_representation.cc | 10 ++------
 ...awn_ahardwarebuffer_image_representation.h |  2 --
 4 files changed, 29 insertions(+), 23 deletions(-)

diff --git a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc
index e24abdd47d5c3..a23e6a31e9fa7 100644
--- a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc
+++ b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory.cc
@@ -39,6 +39,7 @@
 #include "gpu/command_buffer/service/shared_context_state.h"
 #include "gpu/command_buffer/service/shared_image/android_image_backing.h"
 #include "gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.h"
+#include "gpu/command_buffer/service/shared_image/dawn_egl_image_representation.h"
 #include "gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.h"
 #include "gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.h"
 #include "gpu/command_buffer/service/shared_image/shared_image_backing.h"
@@ -608,6 +609,26 @@ AHardwareBufferImageBacking::ProduceDawn(
   // backing.
   DCHECK(hardware_buffer_handle_.is_valid());
 
+#if BUILDFLAG(USE_DAWN) && BUILDFLAG(DAWN_ENABLE_BACKEND_OPENGLES)
+  if (backend_type == wgpu::BackendType::OpenGLES) {
+    std::unique_ptr<GLTextureImageRepresentationBase> gl_representation;
+    if (use_passthrough_) {
+      gl_representation = ProduceGLTexturePassthrough(manager, tracker);
+    } else {
+      gl_representation = ProduceGLTexture(manager, tracker);
+    }
+
+    gl::ScopedEGLImage egl_image =
+        CreateEGLImageFromAHardwareBuffer(hardware_buffer_handle_.get());
+
+    auto result = std::make_unique<DawnEGLImageRepresentation>(
+        std::move(gl_representation), std::move(egl_image), manager, this,
+        tracker, device, std::move(view_formats));
+    return result;
+  }
+#endif
+
+  DCHECK_EQ(backend_type, wgpu::BackendType::Vulkan);
   wgpu::TextureFormat webgpu_format = ToDawnFormat(format());
   if (webgpu_format == wgpu::TextureFormat::Undefined) {
     LOG(ERROR) << "Unable to fine a suitable WebGPU format.";
@@ -615,7 +636,7 @@ AHardwareBufferImageBacking::ProduceDawn(
   }
 
   return std::make_unique<DawnAHardwareBufferImageRepresentation>(
-      manager, this, tracker, wgpu::Device(device), backend_type, webgpu_format,
+      manager, this, tracker, wgpu::Device(device), webgpu_format,
       std::move(view_formats), hardware_buffer_handle_.get());
 #else
   return nullptr;
diff --git a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc
index 904545aece6dd..eb7f8e3d05f3d 100644
--- a/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc
+++ b/gpu/command_buffer/service/shared_image/ahardwarebuffer_image_backing_factory_unittest.cc
@@ -253,18 +253,11 @@ TEST_P(AHardwareBufferImageBackingFactoryTest, ProduceDawnOpenGLES) {
 
   wgpu::DeviceDescriptor device_descriptor;
 
-  constexpr wgpu::FeatureName kOptionalFeatures[] = {
-      // We need to request internal usage to be able to do operations with
-      // internal methods that would need specific usages.
-      wgpu::FeatureName::DawnInternalUsages,
-
-      // AHardwareBuffers are imported directly into Dawn and SyncFDs are used
-      // to synchronize them.
-      wgpu::FeatureName::SharedTextureMemoryAHardwareBuffer,
-      wgpu::FeatureName::SharedFenceSyncFD,
-  };
-  device_descriptor.requiredFeatureCount = std::size(kOptionalFeatures);
-  device_descriptor.requiredFeatures = kOptionalFeatures;
+  // We need to request internal usage to be able to do operations with
+  // internal methods that would need specific usages.
+  wgpu::FeatureName dawn_internal_usage = wgpu::FeatureName::DawnInternalUsages;
+  device_descriptor.requiredFeatureCount = 1;
+  device_descriptor.requiredFeatures = &dawn_internal_usage;
 
   wgpu::Device device = adapter.CreateDevice(&device_descriptor);
 
diff --git a/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.cc b/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.cc
index 1796e13ff0cee..e9df988baa260 100644
--- a/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.cc
+++ b/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.cc
@@ -17,13 +17,11 @@ DawnAHardwareBufferImageRepresentation::DawnAHardwareBufferImageRepresentation(
     AndroidImageBacking* backing,
     MemoryTypeTracker* tracker,
     wgpu::Device device,
-    wgpu::BackendType backend_type,
     wgpu::TextureFormat format,
     std::vector<wgpu::TextureFormat> view_formats,
     AHardwareBuffer* buffer)
     : DawnImageRepresentation(manager, backing, tracker),
       device_(std::move(device)),
-      backend_type_(backend_type),
       format_(format),
       view_formats_(std::move(view_formats)) {
   DCHECK(device_);
@@ -83,9 +81,7 @@ wgpu::Texture DawnAHardwareBufferImageRepresentation::BeginAccess(
   // TODO(crbug.com/327111284): Track layouts correctly.
   begin_layout.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
   begin_layout.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
-  if (backend_type_ == wgpu::BackendType::Vulkan) {
-    begin_access_desc.nextInChain = &begin_layout;
-  }
+  begin_access_desc.nextInChain = &begin_layout;
 
   wgpu::SharedFence shared_fence;
   // Pass 1 as the signaled value for the binary semaphore
@@ -162,9 +158,7 @@ void DawnAHardwareBufferImageRepresentation::EndAccess() {
 
   wgpu::SharedTextureMemoryEndAccessState end_access_desc = {};
   wgpu::SharedTextureMemoryVkImageLayoutEndState end_layout{};
-  if (backend_type_ == wgpu::BackendType::Vulkan) {
-    end_access_desc.nextInChain = &end_layout;
-  }
+  end_access_desc.nextInChain = &end_layout;
 
   if (shared_texture_memory_.EndAccess(texture_, &end_access_desc) !=
       wgpu::Status::Success) {
diff --git a/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.h b/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.h
index b4886644a6778..708897e15075b 100644
--- a/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.h
+++ b/gpu/command_buffer/service/shared_image/dawn_ahardwarebuffer_image_representation.h
@@ -23,7 +23,6 @@ class DawnAHardwareBufferImageRepresentation : public DawnImageRepresentation {
       AndroidImageBacking* backing,
       MemoryTypeTracker* tracker,
       wgpu::Device device,
-      wgpu::BackendType backend_type,
       wgpu::TextureFormat format,
       std::vector<wgpu::TextureFormat> view_formats,
       AHardwareBuffer* buffer);
@@ -41,7 +40,6 @@ class DawnAHardwareBufferImageRepresentation : public DawnImageRepresentation {
   base::android::ScopedHardwareBufferHandle handle_;
   wgpu::Texture texture_;
   wgpu::Device device_;
-  wgpu::BackendType backend_type_;
   wgpu::TextureFormat format_;
   std::vector<wgpu::TextureFormat> view_formats_;
   // There is a SharedTextureMemory per representation with how this works