Commit 4a2f873b authored by Vasiliy Telezhnikov's avatar Vasiliy Telezhnikov Committed by Commit Bot

Fixed skia backend format for fallback images

This CL fixes potential inconsistency between backend format we used
to create promise image and one in fallback image in case we'll need
one. This causes internal checks in Skia to fail.

Bug: 998876
Change-Id: I5d7e25472c392c42b5b9f766ca525e965d0f4a4d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1776206
Commit-Queue: Vasiliy Telezhnikov <vasilyt@chromium.org>
Reviewed-by: default avatarJonathan Backer <backer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#691739}
parent 005f82ed
...@@ -18,4 +18,11 @@ ExternalUseClient::ImageContext::ImageContext( ...@@ -18,4 +18,11 @@ ExternalUseClient::ImageContext::ImageContext(
ExternalUseClient::ImageContext::~ImageContext() = default; ExternalUseClient::ImageContext::~ImageContext() = default;
void ExternalUseClient::ImageContext::SetImage(sk_sp<SkImage> image,
GrBackendFormat backend_format) {
DCHECK(!image_);
image_ = std::move(image);
backend_format_ = backend_format;
}
} // namespace viz } // namespace viz
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "third_party/skia/include/core/SkImage.h" #include "third_party/skia/include/core/SkImage.h"
#include "third_party/skia/include/core/SkImageInfo.h" #include "third_party/skia/include/core/SkImageInfo.h"
#include "third_party/skia/include/core/SkRefCnt.h" #include "third_party/skia/include/core/SkRefCnt.h"
#include "third_party/skia/include/gpu/GrBackendSurface.h"
#include "third_party/skia/include/gpu/GrTypes.h" #include "third_party/skia/include/gpu/GrTypes.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
...@@ -69,11 +70,9 @@ class VIZ_SERVICE_EXPORT ExternalUseClient { ...@@ -69,11 +70,9 @@ class VIZ_SERVICE_EXPORT ExternalUseClient {
bool has_image() { return !!image_; } bool has_image() { return !!image_; }
sk_sp<SkImage> image() { return image_; } sk_sp<SkImage> image() { return image_; }
void set_image(sk_sp<SkImage> image) { void SetImage(sk_sp<SkImage> image, GrBackendFormat backend_format);
DCHECK(!image_);
image_ = std::move(image);
}
void clear_image() { image_.reset(); } void clear_image() { image_.reset(); }
const GrBackendFormat& backend_format() { return backend_format_; }
private: private:
gpu::MailboxHolder mailbox_holder_; gpu::MailboxHolder mailbox_holder_;
...@@ -91,6 +90,7 @@ class VIZ_SERVICE_EXPORT ExternalUseClient { ...@@ -91,6 +90,7 @@ class VIZ_SERVICE_EXPORT ExternalUseClient {
// The promise image which is used on display thread. // The promise image which is used on display thread.
sk_sp<SkImage> image_; sk_sp<SkImage> image_;
GrBackendFormat backend_format_;
DISALLOW_COPY_AND_ASSIGN(ImageContext); DISALLOW_COPY_AND_ASSIGN(ImageContext);
}; };
......
...@@ -47,17 +47,9 @@ void ImageContextImpl::CreateFallbackImage( ...@@ -47,17 +47,9 @@ void ImageContextImpl::CreateFallbackImage(
DCHECK(!fallback_context_state_); DCHECK(!fallback_context_state_);
fallback_context_state_ = context_state; fallback_context_state_ = context_state;
SkColorType color_type = ResourceFormatToClosestSkColorType(
true /* gpu_compositing */, resource_format());
// Don't use a fallback SkColorType because we may fail checks inside Skia
if (SkColorTypeBytesPerPixel(color_type) * 8 !=
BitsPerPixel(resource_format()))
return;
fallback_texture_ = fallback_texture_ =
fallback_context_state_->gr_context()->createBackendTexture( fallback_context_state_->gr_context()->createBackendTexture(
size().width(), size().height(), color_type, size().width(), size().height(), backend_format(),
#if DCHECK_IS_ON() #if DCHECK_IS_ON()
SkColors::kRed, SkColors::kRed,
#else #else
......
...@@ -241,12 +241,15 @@ void SkiaOutputSurfaceImpl::MakePromiseSkImage(ImageContext* image_context) { ...@@ -241,12 +241,15 @@ void SkiaOutputSurfaceImpl::MakePromiseSkImage(ImageContext* image_context) {
image_context->resource_format(), image_context->resource_format(),
image_context->mailbox_holder().texture_target, image_context->mailbox_holder().texture_target,
image_context->ycbcr_info()); image_context->ycbcr_info());
image_context->set_image(recorder_->makePromiseTexture( image_context->SetImage(
backend_format, image_context->size().width(), recorder_->makePromiseTexture(
image_context->size().height(), GrMipMapped::kNo, image_context->origin(), backend_format, image_context->size().width(),
color_type, image_context->alpha_type(), image_context->color_space(), image_context->size().height(), GrMipMapped::kNo,
Fulfill /* fulfillProc */, DoNothing /* releaseProc */, image_context->origin(), color_type, image_context->alpha_type(),
DoNothing /* doneProc */, image_context /* context */)); image_context->color_space(), Fulfill /* fulfillProc */,
DoNothing /* releaseProc */, DoNothing /* doneProc */,
image_context /* context */),
backend_format);
if (image_context->mailbox_holder().sync_token.HasData()) { if (image_context->mailbox_holder().sync_token.HasData()) {
resource_sync_tokens_.push_back(image_context->mailbox_holder().sync_token); resource_sync_tokens_.push_back(image_context->mailbox_holder().sync_token);
...@@ -280,6 +283,10 @@ sk_sp<SkImage> SkiaOutputSurfaceImpl::MakePromiseSkImageFromYUV( ...@@ -280,6 +283,10 @@ sk_sp<SkImage> SkiaOutputSurfaceImpl::MakePromiseSkImageFromYUV(
context->resource_format(), context->mailbox_holder().texture_target); context->resource_format(), context->mailbox_holder().texture_target);
yuva_sizes[i].set(context->size().width(), context->size().height()); yuva_sizes[i].set(context->size().width(), context->size().height());
// NOTE: We don't have promises for individual planes, but still need format
// for fallback
context->SetImage(nullptr, formats[i]);
if (context->mailbox_holder().sync_token.HasData()) { if (context->mailbox_holder().sync_token.HasData()) {
resource_sync_tokens_.push_back(context->mailbox_holder().sync_token); resource_sync_tokens_.push_back(context->mailbox_holder().sync_token);
context->mutable_mailbox_holder()->sync_token.Clear(); context->mutable_mailbox_holder()->sync_token.Clear();
...@@ -438,12 +445,14 @@ sk_sp<SkImage> SkiaOutputSurfaceImpl::MakePromiseSkImageFromRenderPass( ...@@ -438,12 +445,14 @@ sk_sp<SkImage> SkiaOutputSurfaceImpl::MakePromiseSkImageFromRenderPass(
ResourceFormatToClosestSkColorType(true /* gpu_compositing */, format); ResourceFormatToClosestSkColorType(true /* gpu_compositing */, format);
GrBackendFormat backend_format = GrBackendFormat backend_format =
GetGrBackendFormatForTexture(format, GL_TEXTURE_2D); GetGrBackendFormatForTexture(format, GL_TEXTURE_2D);
image_context->set_image(recorder_->makePromiseTexture( image_context->SetImage(
backend_format, image_context->size().width(), recorder_->makePromiseTexture(
image_context->size().height(), image_context->mipmap(), backend_format, image_context->size().width(),
image_context->origin(), color_type, image_context->alpha_type(), image_context->size().height(), image_context->mipmap(),
image_context->color_space(), Fulfill, DoNothing, DoNothing, image_context->origin(), color_type, image_context->alpha_type(),
image_context.get())); image_context->color_space(), Fulfill, DoNothing, DoNothing,
image_context.get()),
backend_format);
DCHECK(image_context->has_image()); DCHECK(image_context->has_image());
} }
images_in_current_paint_.push_back(image_context.get()); images_in_current_paint_.push_back(image_context.get());
......
...@@ -155,9 +155,12 @@ void FakeSkiaOutputSurface::MakePromiseSkImage(ImageContext* image_context) { ...@@ -155,9 +155,12 @@ void FakeSkiaOutputSurface::MakePromiseSkImage(ImageContext* image_context) {
auto sk_color_type = ResourceFormatToClosestSkColorType( auto sk_color_type = ResourceFormatToClosestSkColorType(
true /* gpu_compositing */, image_context->resource_format()); true /* gpu_compositing */, image_context->resource_format());
image_context->set_image(SkImage::MakeFromTexture( image_context->SetImage(
gr_context(), backend_texture, kTopLeft_GrSurfaceOrigin, sk_color_type, SkImage::MakeFromTexture(gr_context(), backend_texture,
image_context->alpha_type(), image_context->color_space())); kTopLeft_GrSurfaceOrigin, sk_color_type,
image_context->alpha_type(),
image_context->color_space()),
backend_texture.getBackendFormat());
} }
sk_sp<SkImage> FakeSkiaOutputSurface::MakePromiseSkImageFromYUV( sk_sp<SkImage> FakeSkiaOutputSurface::MakePromiseSkImageFromYUV(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment