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

Side by Side Diff: src/gpu/SkGr.cpp

Issue 302783002: Initial work to get ETC1 data up to the GPU (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix GCC warning Created 6 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
OLDNEW
1 /* 1 /*
2 * Copyright 2010 Google Inc. 2 * Copyright 2010 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkGr.h" 8 #include "SkGr.h"
9 #include "SkColorFilter.h" 9 #include "SkColorFilter.h"
10 #include "SkConfig8888.h" 10 #include "SkConfig8888.h"
11 #include "SkData.h"
11 #include "SkMessageBus.h" 12 #include "SkMessageBus.h"
12 #include "SkPixelRef.h" 13 #include "SkPixelRef.h"
13 #include "GrResourceCache.h" 14 #include "GrResourceCache.h"
15 #include "GrGpu.h"
16 #include "GrDrawTargetCaps.h"
17
18 #include "etc1.h"
14 19
15 /* Fill out buffer with the compressed format Ganesh expects from a colortable 20 /* Fill out buffer with the compressed format Ganesh expects from a colortable
16 based bitmap. [palette (colortable) + indices]. 21 based bitmap. [palette (colortable) + indices].
17 22
18 At the moment Ganesh only supports 8bit version. If Ganesh allowed we others 23 At the moment Ganesh only supports 8bit version. If Ganesh allowed we others
19 we could detect that the colortable.count is <= 16, and then repack the 24 we could detect that the colortable.count is <= 16, and then repack the
20 indices as nibbles to save RAM, but it would take more time (i.e. a lot 25 indices as nibbles to save RAM, but it would take more time (i.e. a lot
21 slower than memcpy), so skipping that for now. 26 slower than memcpy), so skipping that for now.
22 27
23 Ganesh wants a full 256 palette entry, even though Skia's ctable is only as big 28 Ganesh wants a full 256 palette entry, even though Skia's ctable is only as big
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 bitmap->height(), desc.fConfig, 170 bitmap->height(), desc.fConfig,
166 storage.get()); 171 storage.get());
167 return result; 172 return result;
168 } 173 }
169 } else { 174 } else {
170 origBitmap.copyTo(&tmpBitmap, kN32_SkColorType); 175 origBitmap.copyTo(&tmpBitmap, kN32_SkColorType);
171 // now bitmap points to our temp, which has been promoted to 32bits 176 // now bitmap points to our temp, which has been promoted to 32bits
172 bitmap = &tmpBitmap; 177 bitmap = &tmpBitmap;
173 desc.fConfig = SkImageInfo2GrPixelConfig(bitmap->info()); 178 desc.fConfig = SkImageInfo2GrPixelConfig(bitmap->info());
174 } 179 }
180 } else if (cache && ctx->getGpu()->caps()->isConfigTexturable(kETC1_GrPixelC onfig)) {
181 SkData *data = bitmap->pixelRef()->refEncodedData();
robertphillips 2014/05/30 15:00:22 What do you think about making this a static funct
krajcevski 2014/05/30 16:21:50 Sounds good to me. Done.
182 do {
183 // Is this even encoded data?
184 if (NULL == data) {
185 break;
186 }
187
188 // Is this a valid PKM encoded data?
189 const uint8_t *bytes = data->bytes();
190 if (!etc1_pkm_is_valid(bytes)) {
191 break;
192 }
193
194 uint32_t encodedWidth = etc1_pkm_get_width(bytes);
195 uint32_t encodedHeight = etc1_pkm_get_height(bytes);
196
197 // Does the data match the dimensions of the bitmap? If not,
198 // then we don't know how to scale the image to match it...
199 if (encodedWidth != static_cast<uint32_t>(bitmap->width()) ||
200 encodedHeight != static_cast<uint32_t>(bitmap->height())) {
201 break;
202 }
203
204 // Everything seems good... skip ahead to the data.
205 bytes += ETC_PKM_HEADER_SIZE;
206 desc.fConfig = kETC1_GrPixelConfig;
207
208 // This texture is likely to be used again so leave it in the cache
209 GrCacheID cacheID;
210 generate_bitmap_cache_id(origBitmap, &cacheID);
211
212 GrResourceKey key;
213 GrTexture* result = ctx->createTexture(params, desc, cacheID, bytes, 0, &key);
214 if (NULL != result) {
215 add_genID_listener(key, origBitmap.pixelRef());
216 }
217 return result;
218
219 } while(0);
175 } 220 }
176 221
177 SkAutoLockPixels alp(*bitmap); 222 SkAutoLockPixels alp(*bitmap);
178 if (!bitmap->readyToDraw()) { 223 if (!bitmap->readyToDraw()) {
179 return NULL; 224 return NULL;
180 } 225 }
181 if (cache) { 226 if (cache) {
182 // This texture is likely to be used again so leave it in the cache 227 // This texture is likely to be used again so leave it in the cache
183 GrCacheID cacheID; 228 GrCacheID cacheID;
184 generate_bitmap_cache_id(origBitmap, &cacheID); 229 generate_bitmap_cache_id(origBitmap, &cacheID);
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 copy.setShader(NULL); 477 copy.setShader(NULL);
433 // modulate the paint alpha by the shader's solid color alpha 478 // modulate the paint alpha by the shader's solid color alpha
434 U8CPU newA = SkMulDiv255Round(SkColorGetA(color), copy.getAlpha()); 479 U8CPU newA = SkMulDiv255Round(SkColorGetA(color), copy.getAlpha());
435 copy.setColor(SkColorSetA(color, newA)); 480 copy.setColor(SkColorSetA(color, newA));
436 SkPaint2GrPaintNoShader(context, copy, false, constantColor, grPaint ); 481 SkPaint2GrPaintNoShader(context, copy, false, constantColor, grPaint );
437 } else { 482 } else {
438 SkPaint2GrPaintNoShader(context, skPaint, false, constantColor, grPa int); 483 SkPaint2GrPaintNoShader(context, skPaint, false, constantColor, grPa int);
439 } 484 }
440 } 485 }
441 } 486 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698