| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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(), ¶ms, 1, nullptr, | 1227 *context_threadsafe_proxy_.get(), ¶ms, 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 Loading... |
| 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 |
| OLD | NEW |