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

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

Issue 2949303002: Handle RGBA_4444 scales in > max texture size images (Closed)
Patch Set: Created 3 years, 6 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
« no previous file with comments | « no previous file | cc/tiles/gpu_image_decode_cache_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 return MipMapUtil::GetScaleAdjustmentForLevel(base_size, mip_level); 103 return MipMapUtil::GetScaleAdjustmentForLevel(base_size, mip_level);
104 } 104 }
105 105
106 // Calculates the size of a given mip level. 106 // Calculates the size of a given mip level.
107 gfx::Size CalculateSizeForMipLevel(const DrawImage& draw_image, int mip_level) { 107 gfx::Size CalculateSizeForMipLevel(const DrawImage& draw_image, int mip_level) {
108 gfx::Size base_size(draw_image.image()->width(), 108 gfx::Size base_size(draw_image.image()->width(),
109 draw_image.image()->height()); 109 draw_image.image()->height());
110 return MipMapUtil::GetSizeForLevel(base_size, mip_level); 110 return MipMapUtil::GetSizeForLevel(base_size, mip_level);
111 } 111 }
112 112
113 // Draws and scales the provided |draw_image| into the |target_pixmap|. If the
114 // draw/scale can be done directly, calls directly into SkImage::scalePixels,
115 // if not, decodes to a compatible temporary pixmap and then converts that into
116 // the |target_pixmap|.
117 bool DrawAndScaleImage(const DrawImage& draw_image, SkPixmap* target_pixmap) {
118 const SkImage* image = draw_image.image().get();
119 if (image->dimensions() == target_pixmap->bounds().size() ||
120 target_pixmap->info().colorType() == kN32_SkColorType) {
121 // If no scaling is occurring, or if the target colortype is already N32,
122 // just scale directly.
123 return image->scalePixels(*target_pixmap,
124 CalculateUploadScaleFilterQuality(draw_image),
125 SkImage::kDisallow_CachingHint);
126 }
127
128 // If the target colortype is not N32, it may be impossible to scale
129 // directly. Instead scale into an N32 pixmap, and convert that into the
130 // |target_pixmap|.
131 SkImageInfo decode_info =
132 target_pixmap->info().makeColorType(kN32_SkColorType);
133 SkBitmap decode_bitmap;
134 if (!decode_bitmap.tryAllocPixels(decode_info))
135 return false;
136 SkPixmap decode_pixmap(decode_bitmap.info(), decode_bitmap.getPixels(),
137 decode_bitmap.rowBytes());
138 if (!image->scalePixels(decode_pixmap,
139 CalculateUploadScaleFilterQuality(draw_image),
140 SkImage::kDisallow_CachingHint))
141 return false;
142 return decode_pixmap.readPixels(*target_pixmap);
143 }
144
113 } // namespace 145 } // namespace
114 146
115 // static 147 // static
116 GpuImageDecodeCache::InUseCacheKey 148 GpuImageDecodeCache::InUseCacheKey
117 GpuImageDecodeCache::InUseCacheKey::FromDrawImage(const DrawImage& draw_image) { 149 GpuImageDecodeCache::InUseCacheKey::FromDrawImage(const DrawImage& draw_image) {
118 return InUseCacheKey(draw_image); 150 return InUseCacheKey(draw_image);
119 } 151 }
120 152
121 // Extract the information to uniquely identify a DrawImage for the purposes of 153 // Extract the information to uniquely identify a DrawImage for the purposes of
122 // the |in_use_cache_|. 154 // the |in_use_cache_|.
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after
1101 case DecodedDataMode::CPU: { 1133 case DecodedDataMode::CPU: {
1102 SkImageInfo image_info = CreateImageInfoForDrawImage( 1134 SkImageInfo image_info = CreateImageInfoForDrawImage(
1103 draw_image, image_data->upload_params.fPreScaleMipLevel); 1135 draw_image, image_data->upload_params.fPreScaleMipLevel);
1104 // In order to match GPU scaling quality (which uses mip-maps at high 1136 // In order to match GPU scaling quality (which uses mip-maps at high
1105 // quality), we want to use at most medium filter quality for the 1137 // quality), we want to use at most medium filter quality for the
1106 // scale. 1138 // scale.
1107 SkPixmap image_pixmap(image_info.makeColorSpace(nullptr), 1139 SkPixmap image_pixmap(image_info.makeColorSpace(nullptr),
1108 backing_memory->data(), image_info.minRowBytes()); 1140 backing_memory->data(), image_info.minRowBytes());
1109 // Note that scalePixels falls back to readPixels if the scale is 1x, so 1141 // Note that scalePixels falls back to readPixels if the scale is 1x, so
1110 // no need to special case that as an optimization. 1142 // no need to special case that as an optimization.
1111 if (!draw_image.image()->scalePixels( 1143 if (!DrawAndScaleImage(draw_image, &image_pixmap)) {
1112 image_pixmap, CalculateUploadScaleFilterQuality(draw_image),
1113 SkImage::kDisallow_CachingHint)) {
1114 DLOG(ERROR) << "scalePixels failed."; 1144 DLOG(ERROR) << "scalePixels failed.";
1115 backing_memory->Unlock(); 1145 backing_memory->Unlock();
1116 backing_memory.reset(); 1146 backing_memory.reset();
1117 } 1147 }
1118 break; 1148 break;
1119 } 1149 }
1120 case DecodedDataMode::GPU: { 1150 case DecodedDataMode::GPU: {
1121 // TODO(crbug.com/649167): Params should not have changed since initial 1151 // TODO(crbug.com/649167): Params should not have changed since initial
1122 // sizing. Somehow this still happens. We should investigate and re-add 1152 // sizing. Somehow this still happens. We should investigate and re-add
1123 // DCHECKs here to enforce this. 1153 // DCHECKs here to enforce this.
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
1345 1375
1346 void GpuImageDecodeCache::OnPurgeMemory() { 1376 void GpuImageDecodeCache::OnPurgeMemory() {
1347 base::AutoLock lock(lock_); 1377 base::AutoLock lock(lock_);
1348 // Temporary changes |memory_state_| to free up cache as much as possible. 1378 // Temporary changes |memory_state_| to free up cache as much as possible.
1349 base::AutoReset<base::MemoryState> reset(&memory_state_, 1379 base::AutoReset<base::MemoryState> reset(&memory_state_,
1350 base::MemoryState::SUSPENDED); 1380 base::MemoryState::SUSPENDED);
1351 EnsureCapacity(0); 1381 EnsureCapacity(0);
1352 } 1382 }
1353 1383
1354 } // namespace cc 1384 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/tiles/gpu_image_decode_cache_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698