Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(33)

Side by Side Diff: cc/resources/resource_provider.cc

Issue 2752523006: cc: Use SkCreateColorSpaceXformCanvas for color transforms (Closed)
Patch Set: Incorporate review feedback Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/resource_provider.h" 5 #include "cc/resources/resource_provider.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 865 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 // Software resources are immutable; they cannot change format or be 876 // Software resources are immutable; they cannot change format or be
877 // resized. 877 // resized.
878 return true; 878 return true;
879 } 879 }
880 } 880 }
881 881
882 ResourceProvider::TextureHint ResourceProvider::GetTextureHint(ResourceId id) { 882 ResourceProvider::TextureHint ResourceProvider::GetTextureHint(ResourceId id) {
883 return GetResource(id)->hint; 883 return GetResource(id)->hint;
884 } 884 }
885 885
886 sk_sp<SkColorSpace> ResourceProvider::GetResourceSkColorSpace( 886 gfx::ColorSpace ResourceProvider::GetResourceColorSpaceForRaster(
887 const Resource* resource) const { 887 const Resource* resource) const {
888 if (!settings_.enable_color_correct_rasterization) 888 if (!settings_.enable_color_correct_rasterization)
889 return nullptr; 889 return gfx::ColorSpace();
890 // Returning the nonlinear blended color space matches the expectation of the 890 return resource->color_space;
891 // web that colors are blended in the output color space, not in a
892 // physically-based linear space.
893 return resource->color_space.ToNonlinearBlendedSkColorSpace();
894 } 891 }
895 892
896 void ResourceProvider::CopyToResource(ResourceId id, 893 void ResourceProvider::CopyToResource(ResourceId id,
897 const uint8_t* image, 894 const uint8_t* image,
898 const gfx::Size& image_size) { 895 const gfx::Size& image_size) {
899 Resource* resource = GetResource(id); 896 Resource* resource = GetResource(id);
900 DCHECK(!resource->locked_for_write); 897 DCHECK(!resource->locked_for_write);
901 DCHECK(!resource->lock_for_read_count); 898 DCHECK(!resource->lock_for_read_count);
902 DCHECK(resource->origin == Resource::INTERNAL); 899 DCHECK(resource->origin == Resource::INTERNAL);
903 DCHECK_EQ(resource->exported_count, 0); 900 DCHECK_EQ(resource->exported_count, 0);
904 DCHECK(ReadLockFenceHasPassed(resource)); 901 DCHECK(ReadLockFenceHasPassed(resource));
905 902
906 DCHECK_EQ(image_size.width(), resource->size.width()); 903 DCHECK_EQ(image_size.width(), resource->size.width());
907 DCHECK_EQ(image_size.height(), resource->size.height()); 904 DCHECK_EQ(image_size.height(), resource->size.height());
908 905
909 if (resource->allocated) 906 if (resource->allocated)
910 WaitSyncTokenIfNeeded(id); 907 WaitSyncTokenIfNeeded(id);
911 908
912 if (resource->type == RESOURCE_TYPE_BITMAP) { 909 if (resource->type == RESOURCE_TYPE_BITMAP) {
913 DCHECK_EQ(RESOURCE_TYPE_BITMAP, resource->type); 910 DCHECK_EQ(RESOURCE_TYPE_BITMAP, resource->type);
914 DCHECK(resource->allocated); 911 DCHECK(resource->allocated);
915 DCHECK_EQ(RGBA_8888, resource->format); 912 DCHECK_EQ(RGBA_8888, resource->format);
916 SkImageInfo source_info = 913 SkImageInfo source_info =
917 SkImageInfo::MakeN32Premul(image_size.width(), image_size.height(), 914 SkImageInfo::MakeN32Premul(image_size.width(), image_size.height());
918 GetResourceSkColorSpace(resource));
919 size_t image_stride = image_size.width() * 4; 915 size_t image_stride = image_size.width() * 4;
920 916
921 ScopedWriteLockSoftware lock(this, id); 917 ScopedWriteLockSoftware lock(this, id);
922 SkCanvas dest(lock.sk_bitmap()); 918 SkCanvas dest(lock.sk_bitmap());
923 dest.writePixels(source_info, image, image_stride, 0, 0); 919 dest.writePixels(source_info, image, image_stride, 0, 0);
924 } else { 920 } else {
925 ScopedWriteLockGL lock(this, id, false); 921 ScopedWriteLockGL lock(this, id, false);
926 unsigned resource_texture_id = lock.texture_id(); 922 unsigned resource_texture_id = lock.texture_id();
927 DCHECK(resource_texture_id); 923 DCHECK(resource_texture_id);
928 GLES2Interface* gl = ContextGL(); 924 GLES2Interface* gl = ContextGL();
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
1188 resource_provider_->BindImageForSampling(resource); 1184 resource_provider_->BindImageForSampling(resource);
1189 if (create_mailbox) { 1185 if (create_mailbox) {
1190 resource_provider_->CreateMailboxAndBindResource( 1186 resource_provider_->CreateMailboxAndBindResource(
1191 resource_provider_->ContextGL(), resource); 1187 resource_provider_->ContextGL(), resource);
1192 } 1188 }
1193 texture_id_ = resource->gl_id; 1189 texture_id_ = resource->gl_id;
1194 target_ = resource->target; 1190 target_ = resource->target;
1195 format_ = resource->format; 1191 format_ = resource->format;
1196 size_ = resource->size; 1192 size_ = resource->size;
1197 mailbox_ = resource->mailbox(); 1193 mailbox_ = resource->mailbox();
1198 sk_color_space_ = resource_provider->GetResourceSkColorSpace(resource); 1194 color_space_ = resource_provider->GetResourceColorSpaceForRaster(resource);
1199 } 1195 }
1200 1196
1201 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() { 1197 ResourceProvider::ScopedWriteLockGL::~ScopedWriteLockGL() {
1202 DCHECK(thread_checker_.CalledOnValidThread()); 1198 DCHECK(thread_checker_.CalledOnValidThread());
1203 Resource* resource = resource_provider_->GetResource(resource_id_); 1199 Resource* resource = resource_provider_->GetResource(resource_id_);
1204 DCHECK(resource->locked_for_write); 1200 DCHECK(resource->locked_for_write);
1205 // It's not sufficient to check sync_token_.HasData() here because the sync 1201 // It's not sufficient to check sync_token_.HasData() here because the sync
1206 // might be null because of context loss. Even in that case we want to set the 1202 // might be null because of context loss. Even in that case we want to set the
1207 // sync token because it's checked in PrepareSendToParent while drawing. 1203 // sync token because it's checked in PrepareSendToParent while drawing.
1208 if (has_sync_token_) 1204 if (has_sync_token_)
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1256 uint32_t flags = 1252 uint32_t flags =
1257 use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0; 1253 use_distance_field_text ? SkSurfaceProps::kUseDistanceFieldFonts_Flag : 0;
1258 // Use unknown pixel geometry to disable LCD text. 1254 // Use unknown pixel geometry to disable LCD text.
1259 SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry); 1255 SkSurfaceProps surface_props(flags, kUnknown_SkPixelGeometry);
1260 if (can_use_lcd_text) { 1256 if (can_use_lcd_text) {
1261 // LegacyFontHost will get LCD text and skia figures out what type to use. 1257 // LegacyFontHost will get LCD text and skia figures out what type to use.
1262 surface_props = 1258 surface_props =
1263 SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType); 1259 SkSurfaceProps(flags, SkSurfaceProps::kLegacyFontHost_InitType);
1264 } 1260 }
1265 sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget( 1261 sk_surface_ = SkSurface::MakeFromBackendTextureAsRenderTarget(
1266 context_provider->GrContext(), desc, resource_lock->sk_color_space(), 1262 context_provider->GrContext(), desc, nullptr, &surface_props);
1267 &surface_props);
1268 } 1263 }
1269 1264
1270 ResourceProvider::ScopedSkSurfaceProvider::~ScopedSkSurfaceProvider() { 1265 ResourceProvider::ScopedSkSurfaceProvider::~ScopedSkSurfaceProvider() {
1271 if (sk_surface_.get()) { 1266 if (sk_surface_.get()) {
1272 sk_surface_->prepareForExternalIO(); 1267 sk_surface_->prepareForExternalIO();
1273 sk_surface_.reset(); 1268 sk_surface_.reset();
1274 } 1269 }
1275 } 1270 }
1276 1271
1277 void ResourceProvider::PopulateSkBitmapWithResource(SkBitmap* sk_bitmap, 1272 void ResourceProvider::PopulateSkBitmapWithResource(SkBitmap* sk_bitmap,
1278 const Resource* resource) { 1273 const Resource* resource) {
1279 DCHECK_EQ(RGBA_8888, resource->format); 1274 DCHECK_EQ(RGBA_8888, resource->format);
1280 SkImageInfo info = SkImageInfo::MakeN32Premul( 1275 SkImageInfo info = SkImageInfo::MakeN32Premul(resource->size.width(),
1281 resource->size.width(), resource->size.height(), 1276 resource->size.height());
1282 GetResourceSkColorSpace(resource));
1283 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes()); 1277 sk_bitmap->installPixels(info, resource->pixels, info.minRowBytes());
1284 } 1278 }
1285 1279
1286 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware( 1280 ResourceProvider::ScopedReadLockSoftware::ScopedReadLockSoftware(
1287 ResourceProvider* resource_provider, 1281 ResourceProvider* resource_provider,
1288 ResourceId resource_id) 1282 ResourceId resource_id)
1289 : resource_provider_(resource_provider), resource_id_(resource_id) { 1283 : resource_provider_(resource_provider), resource_id_(resource_id) {
1290 const Resource* resource = resource_provider->LockForRead(resource_id); 1284 const Resource* resource = resource_provider->LockForRead(resource_id);
1291 resource_provider->PopulateSkBitmapWithResource(&sk_bitmap_, resource); 1285 resource_provider->PopulateSkBitmapWithResource(&sk_bitmap_, resource);
1292 } 1286 }
(...skipping 12 matching lines...) Expand all
1305 texture_info.fID = resource->gl_id; 1299 texture_info.fID = resource->gl_id;
1306 texture_info.fTarget = resource->target; 1300 texture_info.fTarget = resource->target;
1307 GrBackendTextureDesc desc; 1301 GrBackendTextureDesc desc;
1308 desc.fWidth = resource->size.width(); 1302 desc.fWidth = resource->size.width();
1309 desc.fHeight = resource->size.height(); 1303 desc.fHeight = resource->size.height();
1310 desc.fConfig = ToGrPixelConfig(resource->format); 1304 desc.fConfig = ToGrPixelConfig(resource->format);
1311 desc.fOrigin = kTopLeft_GrSurfaceOrigin; 1305 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
1312 desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info); 1306 desc.fTextureHandle = skia::GrGLTextureInfoToGrBackendObject(texture_info);
1313 sk_image_ = SkImage::MakeFromTexture( 1307 sk_image_ = SkImage::MakeFromTexture(
1314 resource_provider->compositor_context_provider_->GrContext(), desc, 1308 resource_provider->compositor_context_provider_->GrContext(), desc,
1315 kPremul_SkAlphaType, 1309 kPremul_SkAlphaType);
1316 resource_provider->GetResourceSkColorSpace(resource), nullptr, nullptr);
1317 } else if (resource->pixels) { 1310 } else if (resource->pixels) {
1318 SkBitmap sk_bitmap; 1311 SkBitmap sk_bitmap;
1319 resource_provider->PopulateSkBitmapWithResource(&sk_bitmap, resource); 1312 resource_provider->PopulateSkBitmapWithResource(&sk_bitmap, resource);
1320 sk_bitmap.setImmutable(); 1313 sk_bitmap.setImmutable();
1321 sk_image_ = SkImage::MakeFromBitmap(sk_bitmap); 1314 sk_image_ = SkImage::MakeFromBitmap(sk_bitmap);
1322 } else { 1315 } else {
1323 // During render process shutdown, ~RenderMessageFilter which calls 1316 // During render process shutdown, ~RenderMessageFilter which calls
1324 // ~HostSharedBitmapClient (which deletes shared bitmaps from child) 1317 // ~HostSharedBitmapClient (which deletes shared bitmaps from child)
1325 // can race with OnBeginFrameDeadline which draws a frame. 1318 // can race with OnBeginFrameDeadline which draws a frame.
1326 // In these cases, shared bitmaps (and this read lock) won't be valid. 1319 // In these cases, shared bitmaps (and this read lock) won't be valid.
1327 // Renderers need to silently handle locks failing until this race 1320 // Renderers need to silently handle locks failing until this race
1328 // is fixed. DCHECK that this is the only case where there are no pixels. 1321 // is fixed. DCHECK that this is the only case where there are no pixels.
1329 DCHECK(!resource->shared_bitmap_id.IsZero()); 1322 DCHECK(!resource->shared_bitmap_id.IsZero());
1330 } 1323 }
1331 } 1324 }
1332 1325
1333 ResourceProvider::ScopedReadLockSkImage::~ScopedReadLockSkImage() { 1326 ResourceProvider::ScopedReadLockSkImage::~ScopedReadLockSkImage() {
1334 resource_provider_->UnlockForRead(resource_id_); 1327 resource_provider_->UnlockForRead(resource_id_);
1335 } 1328 }
1336 1329
1337 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware( 1330 ResourceProvider::ScopedWriteLockSoftware::ScopedWriteLockSoftware(
1338 ResourceProvider* resource_provider, 1331 ResourceProvider* resource_provider,
1339 ResourceId resource_id) 1332 ResourceId resource_id)
1340 : resource_provider_(resource_provider), resource_id_(resource_id) { 1333 : resource_provider_(resource_provider), resource_id_(resource_id) {
1341 Resource* resource = resource_provider->LockForWrite(resource_id); 1334 Resource* resource = resource_provider->LockForWrite(resource_id);
1342 resource_provider->PopulateSkBitmapWithResource(&sk_bitmap_, resource); 1335 resource_provider->PopulateSkBitmapWithResource(&sk_bitmap_, resource);
1343 sk_color_space_ = resource_provider->GetResourceSkColorSpace(resource); 1336 color_space_ = resource_provider->GetResourceColorSpaceForRaster(resource);
1344 DCHECK(valid()); 1337 DCHECK(valid());
1345 } 1338 }
1346 1339
1347 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() { 1340 ResourceProvider::ScopedWriteLockSoftware::~ScopedWriteLockSoftware() {
1348 DCHECK(thread_checker_.CalledOnValidThread()); 1341 DCHECK(thread_checker_.CalledOnValidThread());
1349 Resource* resource = resource_provider_->GetResource(resource_id_); 1342 Resource* resource = resource_provider_->GetResource(resource_id_);
1350 DCHECK(resource); 1343 DCHECK(resource);
1351 resource->SetSynchronized(); 1344 resource->SetSynchronized();
1352 resource_provider_->UnlockForWrite(resource); 1345 resource_provider_->UnlockForWrite(resource);
1353 } 1346 }
1354 1347
1355 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: 1348 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
1356 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider, 1349 ScopedWriteLockGpuMemoryBuffer(ResourceProvider* resource_provider,
1357 ResourceId resource_id) 1350 ResourceId resource_id)
1358 : resource_provider_(resource_provider), resource_id_(resource_id) { 1351 : resource_provider_(resource_provider), resource_id_(resource_id) {
1359 Resource* resource = resource_provider->LockForWrite(resource_id); 1352 Resource* resource = resource_provider->LockForWrite(resource_id);
1360 DCHECK(IsGpuResourceType(resource->type)); 1353 DCHECK(IsGpuResourceType(resource->type));
1361 format_ = resource->format; 1354 format_ = resource->format;
1362 size_ = resource->size; 1355 size_ = resource->size;
1363 usage_ = resource->usage; 1356 usage_ = resource->usage;
1364 gpu_memory_buffer_ = std::move(resource->gpu_memory_buffer); 1357 gpu_memory_buffer_ = std::move(resource->gpu_memory_buffer);
1365 resource->gpu_memory_buffer = nullptr; 1358 resource->gpu_memory_buffer = nullptr;
1359 color_space_ = resource_provider->GetResourceColorSpaceForRaster(resource);
1366 } 1360 }
1367 1361
1368 ResourceProvider::ScopedWriteLockGpuMemoryBuffer:: 1362 ResourceProvider::ScopedWriteLockGpuMemoryBuffer::
1369 ~ScopedWriteLockGpuMemoryBuffer() { 1363 ~ScopedWriteLockGpuMemoryBuffer() {
1370 DCHECK(thread_checker_.CalledOnValidThread()); 1364 DCHECK(thread_checker_.CalledOnValidThread());
1371 Resource* resource = resource_provider_->GetResource(resource_id_); 1365 Resource* resource = resource_provider_->GetResource(resource_id_);
1372 DCHECK(resource); 1366 DCHECK(resource);
1373 if (gpu_memory_buffer_) { 1367 if (gpu_memory_buffer_) {
1374 // Note that this impacts overlay compositing, not rasterization. 1368 // Note that this impacts overlay compositing, not rasterization.
1375 if (resource_provider_->settings_.enable_color_correct_rasterization) 1369 if (resource_provider_->settings_.enable_color_correct_rasterization)
(...skipping 811 matching lines...) Expand 10 before | Expand all | Expand 10 after
2187 2181
2188 const int kImportance = 2; 2182 const int kImportance = 2;
2189 pmd->CreateSharedGlobalAllocatorDump(guid); 2183 pmd->CreateSharedGlobalAllocatorDump(guid);
2190 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance); 2184 pmd->AddOwnershipEdge(dump->guid(), guid, kImportance);
2191 } 2185 }
2192 2186
2193 return true; 2187 return true;
2194 } 2188 }
2195 2189
2196 } // namespace cc 2190 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698