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

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

Issue 1050113004: Adding bulk plot reffer to cached textblobs (Closed) Base URL: https://skia.googlesource.com/skia.git@atlastext
Patch Set: cleanup Created 5 years, 8 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 2015 Google Inc. 2 * Copyright 2015 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 #include "GrAtlasTextContext.h" 7 #include "GrAtlasTextContext.h"
8 8
9 #include "GrAtlas.h" 9 #include "GrAtlas.h"
10 #include "GrBatch.h" 10 #include "GrBatch.h"
(...skipping 798 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 // then we can't really trust the atlas has all of the correct data. Atlas evictions 809 // then we can't really trust the atlas has all of the correct data. Atlas evictions
810 // should be pretty rare, so we just always regenerate in those case s 810 // should be pretty rare, so we just always regenerate in those case s
811 if (regenerateTextureCoords || regenerateColors) { 811 if (regenerateTextureCoords || regenerateColors) {
812 // first regenerate texture coordinates / colors if need be 812 // first regenerate texture coordinates / colors if need be
813 const SkDescriptor* desc = NULL; 813 const SkDescriptor* desc = NULL;
814 SkGlyphCache* cache = NULL; 814 SkGlyphCache* cache = NULL;
815 GrFontScaler* scaler = NULL; 815 GrFontScaler* scaler = NULL;
816 GrBatchTextStrike* strike = NULL; 816 GrBatchTextStrike* strike = NULL;
817 bool brokenRun = false; 817 bool brokenRun = false;
818 if (regenerateTextureCoords) { 818 if (regenerateTextureCoords) {
819 info.fBulkUseToken.reset();
819 desc = run.fDescriptor.getDesc(); 820 desc = run.fDescriptor.getDesc();
820 cache = SkGlyphCache::DetachCache(run.fTypeface, desc); 821 cache = SkGlyphCache::DetachCache(run.fTypeface, desc);
821 scaler = GrTextContext::GetGrFontScaler(cache); 822 scaler = GrTextContext::GetGrFontScaler(cache);
822 strike = fFontCache->getStrike(scaler); 823 strike = fFontCache->getStrike(scaler);
823 } 824 }
824 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) { 825 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) {
825 GrGlyph::PackedID glyphID = blob->fGlyphIDs[glyphIdx + info. fGlyphStartIndex]; 826 GrGlyph::PackedID glyphID = blob->fGlyphIDs[glyphIdx + info. fGlyphStartIndex];
826 827
827 if (regenerateTextureCoords) { 828 if (regenerateTextureCoords) {
828 // Upload the glyph only if needed 829 // Upload the glyph only if needed
829 GrGlyph* glyph = strike->getGlyph(glyphID, scaler); 830 GrGlyph* glyph = strike->getGlyph(glyphID, scaler);
830 SkASSERT(glyph); 831 SkASSERT(glyph);
831 832
832 if (!fFontCache->hasGlyph(glyph) && 833 if (!fFontCache->hasGlyph(glyph) &&
833 !strike->addGlyphToAtlas(batchTarget, glyph, scaler) ) { 834 !strike->addGlyphToAtlas(batchTarget, glyph, scaler) ) {
834 this->flush(batchTarget, &drawInfo, instancesToFlush , 835 this->flush(batchTarget, &drawInfo, instancesToFlush ,
835 maxInstancesPerDraw); 836 maxInstancesPerDraw);
836 this->initDraw(batchTarget, gp, pipeline); 837 this->initDraw(batchTarget, gp, pipeline);
837 instancesToFlush = 0; 838 instancesToFlush = 0;
838 brokenRun = glyphIdx > 0; 839 brokenRun = glyphIdx > 0;
839 840
840 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas( batchTarget, glyph, 841 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas( batchTarget, glyph,
841 scaler); 842 scaler);
842 SkASSERT(success); 843 SkASSERT(success);
843 } 844 }
844 845 fFontCache->addGlyphToBulkAndSetUseToken(&info.fBulkUseT oken, glyph,
845 fFontCache->setGlyphRefToken(glyph, batchTarget->current Token()); 846 batchTarget->cu rrentToken());
846 847
847 // Texture coords are the last vertex attribute so we ge t a pointer to the 848 // Texture coords are the last vertex attribute so we ge t a pointer to the
848 // first one and then map with stride in regenerateTextu reCoords 849 // first one and then map with stride in regenerateTextu reCoords
849 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert ices); 850 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert ices);
850 vertex += info.fVertexStartIndex; 851 vertex += info.fVertexStartIndex;
851 vertex += vertexStride * glyphIdx * kVerticesPerGlyph; 852 vertex += vertexStride * glyphIdx * kVerticesPerGlyph;
852 vertex += vertexStride - sizeof(SkIPoint16); 853 vertex += vertexStride - sizeof(SkIPoint16);
853 854
854 this->regenerateTextureCoords(glyph, vertex, vertexStrid e); 855 this->regenerateTextureCoords(glyph, vertex, vertexStrid e);
855 } 856 }
856 857
857 if (regenerateColors) { 858 if (regenerateColors) {
858 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert ices); 859 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert ices);
859 vertex += info.fVertexStartIndex; 860 vertex += info.fVertexStartIndex;
860 vertex += vertexStride * glyphIdx * kVerticesPerGlyph + sizeof(SkPoint); 861 vertex += vertexStride * glyphIdx * kVerticesPerGlyph + sizeof(SkPoint);
861 this->regenerateColors(vertex, vertexStride, args.fColor ); 862 this->regenerateColors(vertex, vertexStride, args.fColor );
862 } 863 }
863 864
864 instancesToFlush++; 865 instancesToFlush++;
865 } 866 }
866 867
867 if (regenerateTextureCoords) { 868 if (regenerateTextureCoords) {
868 SkGlyphCache::AttachCache(cache); 869 SkGlyphCache::AttachCache(cache);
869 info.fAtlasGeneration = brokenRun ? GrBatchAtlas::kInvalidAt lasGeneration : 870 info.fAtlasGeneration = brokenRun ? GrBatchAtlas::kInvalidAt lasGeneration :
870 fFontCache->atlasGenerat ion(fMaskFormat); 871 fFontCache->atlasGenerat ion(fMaskFormat);
871 } 872 }
872 } else { 873 } else {
873 instancesToFlush += glyphCount; 874 instancesToFlush += glyphCount;
875
876 // set use tokens for all of the glyphs in our subrun. This is only valid if we
877 // have a valid atlas generation
878 fFontCache->setUseTokenBulk(info.fBulkUseToken,
879 batchTarget->currentToken(),
880 fMaskFormat);
874 } 881 }
875 882
876 // now copy all vertices 883 // now copy all vertices
877 size_t byteCount = info.fVertexEndIndex - info.fVertexStartIndex; 884 size_t byteCount = info.fVertexEndIndex - info.fVertexStartIndex;
878 memcpy(currVertex, blob->fVertices + info.fVertexStartIndex, byteCou nt); 885 memcpy(currVertex, blob->fVertices + info.fVertexStartIndex, byteCou nt);
879 886
880 currVertex += byteCount; 887 currVertex += byteCount;
881 } 888 }
882 889
883 this->flush(batchTarget, &drawInfo, instancesToFlush, maxInstancesPerDra w); 890 this->flush(batchTarget, &drawInfo, instancesToFlush, maxInstancesPerDra w);
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 1135
1129 GrColor color = grPaint.getColor(); 1136 GrColor color = grPaint.getColor();
1130 SkPaint runPaint = skPaint; 1137 SkPaint runPaint = skPaint;
1131 for (int run = 0; run < cacheBlob->fRunCount; run++) { 1138 for (int run = 0; run < cacheBlob->fRunCount; run++) {
1132 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, skPaint) ; 1139 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, skPaint) ;
1133 } 1140 }
1134 1141
1135 // Now flush big glyphs 1142 // Now flush big glyphs
1136 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip); 1143 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip);
1137 } 1144 }
OLDNEW
« no previous file with comments | « src/gpu/GrAtlasTextContext.h ('k') | src/gpu/GrBatchAtlas.h » ('j') | src/gpu/GrBatchAtlas.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698