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