Index: cc/resources/resource_provider.cc |
diff --git a/cc/resources/resource_provider.cc b/cc/resources/resource_provider.cc |
index 2ebeb8d37944913bcf16b76d7e0a3a218dbddf1d..5782ede4e466170f21622ee95b52f921bf1c6118 100644 |
--- a/cc/resources/resource_provider.cc |
+++ b/cc/resources/resource_provider.cc |
@@ -41,6 +41,7 @@ |
#include "third_party/skia/include/gpu/gl/GrGLTypes.h" |
#include "ui/gfx/geometry/rect.h" |
#include "ui/gfx/geometry/vector2d.h" |
+#include "ui/gfx/icc_profile.h" |
#include "ui/gl/trace_util.h" |
using gpu::gles2::GLES2Interface; |
@@ -391,6 +392,7 @@ ResourceProvider::ResourceProvider( |
size_t id_allocation_chunk_size, |
bool delegated_sync_points_required, |
bool use_gpu_memory_buffer_resources, |
+ bool enable_color_correct_rendering, |
const BufferToTextureTargetMap& buffer_to_texture_target_map) |
: compositor_context_provider_(compositor_context_provider), |
shared_bitmap_manager_(shared_bitmap_manager), |
@@ -412,6 +414,7 @@ ResourceProvider::ResourceProvider( |
max_texture_size_(0), |
best_texture_format_(RGBA_8888), |
best_render_buffer_format_(RGBA_8888), |
+ enable_color_correct_rendering_(enable_color_correct_rendering), |
id_allocation_chunk_size_(id_allocation_chunk_size), |
use_sync_query_(false), |
buffer_to_texture_target_map_(buffer_to_texture_target_map), |
@@ -820,8 +823,8 @@ ResourceProvider::TextureHint ResourceProvider::GetTextureHint(ResourceId id) { |
return GetResource(id)->hint; |
} |
-static sk_sp<SkColorSpace> ColorSpaceToSkColorSpace( |
- const gfx::ColorSpace& color_space) { |
+sk_sp<SkColorSpace> ResourceProvider::GetResourceSkColorSpace( |
+ const Resource* resource) const { |
// TODO(crbug.com/634102): Implement conversion for skia-based compositing to |
// be color-managed |
return nullptr; |
@@ -847,9 +850,9 @@ void ResourceProvider::CopyToResource(ResourceId id, |
DCHECK_EQ(RESOURCE_TYPE_BITMAP, resource->type); |
DCHECK(resource->allocated); |
DCHECK_EQ(RGBA_8888, resource->format); |
- SkImageInfo source_info = SkImageInfo::MakeN32Premul( |
- image_size.width(), image_size.height(), |
- ColorSpaceToSkColorSpace(resource->color_space)); |
+ SkImageInfo source_info = |
+ SkImageInfo::MakeN32Premul(image_size.width(), image_size.height(), |
+ GetResourceSkColorSpace(resource)); |
size_t image_stride = image_size.width() * 4; |
ScopedWriteLockSoftware lock(this, id); |
@@ -1097,6 +1100,7 @@ ResourceProvider::ScopedWriteLockGL::ScopedWriteLockGL( |
format_ = resource->format; |
size_ = resource->size; |
mailbox_ = resource->mailbox(); |
+ sk_color_space_ = resource_provider->GetResourceSkColorSpace(resource); |
} |
ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { |
@@ -1161,7 +1165,8 @@ ResourceProvider::ScopedSkSurfaceProvider::ScopedSkSurfaceProvider( |
SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); |
} |
sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( |
- context_provider->GrContext(), desc, &surface_props); |
+ context_provider->GrContext(), desc, resource_lock->sk_color_space(), |
+ &surface_props); |
} |
ResourceProvider::ScopedSkSurfaceProvider::~ScopedSkSurfaceProvider() { |
@@ -1176,7 +1181,7 @@ void ResourceProvider::PopulateSkBitmapWithResource(SkBitmap* sk_bitmap, |
DCHECK_EQ(RGBA_8888, resource->format); |
SkImageInfo info = SkImageInfo::MakeN32Premul( |
resource->size.width(), resource->size.height(), |
- ColorSpaceToSkColorSpace(resource->color_space)); |
+ GetResourceSkColorSpace(resource)); |
sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); |
} |
@@ -1185,7 +1190,7 @@ ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( |
ResourceId resource_id) |
: resource_provider_(resource_provider), resource_id_(resource_id) { |
const Resource* resource = resource_provider->LockForRead(resource_id); |
- ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap_, resource); |
+ resource_provider->PopulateSkBitmapWithResource(&sk_bitmap_, resource); |
} |
ResourceProvider::ScopedReadLockSoftware::~ScopedReadLockSoftware() { |
@@ -1210,11 +1215,11 @@ ResourceProvider::ScopedReadLockSkImage::ScopedReadLockSkImage( |
desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info); |
sk_image_ = SkImage::MakeFromTexture( |
resource_provider->compositor_context_provider_->GrContext(), desc, |
- kPremul_SkAlphaType, ColorSpaceToSkColorSpace(resource->color_space), |
- nullptr, nullptr); |
+ kPremul_SkAlphaType, |
+ resource_provider->GetResourceSkColorSpace(resource), nullptr, nullptr); |
} else if (resource->pixels) { |
SkBitmap sk_bitmap; |
- ResourceProvider::PopulateSkBitmapWithResource(&sk_bitmap, resource); |
+ resource_provider->PopulateSkBitmapWithResource(&sk_bitmap, resource); |
sk_bitmap.setImmutable(); |
sk_image_ = SkImage::MakeFromBitmap(sk_bitmap); |
} else { |
@@ -1236,7 +1241,7 @@ ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( |
ResourceProvider* resource_provider, |
ResourceId resource_id) |
: resource_provider_(resource_provider), resource_id_(resource_id) { |
- ResourceProvider::PopulateSkBitmapWithResource( |
+ resource_provider->PopulateSkBitmapWithResource( |
&sk_bitmap_, resource_provider->LockForWrite(resource_id)); |
DCHECK(valid()); |
} |
@@ -1268,6 +1273,8 @@ ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: |
Resource* resource = resource_provider_->GetResource(resource_id_); |
DCHECK(resource); |
if (gpu_memory_buffer_) { |
+ if (resource_provider_->enable_color_correct_rendering_) |
+ gpu_memory_buffer_->SetColorSpaceForScanout(resource->color_space); |
DCHECK(!resource->gpu_memory_buffer); |
resource_provider_->LazyCreate(resource); |
resource->gpu_memory_buffer = std::move(gpu_memory_buffer_); |
@@ -1849,6 +1856,11 @@ void ResourceProvider::LazyAllocate(Resource* resource) { |
gpu_memory_buffer_manager_->AllocateGpuMemoryBuffer( |
size, BufferFormat(format), resource->usage, |
gpu::kNullSurfaceHandle); |
+ if (resource->gpu_memory_buffer && enable_color_correct_rendering_) { |
+ resource->gpu_memory_buffer->SetColorSpaceForScanout( |
+ resource->color_space); |
+ } |
+ |
LazyCreateImage(resource); |
resource->dirty_image = true; |
resource->is_overlay_candidate = true; |