[go: up one dir, main page]

canvas: Set origin to upper left when using GL_MESA_framebuffer_flip_y

GL_MESA_framebuffer_flip_y extension y flips the framebuffer, so
when transferring to skia make sure the orientation is correct.

(cherry picked from commit 085ea3f6f4852b09fa02d2ba3f82a48e9ed059a7)

BUG: 961791
Change-Id: Idb77c4dcc872ba648415c7823ca40639c7cf27eb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1644173
Commit-Queue: Fritz Koenig <frkoenig@chromium.org>
Reviewed-by: Antoine Labour <piman@chromium.org>
Reviewed-by: Khushal <khushalsagar@chromium.org>
Reviewed-by: Miguel Casas <mcasas@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#666984}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1661081
Cr-Commit-Position: refs/branch-heads/3809@{#328}
Cr-Branched-From: d82dec1a818f378c464ba307ddd9c92133eac355-refs/heads/master@{#665002}
diff --git a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc
index c90fe8b..74d7f42a 100644
--- a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc
+++ b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc
@@ -42,10 +42,11 @@
     base::WeakPtr<WebGraphicsContext3DProviderWrapper>&&
         context_provider_wrapper,
     IntSize mailbox_size,
+    bool is_origin_top_left,
     std::unique_ptr<viz::SingleReleaseCallback> release_callback) {
   return base::AdoptRef(new AcceleratedStaticBitmapImage(
       mailbox, sync_token, texture_id, std::move(context_provider_wrapper),
-      mailbox_size, std::move(release_callback)));
+      mailbox_size, is_origin_top_left, std::move(release_callback)));
 }
 
 AcceleratedStaticBitmapImage::AcceleratedStaticBitmapImage(
@@ -65,12 +66,13 @@
     base::WeakPtr<WebGraphicsContext3DProviderWrapper>&&
         context_provider_wrapper,
     IntSize mailbox_size,
+    bool is_origin_top_left,
     std::unique_ptr<viz::SingleReleaseCallback> release_callback)
     : paint_image_content_id_(cc::PaintImage::GetNextContentId()),
       release_callback_(std::move(release_callback)) {
   texture_holder_ = std::make_unique<MailboxTextureHolder>(
       mailbox, sync_token, texture_id, std::move(context_provider_wrapper),
-      mailbox_size);
+      mailbox_size, is_origin_top_left);
 }
 
 namespace {
diff --git a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.h b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.h
index 58da304..0f0dfe3 100644
--- a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.h
+++ b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.h
@@ -48,6 +48,7 @@
       unsigned texture_id,
       base::WeakPtr<WebGraphicsContext3DProviderWrapper>&&,
       IntSize mailbox_size,
+      bool is_origin_top_left,
       std::unique_ptr<viz::SingleReleaseCallback> release_callback = nullptr);
 
   bool CurrentFrameKnownToBeOpaque() override;
@@ -112,6 +113,7 @@
       unsigned texture_id,
       base::WeakPtr<WebGraphicsContext3DProviderWrapper>&&,
       IntSize mailbox_size,
+      bool is_origin_top_left,
       std::unique_ptr<viz::SingleReleaseCallback> release_callback);
 
   void CreateImageFromMailboxIfNeeded();
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.cc b/third_party/blink/renderer/platform/graphics/canvas_resource.cc
index f199c5b5..25ea5cf 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource.cc
@@ -673,11 +673,13 @@
     base::WeakPtr<CanvasResourceProvider> provider,
     SkFilterQuality filter_quality,
     const CanvasColorParams& color_params,
-    bool is_overlay_candidate)
+    bool is_overlay_candidate,
+    bool is_origin_top_left)
     : CanvasResource(std::move(provider), filter_quality, color_params),
       context_provider_wrapper_(std::move(context_provider_wrapper)),
       is_overlay_candidate_(is_overlay_candidate),
-      size_(size) {
+      size_(size),
+      is_origin_top_left_(is_origin_top_left) {
   if (!context_provider_wrapper_)
     return;
 
@@ -715,11 +717,12 @@
     base::WeakPtr<CanvasResourceProvider> provider,
     SkFilterQuality filter_quality,
     const CanvasColorParams& color_params,
-    bool is_overlay_candidate) {
+    bool is_overlay_candidate,
+    bool is_origin_top_left) {
   TRACE_EVENT0("blink", "CanvasResourceSharedImage::Create");
   auto resource = base::AdoptRef(new CanvasResourceSharedImage(
       size, std::move(context_provider_wrapper), std::move(provider),
-      filter_quality, color_params, is_overlay_candidate));
+      filter_quality, color_params, is_overlay_candidate, is_origin_top_left));
   return resource->IsValid() ? resource : nullptr;
 }
 
@@ -797,7 +800,7 @@
   scoped_refptr<StaticBitmapImage> image =
       AcceleratedStaticBitmapImage::CreateFromWebGLContextImage(
           shared_image_mailbox_, GetSyncToken(), 0, ContextProviderWrapper(),
-          Size(), std::move(release_callback));
+          Size(), is_origin_top_left_, std::move(release_callback));
   DCHECK(image);
   return image;
 }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.h b/third_party/blink/renderer/platform/graphics/canvas_resource.h
index de43b18..feb93a5 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource.h
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource.h
@@ -315,7 +315,8 @@
       base::WeakPtr<CanvasResourceProvider>,
       SkFilterQuality,
       const CanvasColorParams&,
-      bool is_overlay_candidate);
+      bool is_overlay_candidate,
+      bool is_origin_top_left);
   ~CanvasResourceSharedImage() override;
 
   bool IsRecycleable() const final { return true; }
@@ -361,7 +362,8 @@
                             base::WeakPtr<CanvasResourceProvider>,
                             SkFilterQuality,
                             const CanvasColorParams&,
-                            bool is_overlay_candidate);
+                            bool is_overlay_candidate,
+                            bool is_origin_top_left);
 
   base::WeakPtr<WebGraphicsContext3DProviderWrapper> context_provider_wrapper_;
   gpu::Mailbox shared_image_mailbox_;
@@ -371,6 +373,7 @@
   GLuint texture_id_ = 0u;
   bool is_overlay_candidate_ = false;
   IntSize size_;
+  bool is_origin_top_left_ = false;
 
   bool is_origin_clean_ = true;
 };
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
index 47082b8..9af2e775 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -494,7 +494,7 @@
     TRACE_EVENT0("blink", "CanvasResourceProviderSharedImage::CreateResource");
     return CanvasResourceSharedImage::Create(
         Size(), ContextProviderWrapper(), CreateWeakPtr(), FilterQuality(),
-        ColorParams(), is_overlay_candidate_);
+        ColorParams(), is_overlay_candidate_, is_origin_top_left_);
   }
 
  protected:
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
index f82433b..b8caf48 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.cc
@@ -602,7 +602,7 @@
   // in DrawingBuffer.
   return AcceleratedStaticBitmapImage::CreateFromWebGLContextImage(
       sk_image_mailbox, sk_image_sync_token, texture_id,
-      context_provider_->GetWeakPtr(), size_);
+      context_provider_->GetWeakPtr(), size_, opengl_flip_y_extension_);
 }
 
 scoped_refptr<DrawingBuffer::ColorBuffer>
diff --git a/third_party/blink/renderer/platform/graphics/gpu/xr_webgl_drawing_buffer.cc b/third_party/blink/renderer/platform/graphics/gpu/xr_webgl_drawing_buffer.cc
index 30b91ad..b686032 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/xr_webgl_drawing_buffer.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/xr_webgl_drawing_buffer.cc
@@ -684,7 +684,7 @@
 
   return AcceleratedStaticBitmapImage::CreateFromWebGLContextImage(
       buffer->mailbox, buffer->produce_sync_token, texture_id,
-      drawing_buffer_->ContextProviderWeakPtr(), size_);
+      drawing_buffer_->ContextProviderWeakPtr(), size_, false);
 }
 
 void XRWebGLDrawingBuffer::MailboxReleased(
@@ -737,7 +737,7 @@
   scoped_refptr<StaticBitmapImage> image =
       AcceleratedStaticBitmapImage::CreateFromWebGLContextImage(
           color_buffer->mailbox, color_buffer->produce_sync_token, texture_id,
-          drawing_buffer_->ContextProviderWeakPtr(), color_buffer->size);
+          drawing_buffer_->ContextProviderWeakPtr(), color_buffer->size, false);
 
   mirror_client_->OnMirrorImageAvailable(std::move(image),
                                          std::move(release_callback));
diff --git a/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc b/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc
index 6e06b93..386d71c 100644
--- a/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc
+++ b/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.cc
@@ -38,8 +38,9 @@
     unsigned texture_id_to_delete_after_mailbox_consumed,
     base::WeakPtr<WebGraphicsContext3DProviderWrapper>&&
         context_provider_wrapper,
-    IntSize mailbox_size)
-    : TextureHolder(std::move(context_provider_wrapper)),
+    IntSize mailbox_size,
+    bool is_origin_top_left)
+    : TextureHolder(std::move(context_provider_wrapper), is_origin_top_left),
       mailbox_(mailbox),
       sync_token_(sync_token),
       texture_id_(texture_id_to_delete_after_mailbox_consumed),
@@ -52,7 +53,8 @@
 MailboxTextureHolder::MailboxTextureHolder(
     std::unique_ptr<TextureHolder> texture_holder,
     GLenum filter)
-    : TextureHolder(texture_holder->ContextProviderWrapper()),
+    : TextureHolder(texture_holder->ContextProviderWrapper(),
+                    texture_holder->IsOriginTopLeft()),
       texture_id_(0),
       is_converted_from_skia_texture_(true),
       thread_id_(0) {
diff --git a/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.h b/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.h
index 6d4f3a5..b36cd01b 100644
--- a/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.h
+++ b/third_party/blink/renderer/platform/graphics/mailbox_texture_holder.h
@@ -41,7 +41,8 @@
                        const gpu::SyncToken&,
                        unsigned texture_id_to_delete_after_mailbox_consumed,
                        base::WeakPtr<WebGraphicsContext3DProviderWrapper>&&,
-                       IntSize mailbox_size);
+                       IntSize mailbox_size,
+                       bool is_origin_top_left);
   // This function turns a texture-backed SkImage into a mailbox and a
   // syncToken.
   MailboxTextureHolder(std::unique_ptr<TextureHolder>, GLenum filter);
diff --git a/third_party/blink/renderer/platform/graphics/skia_texture_holder.cc b/third_party/blink/renderer/platform/graphics/skia_texture_holder.cc
index 50267b7..20dd80e 100644
--- a/third_party/blink/renderer/platform/graphics/skia_texture_holder.cc
+++ b/third_party/blink/renderer/platform/graphics/skia_texture_holder.cc
@@ -13,18 +13,28 @@
 #include "third_party/skia/include/gpu/GrBackendSurface.h"
 #include "third_party/skia/include/gpu/GrContext.h"
 
+namespace {
+bool IsSkImageOriginTopLeft(sk_sp<SkImage> image) {
+  GrSurfaceOrigin origin;
+  image->getBackendTexture(false, &origin);
+  return origin == kTopLeft_GrSurfaceOrigin;
+}
+}  // namespace
+
 namespace blink {
 
 SkiaTextureHolder::SkiaTextureHolder(
     sk_sp<SkImage> image,
     base::WeakPtr<WebGraphicsContext3DProviderWrapper>&&
         context_provider_wrapper)
-    : TextureHolder(std::move(context_provider_wrapper)),
+    : TextureHolder(std::move(context_provider_wrapper),
+                    IsSkImageOriginTopLeft(image)),
       image_(std::move(image)) {}
 
 SkiaTextureHolder::SkiaTextureHolder(
     std::unique_ptr<TextureHolder> texture_holder)
-    : TextureHolder(SharedGpuContext::ContextProviderWrapper()) {
+    : TextureHolder(SharedGpuContext::ContextProviderWrapper(),
+                    texture_holder->IsOriginTopLeft()) {
   DCHECK(texture_holder->IsMailboxTextureHolder());
   const gpu::Mailbox mailbox = texture_holder->GetMailbox();
   const gpu::SyncToken sync_token = texture_holder->GetSyncToken();
@@ -63,9 +73,12 @@
   }
   GrBackendTexture backend_texture(mailbox_size.Width(), mailbox_size.Height(),
                                    GrMipMapped::kNo, texture_info);
+
+  GrSurfaceOrigin origin = IsOriginTopLeft() ? kTopLeft_GrSurfaceOrigin
+                                             : kBottomLeft_GrSurfaceOrigin;
+
   image_ = SkImage::MakeFromAdoptedTexture(shared_gr_context, backend_texture,
-                                           kBottomLeft_GrSurfaceOrigin,
-                                           kN32_SkColorType);
+                                           origin, kN32_SkColorType);
 }
 
 SkiaTextureHolder::~SkiaTextureHolder() {
diff --git a/third_party/blink/renderer/platform/graphics/texture_holder.h b/third_party/blink/renderer/platform/graphics/texture_holder.h
index e57624df..6df9d07 100644
--- a/third_party/blink/renderer/platform/graphics/texture_holder.h
+++ b/third_party/blink/renderer/platform/graphics/texture_holder.h
@@ -61,10 +61,14 @@
                : nullptr;
   }
 
+  bool IsOriginTopLeft() const { return is_origin_top_left_; }
+
  protected:
   TextureHolder(base::WeakPtr<WebGraphicsContext3DProviderWrapper>&&
-                    context_provider_wrapper)
-      : context_provider_wrapper_(std::move(context_provider_wrapper)) {}
+                    context_provider_wrapper,
+                bool is_origin_top_left)
+      : context_provider_wrapper_(std::move(context_provider_wrapper)),
+        is_origin_top_left_(is_origin_top_left) {}
 
  private:
   // Keep a clone of the SingleThreadTaskRunner. This is to handle the case
@@ -73,6 +77,7 @@
   // and that we need to clear the resouces associated with that
   // AcceleratedStaticBitmapImage on the original thread.
   base::WeakPtr<WebGraphicsContext3DProviderWrapper> context_provider_wrapper_;
+  bool is_origin_top_left_;
 };
 
 }  // namespace blink