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

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: 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 797 matching lines...) Expand 10 before | Expand all | Expand 10 after
808 // then we can't really trust the atlas has all of the correct data. Atlas evictions 808 // then we can't really trust the atlas has all of the correct data. Atlas evictions
809 // should be pretty rare, so we just always regenerate in those case s 809 // should be pretty rare, so we just always regenerate in those case s
810 if (regenerateTextureCoords || regenerateColors) { 810 if (regenerateTextureCoords || regenerateColors) {
811 // first regenerate texture coordinates / colors if need be 811 // first regenerate texture coordinates / colors if need be
812 const SkDescriptor* desc = NULL; 812 const SkDescriptor* desc = NULL;
813 SkGlyphCache* cache = NULL; 813 SkGlyphCache* cache = NULL;
814 GrFontScaler* scaler = NULL; 814 GrFontScaler* scaler = NULL;
815 GrBatchTextStrike* strike = NULL; 815 GrBatchTextStrike* strike = NULL;
816 bool brokenRun = false; 816 bool brokenRun = false;
817 if (regenerateTextureCoords) { 817 if (regenerateTextureCoords) {
818 info.fBulkTokenReffer.reset();
818 desc = run.fDescriptor.getDesc(); 819 desc = run.fDescriptor.getDesc();
819 cache = SkGlyphCache::DetachCache(run.fTypeface, desc); 820 cache = SkGlyphCache::DetachCache(run.fTypeface, desc);
820 scaler = GrTextContext::GetGrFontScaler(cache); 821 scaler = GrTextContext::GetGrFontScaler(cache);
821 strike = fFontCache->getStrike(scaler); 822 strike = fFontCache->getStrike(scaler);
822 } 823 }
823 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) { 824 for (int glyphIdx = 0; glyphIdx < glyphCount; glyphIdx++) {
824 GrGlyph::PackedID glyphID = blob->fGlyphIDs[glyphIdx + info. fGlyphStartIndex]; 825 GrGlyph::PackedID glyphID = blob->fGlyphIDs[glyphIdx + info. fGlyphStartIndex];
825 826
826 if (regenerateTextureCoords) { 827 if (regenerateTextureCoords) {
827 // Upload the glyph only if needed 828 // Upload the glyph only if needed
828 GrGlyph* glyph = strike->getGlyph(glyphID, scaler); 829 GrGlyph* glyph = strike->getGlyph(glyphID, scaler);
829 SkASSERT(glyph); 830 SkASSERT(glyph);
830 831
831 if (!fFontCache->hasGlyph(glyph) && 832 if (!fFontCache->hasGlyph(glyph) &&
832 !strike->addGlyphToAtlas(batchTarget, glyph, scaler) ) { 833 !strike->addGlyphToAtlas(batchTarget, glyph, scaler) ) {
833 this->flush(batchTarget, &drawInfo, instancesToFlush , 834 this->flush(batchTarget, &drawInfo, instancesToFlush ,
834 maxInstancesPerDraw); 835 maxInstancesPerDraw);
835 this->initDraw(batchTarget, gp, pipeline); 836 this->initDraw(batchTarget, gp, pipeline);
836 instancesToFlush = 0; 837 instancesToFlush = 0;
837 brokenRun = glyphIdx > 0; 838 brokenRun = glyphIdx > 0;
838 839
839 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas( batchTarget, glyph, 840 SkDEBUGCODE(bool success =) strike->addGlyphToAtlas( batchTarget, glyph,
840 scaler); 841 scaler);
841 SkASSERT(success); 842 SkASSERT(success);
842 } 843 }
843 844
844 fFontCache->setGlyphRefToken(glyph, batchTarget->current Token()); 845 fFontCache->setGlyphRefToken(&info.fBulkTokenReffer,
846 glyph, batchTarget->current Token());
845 847
846 // 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
847 // first one and then map with stride in regenerateTextu reCoords 849 // first one and then map with stride in regenerateTextu reCoords
848 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert ices); 850 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert ices);
849 vertex += info.fVertexStartIndex; 851 vertex += info.fVertexStartIndex;
850 vertex += vertexStride * glyphIdx * kVerticesPerGlyph; 852 vertex += vertexStride * glyphIdx * kVerticesPerGlyph;
851 vertex += vertexStride - sizeof(SkIPoint16); 853 vertex += vertexStride - sizeof(SkIPoint16);
852 854
853 this->regenerateTextureCoords(glyph, vertex, vertexStrid e); 855 this->regenerateTextureCoords(glyph, vertex, vertexStrid e);
854 } 856 }
855 857
856 if (regenerateColors) { 858 if (regenerateColors) {
857 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert ices); 859 intptr_t vertex = reinterpret_cast<intptr_t>(blob->fVert ices);
858 vertex += info.fVertexStartIndex; 860 vertex += info.fVertexStartIndex;
859 vertex += vertexStride * glyphIdx * kVerticesPerGlyph + sizeof(SkPoint); 861 vertex += vertexStride * glyphIdx * kVerticesPerGlyph + sizeof(SkPoint);
860 this->regenerateColors(vertex, vertexStride, args.fColor ); 862 this->regenerateColors(vertex, vertexStride, args.fColor );
861 } 863 }
862 864
863 instancesToFlush++; 865 instancesToFlush++;
864 } 866 }
865 867
866 if (regenerateTextureCoords) { 868 if (regenerateTextureCoords) {
867 SkGlyphCache::AttachCache(cache); 869 SkGlyphCache::AttachCache(cache);
868 info.fAtlasGeneration = brokenRun ? GrBatchAtlas::kInvalidAt lasGeneration : 870 info.fAtlasGeneration = brokenRun ? GrBatchAtlas::kInvalidAt lasGeneration :
869 fFontCache->atlasGenerat ion(fMaskFormat); 871 fFontCache->atlasGenerat ion(fMaskFormat);
870 } 872 }
871 } else { 873 } else {
872 instancesToFlush += glyphCount; 874 instancesToFlush += glyphCount;
875
876 // Ref all of the plots in the atlas to prevent eviction
877 fFontCache->setRefTokenBulk(info.fBulkTokenReffer, fMaskFormat);
873 } 878 }
874 879
875 // now copy all vertices 880 // now copy all vertices
876 size_t byteCount = info.fVertexEndIndex - info.fVertexStartIndex; 881 size_t byteCount = info.fVertexEndIndex - info.fVertexStartIndex;
877 memcpy(currVertex, blob->fVertices + info.fVertexStartIndex, byteCou nt); 882 memcpy(currVertex, blob->fVertices + info.fVertexStartIndex, byteCou nt);
878 883
879 currVertex += byteCount; 884 currVertex += byteCount;
880 } 885 }
881 886
882 this->flush(batchTarget, &drawInfo, instancesToFlush, maxInstancesPerDra w); 887 this->flush(batchTarget, &drawInfo, instancesToFlush, maxInstancesPerDra w);
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 1132
1128 GrColor color = grPaint.getColor(); 1133 GrColor color = grPaint.getColor();
1129 SkPaint runPaint = skPaint; 1134 SkPaint runPaint = skPaint;
1130 for (int run = 0; run < cacheBlob->fRunCount; run++) { 1135 for (int run = 0; run < cacheBlob->fRunCount; run++) {
1131 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, skPaint) ; 1136 this->flushRun(target, &pipelineBuilder, cacheBlob, run, color, skPaint) ;
1132 } 1137 }
1133 1138
1134 // Now flush big glyphs 1139 // Now flush big glyphs
1135 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip); 1140 this->flushBigGlyphs(cacheBlob, rt, grPaint, clip);
1136 } 1141 }
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