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

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: Add #define to not always compile in ETC1 support 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
« no previous file with comments | « src/gpu/GrGpu.cpp ('k') | src/gpu/gl/GrGpuGL.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 #if SK_SUPPORT_ETC1
19 # include "etc1.h"
20 #endif
14 21
15 /* Fill out buffer with the compressed format Ganesh expects from a colortable 22 /* Fill out buffer with the compressed format Ganesh expects from a colortable
16 based bitmap. [palette (colortable) + indices]. 23 based bitmap. [palette (colortable) + indices].
17 24
18 At the moment Ganesh only supports 8bit version. If Ganesh allowed we others 25 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 26 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 27 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. 28 slower than memcpy), so skipping that for now.
22 29
23 Ganesh wants a full 256 palette entry, even though Skia's ctable is only as big 30 Ganesh wants a full 256 palette entry, even though Skia's ctable is only as big
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 } 124 }
118 }; 125 };
119 126
120 } // namespace 127 } // namespace
121 128
122 static void add_genID_listener(GrResourceKey key, SkPixelRef* pixelRef) { 129 static void add_genID_listener(GrResourceKey key, SkPixelRef* pixelRef) {
123 SkASSERT(NULL != pixelRef); 130 SkASSERT(NULL != pixelRef);
124 pixelRef->addGenIDChangeListener(SkNEW_ARGS(GrResourceInvalidator, (key))); 131 pixelRef->addGenIDChangeListener(SkNEW_ARGS(GrResourceInvalidator, (key)));
125 } 132 }
126 133
134 #if SK_SUPPORT_ETC1
135 static GrTexture *load_etc1_texture(GrContext* ctx,
136 const GrTextureParams* params,
137 const SkBitmap &bm, GrTextureDesc desc) {
138 SkData *data = bm.pixelRef()->refEncodedData();
139
140 // Is this even encoded data?
141 if (NULL == data) {
142 return NULL;
143 }
144
145 // Is this a valid PKM encoded data?
146 const uint8_t *bytes = data->bytes();
147 if (!etc1_pkm_is_valid(bytes)) {
148 return NULL;
149 }
150
151 uint32_t encodedWidth = etc1_pkm_get_width(bytes);
152 uint32_t encodedHeight = etc1_pkm_get_height(bytes);
153
154 // Does the data match the dimensions of the bitmap? If not,
155 // then we don't know how to scale the image to match it...
156 if (encodedWidth != static_cast<uint32_t>(bm.width()) ||
157 encodedHeight != static_cast<uint32_t>(bm.height())) {
158 return NULL;
159 }
160
161 // Everything seems good... skip ahead to the data.
162 bytes += ETC_PKM_HEADER_SIZE;
163 desc.fConfig = kETC1_GrPixelConfig;
164
165 // This texture is likely to be used again so leave it in the cache
166 GrCacheID cacheID;
167 generate_bitmap_cache_id(bm, &cacheID);
168
169 GrResourceKey key;
170 GrTexture* result = ctx->createTexture(params, desc, cacheID, bytes, 0, &key );
171 if (NULL != result) {
172 add_genID_listener(key, bm.pixelRef());
173 }
174 return result;
175 }
176 #endif // SK_SUPPORT_ETC1
177
127 static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx, 178 static GrTexture* sk_gr_create_bitmap_texture(GrContext* ctx,
128 bool cache, 179 bool cache,
129 const GrTextureParams* params, 180 const GrTextureParams* params,
130 const SkBitmap& origBitmap) { 181 const SkBitmap& origBitmap) {
131 SkBitmap tmpBitmap; 182 SkBitmap tmpBitmap;
132 183
133 const SkBitmap* bitmap = &origBitmap; 184 const SkBitmap* bitmap = &origBitmap;
134 185
135 GrTextureDesc desc; 186 GrTextureDesc desc;
136 generate_bitmap_texture_desc(*bitmap, &desc); 187 generate_bitmap_texture_desc(*bitmap, &desc);
(...skipping 28 matching lines...) Expand all
165 bitmap->height(), desc.fConfig, 216 bitmap->height(), desc.fConfig,
166 storage.get()); 217 storage.get());
167 return result; 218 return result;
168 } 219 }
169 } else { 220 } else {
170 origBitmap.copyTo(&tmpBitmap, kN32_SkColorType); 221 origBitmap.copyTo(&tmpBitmap, kN32_SkColorType);
171 // now bitmap points to our temp, which has been promoted to 32bits 222 // now bitmap points to our temp, which has been promoted to 32bits
172 bitmap = &tmpBitmap; 223 bitmap = &tmpBitmap;
173 desc.fConfig = SkImageInfo2GrPixelConfig(bitmap->info()); 224 desc.fConfig = SkImageInfo2GrPixelConfig(bitmap->info());
174 } 225 }
226
227 // Is this an ETC1 encoded texture?
228 #if SK_SUPPORT_ETC1
229 } else if (cache && ctx->getGpu()->caps()->isConfigTexturable(kETC1_GrPixelC onfig)) {
230 GrTexture *texture = load_etc1_texture(ctx, params, *bitmap, desc);
231 if (NULL != texture) {
232 return texture;
233 }
175 } 234 }
235 #endif // SK_SUPPORT_ETC1
176 236
177 SkAutoLockPixels alp(*bitmap); 237 SkAutoLockPixels alp(*bitmap);
178 if (!bitmap->readyToDraw()) { 238 if (!bitmap->readyToDraw()) {
179 return NULL; 239 return NULL;
180 } 240 }
181 if (cache) { 241 if (cache) {
182 // This texture is likely to be used again so leave it in the cache 242 // This texture is likely to be used again so leave it in the cache
183 GrCacheID cacheID; 243 GrCacheID cacheID;
184 generate_bitmap_cache_id(origBitmap, &cacheID); 244 generate_bitmap_cache_id(origBitmap, &cacheID);
185 245
(...skipping 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 copy.setShader(NULL); 492 copy.setShader(NULL);
433 // modulate the paint alpha by the shader's solid color alpha 493 // modulate the paint alpha by the shader's solid color alpha
434 U8CPU newA = SkMulDiv255Round(SkColorGetA(color), copy.getAlpha()); 494 U8CPU newA = SkMulDiv255Round(SkColorGetA(color), copy.getAlpha());
435 copy.setColor(SkColorSetA(color, newA)); 495 copy.setColor(SkColorSetA(color, newA));
436 SkPaint2GrPaintNoShader(context, copy, false, constantColor, grPaint ); 496 SkPaint2GrPaintNoShader(context, copy, false, constantColor, grPaint );
437 } else { 497 } else {
438 SkPaint2GrPaintNoShader(context, skPaint, false, constantColor, grPa int); 498 SkPaint2GrPaintNoShader(context, skPaint, false, constantColor, grPa int);
439 } 499 }
440 } 500 }
441 } 501 }
OLDNEW
« no previous file with comments | « src/gpu/GrGpu.cpp ('k') | src/gpu/gl/GrGpuGL.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698