Refactor SharedImageRepresentationSkiaVkAndroid.

1. Refactor SharedImageRepresentationSkiaVkAndroid to make it more generic
and usable.
2. Add its implementation to be used by SharedImageBackingAHB.

Bug: 1091945
Change-Id: I42e87978168925915f08e47876c56aac05e0b5f9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2287371
Reviewed-by: Peng Huang <penghuang@chromium.org>
Commit-Queue: vikas soni <vikassoni@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#786370}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 34d802c5a45c306b549e7aec956d95010a1057b3
diff --git a/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc b/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
index 89e0096..1511c11 100644
--- a/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
+++ b/command_buffer/service/shared_image_backing_factory_ahardwarebuffer.cc
@@ -34,8 +34,10 @@
 #include "gpu/command_buffer/service/shared_image_representation_gl_texture_android.h"
 #include "gpu/command_buffer/service/shared_image_representation_skia_gl.h"
 #include "gpu/command_buffer/service/shared_image_representation_skia_vk_android.h"
+#include "gpu/command_buffer/service/skia_utils.h"
 #include "gpu/command_buffer/service/texture_manager.h"
 #include "gpu/vulkan/vulkan_image.h"
+#include "third_party/skia/include/core/SkPromiseImageTexture.h"
 #include "ui/gfx/color_space.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gl/android/android_surface_control_compat.h"
@@ -177,6 +179,32 @@
   DISALLOW_COPY_AND_ASSIGN(SharedImageBackingAHB);
 };
 
+// Vk backed Skia representation of SharedImageBackingAHB.
+class SharedImageRepresentationSkiaVkAHB
+    : public SharedImageRepresentationSkiaVkAndroid {
+ public:
+  SharedImageRepresentationSkiaVkAHB(
+      SharedImageManager* manager,
+      SharedImageBackingAndroid* backing,
+      scoped_refptr<SharedContextState> context_state,
+      std::unique_ptr<VulkanImage> vulkan_image,
+      MemoryTypeTracker* tracker)
+      : SharedImageRepresentationSkiaVkAndroid(manager,
+                                               backing,
+                                               std::move(context_state),
+                                               tracker) {
+    DCHECK(vulkan_image);
+
+    vulkan_image_ = std::move(vulkan_image);
+    // TODO(bsalomon): Determine whether it makes sense to attempt to reuse this
+    // if the vk_info stays the same on subsequent calls.
+    promise_texture_ = SkPromiseImageTexture::Make(
+        GrBackendTexture(size().width(), size().height(),
+                         CreateGrVkImageInfo(vulkan_image_.get())));
+    DCHECK(promise_texture_);
+  }
+};
+
 class SharedImageRepresentationOverlayAHB
     : public SharedImageRepresentationOverlay {
  public:
@@ -342,9 +370,9 @@
     if (!vulkan_image)
       return nullptr;
 
-    return std::make_unique<SharedImageRepresentationSkiaVkAndroid>(
+    return std::make_unique<SharedImageRepresentationSkiaVkAHB>(
         manager, this, std::move(context_state), std::move(vulkan_image),
-        base::ScopedFD(), tracker);
+        tracker);
   }
   DCHECK(context_state->GrContextIsGL());
   DCHECK(hardware_buffer_handle_.is_valid());
diff --git a/command_buffer/service/shared_image_representation_skia_vk_android.cc b/command_buffer/service/shared_image_representation_skia_vk_android.cc
index 3407609..a69cd52 100644
--- a/command_buffer/service/shared_image_representation_skia_vk_android.cc
+++ b/command_buffer/service/shared_image_representation_skia_vk_android.cc
@@ -35,33 +35,25 @@
     SharedImageManager* manager,
     SharedImageBackingAndroid* backing,
     scoped_refptr<SharedContextState> context_state,
-    std::unique_ptr<VulkanImage> vulkan_image,
-    base::ScopedFD init_read_fence,
     MemoryTypeTracker* tracker)
     : SharedImageRepresentationSkia(manager, backing, tracker),
-      vulkan_image_(std::move(vulkan_image)),
-      init_read_fence_(std::move(init_read_fence)),
       context_state_(std::move(context_state)) {
-  DCHECK(vulkan_image_);
+  DCHECK(backing);
   DCHECK(context_state_);
   DCHECK(context_state_->vk_context_provider());
-  // TODO(bsalomon): Determine whether it makes sense to attempt to reuse this
-  // if the vk_info stays the same on subsequent calls.
-  promise_texture_ = SkPromiseImageTexture::Make(
-      GrBackendTexture(size().width(), size().height(),
-                       CreateGrVkImageInfo(vulkan_image_.get())));
-  DCHECK(promise_texture_);
 }
 
 SharedImageRepresentationSkiaVkAndroid::
     ~SharedImageRepresentationSkiaVkAndroid() {
   DCHECK_EQ(mode_, RepresentationAccessMode::kNone);
   surface_.reset();
-  DCHECK(vulkan_image_);
-  VulkanFenceHelper* fence_helper =
-      context_state_->vk_context_provider()->GetDeviceQueue()->GetFenceHelper();
-  fence_helper->EnqueueVulkanObjectCleanupForSubmittedWork(
-      std::move(vulkan_image_));
+  if (vulkan_image_) {
+    VulkanFenceHelper* fence_helper = context_state_->vk_context_provider()
+                                          ->GetDeviceQueue()
+                                          ->GetFenceHelper();
+    fence_helper->EnqueueVulkanObjectCleanupForSubmittedWork(
+        std::move(vulkan_image_));
+  }
 }
 
 sk_sp<SkSurface> SharedImageRepresentationSkiaVkAndroid::BeginWriteAccess(
@@ -70,6 +62,7 @@
     std::vector<GrBackendSemaphore>* begin_semaphores,
     std::vector<GrBackendSemaphore>* end_semaphores) {
   DCHECK_EQ(mode_, RepresentationAccessMode::kNone);
+  DCHECK(promise_texture_);
 
   if (!BeginAccess(false /* readonly */, begin_semaphores, end_semaphores,
                    base::ScopedFD()))
@@ -120,6 +113,7 @@
     std::vector<GrBackendSemaphore>* end_semaphores) {
   DCHECK_EQ(mode_, RepresentationAccessMode::kNone);
   DCHECK(!surface_);
+  DCHECK(promise_texture_);
 
   if (!BeginAccess(true /* readonly */, begin_semaphores, end_semaphores,
                    std::move(init_read_fence_)))
diff --git a/command_buffer/service/shared_image_representation_skia_vk_android.h b/command_buffer/service/shared_image_representation_skia_vk_android.h
index f0d6dd1..c0d0000 100644
--- a/command_buffer/service/shared_image_representation_skia_vk_android.h
+++ b/command_buffer/service/shared_image_representation_skia_vk_android.h
@@ -27,8 +27,6 @@
       SharedImageManager* manager,
       SharedImageBackingAndroid* backing,
       scoped_refptr<SharedContextState> context_state,
-      std::unique_ptr<VulkanImage> vulkan_image,
-      base::ScopedFD init_read_fence,
       MemoryTypeTracker* tracker);
 
   ~SharedImageRepresentationSkiaVkAndroid() override;
@@ -44,6 +42,13 @@
       std::vector<GrBackendSemaphore>* end_semaphores) override;
   void EndReadAccess() override;
 
+ protected:
+  std::unique_ptr<VulkanImage> vulkan_image_;
+
+  // Initial read fence to wait on before reading |vulkan_image_|.
+  base::ScopedFD init_read_fence_;
+  sk_sp<SkPromiseImageTexture> promise_texture_;
+
  private:
   bool BeginAccess(bool readonly,
                    std::vector<GrBackendSemaphore>* begin_semaphores,
@@ -58,11 +63,6 @@
     return static_cast<SharedImageBackingAndroid*>(backing());
   }
 
-  std::unique_ptr<VulkanImage> vulkan_image_;
-
-  // Initial read fence to wait on before reading |vulkan_image_|.
-  base::ScopedFD init_read_fence_;
-  sk_sp<SkPromiseImageTexture> promise_texture_;
   RepresentationAccessMode mode_ = RepresentationAccessMode::kNone;
   int surface_msaa_count_ = 0;
   sk_sp<SkSurface> surface_;