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

Side by Side Diff: src/gpu/text/GrAtlasTextBlob_regenInBatch.cpp

Issue 1983353003: Attempt to improve lifetime management of SkGlyphCache in Ganesh atlas text code. (Closed) Base URL: https://skia.googlesource.com/skia.git@fixtest
Patch Set: Updated to only compare descriptors Created 4 years, 7 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/text/GrAtlasTextBlob.h ('k') | no next file » | 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 2016 Google Inc. 2 * Copyright 2016 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 "GrAtlasTextBlob.h" 8 #include "GrAtlasTextBlob.h"
9 9
10 #include "GrBatchFlushState.h" 10 #include "GrBatchFlushState.h"
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 textureCoords[0] = (uint16_t)u1; 135 textureCoords[0] = (uint16_t)u1;
136 textureCoords[1] = (uint16_t)v0; 136 textureCoords[1] = (uint16_t)v0;
137 } 137 }
138 } 138 }
139 139
140 template <bool regenPos, bool regenCol, bool regenTexCoords, bool regenGlyphs> 140 template <bool regenPos, bool regenCol, bool regenTexCoords, bool regenGlyphs>
141 void GrAtlasTextBlob::regenInBatch(GrDrawBatch::Target* target, 141 void GrAtlasTextBlob::regenInBatch(GrDrawBatch::Target* target,
142 GrBatchFontCache* fontCache, 142 GrBatchFontCache* fontCache,
143 GrBlobRegenHelper *helper, 143 GrBlobRegenHelper *helper,
144 Run* run, 144 Run* run,
145 Run::SubRunInfo* info, SkGlyphCache** cache, 145 Run::SubRunInfo* info,
146 SkTypeface** typeface, 146 SkAutoGlyphCache* lazyCache,
147 const SkDescriptor** desc,
148 int glyphCount, size_t vertexStride, 147 int glyphCount, size_t vertexStride,
149 GrColor color, SkScalar transX, 148 GrColor color, SkScalar transX,
150 SkScalar transY) const { 149 SkScalar transY) const {
150 SkASSERT(lazyCache);
151 static_assert(!regenGlyphs || regenTexCoords, "must regenTexCoords along reg enGlyphs"); 151 static_assert(!regenGlyphs || regenTexCoords, "must regenTexCoords along reg enGlyphs");
152 GrBatchTextStrike* strike = nullptr; 152 GrBatchTextStrike* strike = nullptr;
153 if (regenTexCoords) { 153 if (regenTexCoords) {
154 info->resetBulkUseToken(); 154 info->resetBulkUseToken();
155 155
156 // We can reuse if we have a valid strike and our descriptors / typeface are the 156 const SkDescriptor* desc = (run->fOverrideDescriptor && !info->drawAsDis tanceFields())
157 // same. The override descriptor is only for the non distance field tex t within 157 ? run->fOverrideDescriptor->getDesc()
158 // a run 158 : run->fDescriptor.getDesc();
159 const SkDescriptor* newDesc = (run->fOverrideDescriptor && !info->drawAs DistanceFields()) ? 159
160 run->fOverrideDescriptor->getDesc() : 160 if (!*lazyCache || (*lazyCache)->getDescriptor() != *desc) {
161 run->fDescriptor.getDesc(); 161 lazyCache->reset(SkGlyphCache::DetachCache(run->fTypeface, run->fEff ects, desc));
162 if (!*cache || !SkTypeface::Equal(*typeface, run->fTypeface) ||
163 !(**desc == *newDesc)) {
164 if (*cache) {
165 SkGlyphCache::AttachCache(*cache);
166 }
167 *desc = newDesc;
168 *cache = SkGlyphCache::DetachCache(run->fTypeface, run->fEffects, *d esc);
169 *typeface = run->fTypeface;
170 } 162 }
171 163
172 if (regenGlyphs) { 164 if (regenGlyphs) {
173 strike = fontCache->getStrike(*cache); 165 strike = fontCache->getStrike(lazyCache->get());
174 } else { 166 } else {
175 strike = info->strike(); 167 strike = info->strike();
176 } 168 }
177 } 169 }
178 170
179 bool brokenRun = false; 171 bool brokenRun = false;
180 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) { 172 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) {
181 GrGlyph* glyph = nullptr; 173 GrGlyph* glyph = nullptr;
182 int log2Width = 0, log2Height = 0; 174 int log2Width = 0, log2Height = 0;
183 if (regenTexCoords) { 175 if (regenTexCoords) {
184 size_t glyphOffset = glyphIdx + info->glyphStartIndex(); 176 size_t glyphOffset = glyphIdx + info->glyphStartIndex();
185 177
186 if (regenGlyphs) { 178 if (regenGlyphs) {
187 // Get the id from the old glyph, and use the new strike to look up 179 // Get the id from the old glyph, and use the new strike to look up
188 // the glyph. 180 // the glyph.
189 GrGlyph::PackedID id = fGlyphs[glyphOffset]->fPackedID; 181 GrGlyph::PackedID id = fGlyphs[glyphOffset]->fPackedID;
190 fGlyphs[glyphOffset] = strike->getGlyph(id, info->maskFormat(), *cache); 182 fGlyphs[glyphOffset] = strike->getGlyph(id, info->maskFormat(), lazyCache->get());
191 SkASSERT(id == fGlyphs[glyphOffset]->fPackedID); 183 SkASSERT(id == fGlyphs[glyphOffset]->fPackedID);
192 } 184 }
193 glyph = fGlyphs[glyphOffset]; 185 glyph = fGlyphs[glyphOffset];
194 SkASSERT(glyph && glyph->fMaskFormat == info->maskFormat()); 186 SkASSERT(glyph && glyph->fMaskFormat == info->maskFormat());
195 187
196 if (!fontCache->hasGlyph(glyph) && 188 if (!fontCache->hasGlyph(glyph) &&
197 !strike->addGlyphToAtlas(target, glyph, *cache, info->maskFormat ())) { 189 !strike->addGlyphToAtlas(target, glyph, lazyCache->get(), info-> maskFormat())) {
198 helper->flush(); 190 helper->flush();
199 brokenRun = glyphIdx > 0; 191 brokenRun = glyphIdx > 0;
200 192
201 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(target, 193 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas(target,
202 glyph, 194 glyph,
203 *cache, 195 lazyCache->g et(),
204 info->maskFo rmat()); 196 info->maskFo rmat());
205 SkASSERT(success); 197 SkASSERT(success);
206 } 198 }
207 fontCache->addGlyphToBulkAndSetUseToken(info->bulkUseToken(), glyph, 199 fontCache->addGlyphToBulkAndSetUseToken(info->bulkUseToken(), glyph,
208 target->nextDrawToken()); 200 target->nextDrawToken());
209 log2Width = fontCache->log2Width(info->maskFormat()); 201 log2Width = fontCache->log2Width(info->maskFormat());
210 log2Height = fontCache->log2Height(info->maskFormat()); 202 log2Height = fontCache->log2Height(info->maskFormat());
211 } 203 }
212 204
213 intptr_t vertex = reinterpret_cast<intptr_t>(fVertices); 205 intptr_t vertex = reinterpret_cast<intptr_t>(fVertices);
(...skipping 17 matching lines...) Expand all
231 } 223 }
232 224
233 enum RegenMask { 225 enum RegenMask {
234 kNoRegen = 0x0, 226 kNoRegen = 0x0,
235 kRegenPos = 0x1, 227 kRegenPos = 0x1,
236 kRegenCol = 0x2, 228 kRegenCol = 0x2,
237 kRegenTex = 0x4, 229 kRegenTex = 0x4,
238 kRegenGlyph = 0x8 | kRegenTex, // we have to regenerate the texture coords w hen we regen glyphs 230 kRegenGlyph = 0x8 | kRegenTex, // we have to regenerate the texture coords w hen we regen glyphs
239 231
240 // combinations 232 // combinations
241 kRegenPosCol = kRegenPos | kRegenCol, 233 kRegenPosCol = kRegenPos | kRegenCol,
242 kRegenPosTex = kRegenPos | kRegenTex, 234 kRegenPosTex = kRegenPos | kRegenTex,
243 kRegenPosTexGlyph = kRegenPos | kRegenGlyph, 235 kRegenPosTexGlyph = kRegenPos | kRegenGlyph,
244 kRegenPosColTex = kRegenPos | kRegenCol | kRegenTex, 236 kRegenPosColTex = kRegenPos | kRegenCol | kRegenTex,
245 kRegenPosColTexGlyph = kRegenPos | kRegenCol | kRegenGlyph, 237 kRegenPosColTexGlyph = kRegenPos | kRegenCol | kRegenGlyph,
246 kRegenColTex = kRegenCol | kRegenTex, 238 kRegenColTex = kRegenCol | kRegenTex,
247 kRegenColTexGlyph = kRegenCol | kRegenGlyph, 239 kRegenColTexGlyph = kRegenCol | kRegenGlyph,
248 }; 240 };
249 241
250 #define REGEN_ARGS target, fontCache, helper, &run, &info, cache, typeface, desc , \ 242 #define REGEN_ARGS target, fontCache, helper, &run, &info, lazyCache, \
251 *glyphCount, vertexStride, color, transX, transY 243 *glyphCount, vertexStride, color, transX, transY
252 244
253 void GrAtlasTextBlob::regenInBatch(GrDrawBatch::Target* target, 245 void GrAtlasTextBlob::regenInBatch(GrDrawBatch::Target* target,
254 GrBatchFontCache* fontCache, 246 GrBatchFontCache* fontCache,
255 GrBlobRegenHelper *helper, 247 GrBlobRegenHelper *helper,
256 int runIndex, int subRunIndex, SkGlyphCache** cache, 248 int runIndex, int subRunIndex, SkAutoGlyphCac he* lazyCache,
257 SkTypeface** typeface, const SkDescriptor** d esc,
258 size_t vertexStride, const SkMatrix& viewMatr ix, 249 size_t vertexStride, const SkMatrix& viewMatr ix,
259 SkScalar x, SkScalar y, GrColor color, 250 SkScalar x, SkScalar y, GrColor color,
260 void** vertices, size_t* byteCount, int* glyp hCount) { 251 void** vertices, size_t* byteCount, int* glyp hCount) {
261 Run& run = fRuns[runIndex]; 252 Run& run = fRuns[runIndex];
262 Run::SubRunInfo& info = run.fSubRunInfo[subRunIndex]; 253 Run::SubRunInfo& info = run.fSubRunInfo[subRunIndex];
263 254
264 uint64_t currentAtlasGen = fontCache->atlasGeneration(info.maskFormat()); 255 uint64_t currentAtlasGen = fontCache->atlasGeneration(info.maskFormat());
265 256
266 // Compute translation if any 257 // Compute translation if any
267 SkScalar transX, transY; 258 SkScalar transX, transY;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 // set use tokens for all of the glyphs in our subrun. This is only valid if we 301 // set use tokens for all of the glyphs in our subrun. This is only valid if we
311 // have a valid atlas generation 302 // have a valid atlas generation
312 fontCache->setUseTokenBulk(*info.bulkUseToken(), target->nextDrawTok en(), 303 fontCache->setUseTokenBulk(*info.bulkUseToken(), target->nextDrawTok en(),
313 info.maskFormat()); 304 info.maskFormat());
314 break; 305 break;
315 } 306 }
316 307
317 *byteCount = info.byteCount(); 308 *byteCount = info.byteCount();
318 *vertices = fVertices + info.vertexStartIndex(); 309 *vertices = fVertices + info.vertexStartIndex();
319 } 310 }
OLDNEW
« no previous file with comments | « src/gpu/text/GrAtlasTextBlob.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698