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

Side by Side Diff: cc/tiles/gpu_image_decode_cache.cc

Issue 2801413002: color: Enable color conversion in image decoder caches (Closed)
Patch Set: Created 3 years, 8 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/tiles/gpu_image_decode_cache.h" 5 #include "cc/tiles/gpu_image_decode_cache.h"
6 6
7 #include <inttypes.h> 7 #include <inttypes.h>
8 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/debug/alias.h" 10 #include "base/debug/alias.h"
(...skipping 1072 matching lines...) Expand 10 before | Expand all | Expand 10 after
1083 return; 1083 return;
1084 } 1084 }
1085 1085
1086 TRACE_EVENT0("cc", "GpuImageDecodeCache::DecodeImage"); 1086 TRACE_EVENT0("cc", "GpuImageDecodeCache::DecodeImage");
1087 1087
1088 image_data->decode.ResetData(); 1088 image_data->decode.ResetData();
1089 std::unique_ptr<base::DiscardableMemory> backing_memory; 1089 std::unique_ptr<base::DiscardableMemory> backing_memory;
1090 { 1090 {
1091 base::AutoUnlock unlock(lock_); 1091 base::AutoUnlock unlock(lock_);
1092 1092
1093 // TODO(ccameron,msarett): This does color conversion on the CPU side. Move
1094 // this conversion to UploadImageIfNecessary.
1095 sk_sp<const SkImage> decoder_image = draw_image.image();
1096 if (draw_image.target_color_space().IsValid()) {
1097 decoder_image = decoder_image->makeColorSpace(
1098 draw_image.target_color_space().ToSkColorSpace(),
1099 SkTransferFunctionBehavior::kIgnore);
1100 }
1101
1093 backing_memory = base::DiscardableMemoryAllocator::GetInstance() 1102 backing_memory = base::DiscardableMemoryAllocator::GetInstance()
1094 ->AllocateLockedDiscardableMemory(image_data->size); 1103 ->AllocateLockedDiscardableMemory(image_data->size);
1095 1104
1096 switch (image_data->mode) { 1105 switch (image_data->mode) {
1097 case DecodedDataMode::CPU: { 1106 case DecodedDataMode::CPU: {
1098 SkImageInfo image_info = CreateImageInfoForDrawImage( 1107 SkImageInfo image_info = CreateImageInfoForDrawImage(
1099 draw_image, image_data->upload_params.fPreScaleMipLevel); 1108 draw_image, image_data->upload_params.fPreScaleMipLevel);
1100 // In order to match GPU scaling quality (which uses mip-maps at high 1109 // In order to match GPU scaling quality (which uses mip-maps at high
1101 // quality), we want to use at most medium filter quality for the 1110 // quality), we want to use at most medium filter quality for the
1102 // scale. 1111 // scale.
1103 SkPixmap image_pixmap(image_info, backing_memory->data(), 1112 SkPixmap image_pixmap(image_info, backing_memory->data(),
1104 image_info.minRowBytes()); 1113 image_info.minRowBytes());
1105 // Note that scalePixels falls back to readPixels if the sale is 1x, so 1114 // Note that scalePixels falls back to readPixels if the sale is 1x, so
1106 // no need to special case that as an optimization. 1115 // no need to special case that as an optimization.
1107 if (!draw_image.image()->scalePixels( 1116 if (!decoder_image->scalePixels(
1108 image_pixmap, CalculateUploadScaleFilterQuality(draw_image), 1117 image_pixmap, CalculateUploadScaleFilterQuality(draw_image),
1109 SkImage::kDisallow_CachingHint)) { 1118 SkImage::kDisallow_CachingHint)) {
1110 DLOG(ERROR) << "scalePixels failed."; 1119 DLOG(ERROR) << "scalePixels failed.";
1111 backing_memory->Unlock(); 1120 backing_memory->Unlock();
1112 backing_memory.reset(); 1121 backing_memory.reset();
1113 } 1122 }
1114 break; 1123 break;
1115 } 1124 }
1116 case DecodedDataMode::GPU: { 1125 case DecodedDataMode::GPU: {
1117 // TODO(crbug.com/649167): Params should not have changed since initial 1126 // TODO(crbug.com/649167): Params should not have changed since initial
1118 // sizing. Somehow this still happens. We should investigate and re-add 1127 // sizing. Somehow this still happens. We should investigate and re-add
1119 // DCHECKs here to enforce this. 1128 // DCHECKs here to enforce this.
1120 if (!draw_image.image()->getDeferredTextureImageData( 1129 if (!decoder_image->getDeferredTextureImageData(
1121 *context_threadsafe_proxy_.get(), &image_data->upload_params, 1, 1130 *context_threadsafe_proxy_.get(), &image_data->upload_params, 1,
1122 backing_memory->data(), nullptr)) { 1131 backing_memory->data(), nullptr)) {
1123 DLOG(ERROR) << "getDeferredTextureImageData failed despite params " 1132 DLOG(ERROR) << "getDeferredTextureImageData failed despite params "
1124 << "having validated."; 1133 << "having validated.";
1125 backing_memory->Unlock(); 1134 backing_memory->Unlock();
1126 backing_memory.reset(); 1135 backing_memory.reset();
1127 } 1136 }
1128 break; 1137 break;
1129 } 1138 }
1130 } 1139 }
1131 } 1140 }
1132 1141
1133 // TODO(ccameron,msarett): Convert image to target color space.
1134 // http://crbug.com/706613
1135
1136 if (image_data->decode.data()) { 1142 if (image_data->decode.data()) {
1137 // An at-raster task decoded this before us. Ingore our decode. 1143 // An at-raster task decoded this before us. Ingore our decode.
1138 return; 1144 return;
1139 } 1145 }
1140 1146
1141 if (!backing_memory) { 1147 if (!backing_memory) {
1142 // If |backing_memory| was not populated, we had a non-decodable image. 1148 // If |backing_memory| was not populated, we had a non-decodable image.
1143 image_data->decode.decode_failure = true; 1149 image_data->decode.decode_failure = true;
1144 return; 1150 return;
1145 } 1151 }
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1186 break; 1192 break;
1187 } 1193 }
1188 case DecodedDataMode::GPU: { 1194 case DecodedDataMode::GPU: {
1189 uploaded_image = SkImage::MakeFromDeferredTextureImageData( 1195 uploaded_image = SkImage::MakeFromDeferredTextureImageData(
1190 context_->GrContext(), image_data->decode.data()->data(), 1196 context_->GrContext(), image_data->decode.data()->data(),
1191 SkBudgeted::kNo); 1197 SkBudgeted::kNo);
1192 break; 1198 break;
1193 } 1199 }
1194 } 1200 }
1195 } 1201 }
1202
1203 // TODO(ccameron,msarett): Convert image to target color space using
1204 // makeColorSpace here. http://crbug.com/706613
1205
1196 image_data->decode.mark_used(); 1206 image_data->decode.mark_used();
1197 DCHECK(uploaded_image); 1207 DCHECK(uploaded_image);
1198 1208
1199 // At-raster may have decoded this while we were unlocked. If so, ignore our 1209 // At-raster may have decoded this while we were unlocked. If so, ignore our
1200 // result. 1210 // result.
1201 if (!image_data->upload.image()) 1211 if (!image_data->upload.image())
1202 image_data->upload.SetImage(std::move(uploaded_image)); 1212 image_data->upload.SetImage(std::move(uploaded_image));
1203 } 1213 }
1204 1214
1205 scoped_refptr<GpuImageDecodeCache::ImageData> 1215 scoped_refptr<GpuImageDecodeCache::ImageData>
1206 GpuImageDecodeCache::CreateImageData(const DrawImage& draw_image) { 1216 GpuImageDecodeCache::CreateImageData(const DrawImage& draw_image) {
1207 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"), 1217 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug"),
1208 "GpuImageDecodeCache::CreateImageData"); 1218 "GpuImageDecodeCache::CreateImageData");
1209 lock_.AssertAcquired(); 1219 lock_.AssertAcquired();
1210 1220
1211 DecodedDataMode mode; 1221 DecodedDataMode mode;
1212 int upload_scale_mip_level = CalculateUploadScaleMipLevel(draw_image); 1222 int upload_scale_mip_level = CalculateUploadScaleMipLevel(draw_image);
1213 auto params = SkImage::DeferredTextureImageUsageParams( 1223 auto params = SkImage::DeferredTextureImageUsageParams(
1214 draw_image.matrix(), CalculateUploadScaleFilterQuality(draw_image), 1224 draw_image.matrix(), CalculateUploadScaleFilterQuality(draw_image),
1215 upload_scale_mip_level); 1225 upload_scale_mip_level);
1216 size_t data_size = draw_image.image()->getDeferredTextureImageData( 1226 size_t data_size = draw_image.image()->getDeferredTextureImageData(
1217 *context_threadsafe_proxy_.get(), &params, 1, nullptr, 1227 *context_threadsafe_proxy_.get(), &params, 1, nullptr, nullptr);
1218 draw_image.target_color_space().ToSkColorSpace().get());
1219 1228
1220 if (data_size == 0) { 1229 if (data_size == 0) {
1221 // Can't upload image, too large or other failure. Try to use SW fallback. 1230 // Can't upload image, too large or other failure. Try to use SW fallback.
1222 SkImageInfo image_info = 1231 SkImageInfo image_info =
1223 CreateImageInfoForDrawImage(draw_image, upload_scale_mip_level); 1232 CreateImageInfoForDrawImage(draw_image, upload_scale_mip_level);
1224 data_size = image_info.getSafeSize(image_info.minRowBytes()); 1233 data_size = image_info.getSafeSize(image_info.minRowBytes());
1225 mode = DecodedDataMode::CPU; 1234 mode = DecodedDataMode::CPU;
1226 } else { 1235 } else {
1227 mode = DecodedDataMode::GPU; 1236 mode = DecodedDataMode::GPU;
1228 } 1237 }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
1335 1344
1336 void GpuImageDecodeCache::OnPurgeMemory() { 1345 void GpuImageDecodeCache::OnPurgeMemory() {
1337 base::AutoLock lock(lock_); 1346 base::AutoLock lock(lock_);
1338 // Temporary changes |memory_state_| to free up cache as much as possible. 1347 // Temporary changes |memory_state_| to free up cache as much as possible.
1339 base::AutoReset<base::MemoryState> reset(&memory_state_, 1348 base::AutoReset<base::MemoryState> reset(&memory_state_,
1340 base::MemoryState::SUSPENDED); 1349 base::MemoryState::SUSPENDED);
1341 EnsureCapacity(0); 1350 EnsureCapacity(0);
1342 } 1351 }
1343 1352
1344 } // namespace cc 1353 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698