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

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

Issue 66813002: Revert "Do not apply hairline optimization for paths if nv_path_rendering is used" (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 1 month 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 | Annotate | Revision Log
« no previous file with comments | « src/gpu/GrAAHairLinePathRenderer.cpp ('k') | src/gpu/GrDrawState.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 /* 2 /*
3 * Copyright 2011 Google Inc. 3 * Copyright 2011 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 9
10 #include "GrContext.h" 10 #include "GrContext.h"
11 11
12 #include "effects/GrSingleTextureEffect.h" 12 #include "effects/GrSingleTextureEffect.h"
13 #include "effects/GrConfigConversionEffect.h" 13 #include "effects/GrConfigConversionEffect.h"
14 14
15 #include "GrAARectRenderer.h" 15 #include "GrAARectRenderer.h"
16 #include "GrBufferAllocPool.h" 16 #include "GrBufferAllocPool.h"
17 #include "GrGpu.h" 17 #include "GrGpu.h"
18 #include "GrDrawTargetCaps.h" 18 #include "GrDrawTargetCaps.h"
19 #include "GrIndexBuffer.h" 19 #include "GrIndexBuffer.h"
20 #include "GrInOrderDrawBuffer.h" 20 #include "GrInOrderDrawBuffer.h"
21 #include "GrOvalRenderer.h" 21 #include "GrOvalRenderer.h"
22 #include "GrPathRenderer.h" 22 #include "GrPathRenderer.h"
23 #include "GrPathUtils.h" 23 #include "GrPathUtils.h"
24 #include "GrResourceCache.h" 24 #include "GrResourceCache.h"
25 #include "GrSoftwarePathRenderer.h" 25 #include "GrSoftwarePathRenderer.h"
26 #include "GrStencilBuffer.h" 26 #include "GrStencilBuffer.h"
27 #include "GrTextStrike.h" 27 #include "GrTextStrike.h"
28 #include "SkDrawProcs.h"
29 #include "SkRTConf.h" 28 #include "SkRTConf.h"
30 #include "SkRRect.h" 29 #include "SkRRect.h"
31 #include "SkStrokeRec.h" 30 #include "SkStrokeRec.h"
32 #include "SkTLazy.h" 31 #include "SkTLazy.h"
33 #include "SkTLS.h" 32 #include "SkTLS.h"
34 #include "SkTrace.h" 33 #include "SkTrace.h"
35 34
36 SK_DEFINE_INST_COUNT(GrContext) 35 SK_DEFINE_INST_COUNT(GrContext)
37 SK_DEFINE_INST_COUNT(GrDrawState) 36 SK_DEFINE_INST_COUNT(GrDrawState)
38 37
39 // It can be useful to set this to false to test whether a bug is caused by usin g the 38 // It can be useful to set this to false to test whether a bug is caused by usin g the
40 // InOrderDrawBuffer, to compare performance of using/not using InOrderDrawBuffe r, or to make 39 // InOrderDrawBuffer, to compare performance of using/not using InOrderDrawBuffe r, or to make
41 // debugging simpler. 40 // debugging simpler.
42 SK_CONF_DECLARE(bool, c_Defer, "gpu.deferContext", true, 41 SK_CONF_DECLARE(bool, c_Defer, "gpu.deferContext", true,
43 "Defers rendering in GrContext via GrInOrderDrawBuffer."); 42 "Defers rendering in GrContext via GrInOrderDrawBuffer.");
44 43
45 #define BUFFERED_DRAW (c_Defer ? kYes_BufferedDraw : kNo_BufferedDraw) 44 #define BUFFERED_DRAW (c_Defer ? kYes_BufferedDraw : kNo_BufferedDraw)
46 45
46 // When we're using coverage AA but the blend is incompatible (given gpu
47 // limitations) should we disable AA or draw wrong?
48 #define DISABLE_COVERAGE_AA_FOR_BLEND 1
49
47 #ifdef SK_DEBUG 50 #ifdef SK_DEBUG
48 // change this to a 1 to see notifications when partial coverage fails 51 // change this to a 1 to see notifications when partial coverage fails
49 #define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0 52 #define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0
50 #else 53 #else
51 #define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0 54 #define GR_DEBUG_PARTIAL_COVERAGE_CHECK 0
52 #endif 55 #endif
53 56
54 static const size_t MAX_RESOURCE_CACHE_COUNT = GR_DEFAULT_RESOURCE_CACHE_COUNT_L IMIT; 57 static const size_t MAX_RESOURCE_CACHE_COUNT = GR_DEFAULT_RESOURCE_CACHE_COUNT_L IMIT;
55 static const size_t MAX_RESOURCE_CACHE_BYTES = GR_DEFAULT_RESOURCE_CACHE_MB_LIMI T * 1024 * 1024; 58 static const size_t MAX_RESOURCE_CACHE_BYTES = GR_DEFAULT_RESOURCE_CACHE_MB_LIMI T * 1024 * 1024;
56 59
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 } 688 }
686 689
687 #ifdef SK_DEVELOPER 690 #ifdef SK_DEVELOPER
688 void GrContext::dumpFontCache() const { 691 void GrContext::dumpFontCache() const {
689 fFontCache->dump(); 692 fFontCache->dump();
690 } 693 }
691 #endif 694 #endif
692 695
693 //////////////////////////////////////////////////////////////////////////////// 696 ////////////////////////////////////////////////////////////////////////////////
694 697
698 namespace {
699 inline bool disable_coverage_aa_for_blend(GrDrawTarget* target) {
700 return DISABLE_COVERAGE_AA_FOR_BLEND && !target->canApplyCoverage();
701 }
702 }
703
704 ////////////////////////////////////////////////////////////////////////////////
705
695 /* create a triangle strip that strokes the specified triangle. There are 8 706 /* create a triangle strip that strokes the specified triangle. There are 8
696 unique vertices, but we repreat the last 2 to close up. Alternatively we 707 unique vertices, but we repreat the last 2 to close up. Alternatively we
697 could use an indices array, and then only send 8 verts, but not sure that 708 could use an indices array, and then only send 8 verts, but not sure that
698 would be faster. 709 would be faster.
699 */ 710 */
700 static void setStrokeRectStrip(GrPoint verts[10], SkRect rect, 711 static void setStrokeRectStrip(GrPoint verts[10], SkRect rect,
701 SkScalar width) { 712 SkScalar width) {
702 const SkScalar rad = SkScalarHalf(width); 713 const SkScalar rad = SkScalarHalf(width);
703 rect.sort(); 714 rect.sort();
704 715
(...skipping 23 matching lines...) Expand all
728 // we use a simple coverage ramp to do aa on axis-aligned rects 739 // we use a simple coverage ramp to do aa on axis-aligned rects
729 // we check if the rect will be axis-aligned, and the rect won't land on 740 // we check if the rect will be axis-aligned, and the rect won't land on
730 // integer coords. 741 // integer coords.
731 742
732 // we are keeping around the "tweak the alpha" trick because 743 // we are keeping around the "tweak the alpha" trick because
733 // it is our only hope for the fixed-pipe implementation. 744 // it is our only hope for the fixed-pipe implementation.
734 // In a shader implementation we can give a separate coverage input 745 // In a shader implementation we can give a separate coverage input
735 // TODO: remove this ugliness when we drop the fixed-pipe impl 746 // TODO: remove this ugliness when we drop the fixed-pipe impl
736 *useVertexCoverage = false; 747 *useVertexCoverage = false;
737 if (!target->getDrawState().canTweakAlphaForCoverage()) { 748 if (!target->getDrawState().canTweakAlphaForCoverage()) {
738 if (target->shouldDisableCoverageAAForBlend()) { 749 if (disable_coverage_aa_for_blend(target)) {
739 #ifdef SK_DEBUG 750 #ifdef SK_DEBUG
740 //GrPrintf("Turning off AA to correctly apply blend.\n"); 751 //GrPrintf("Turning off AA to correctly apply blend.\n");
741 #endif 752 #endif
742 return false; 753 return false;
743 } else { 754 } else {
744 *useVertexCoverage = true; 755 *useVertexCoverage = true;
745 } 756 }
746 } 757 }
747 const GrDrawState& drawState = target->getDrawState(); 758 const GrDrawState& drawState = target->getDrawState();
748 if (drawState.getRenderTarget()->isMultisampled()) { 759 if (drawState.getRenderTarget()->isMultisampled()) {
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1016 const SkRRect& rect, 1027 const SkRRect& rect,
1017 const SkStrokeRec& stroke) { 1028 const SkStrokeRec& stroke) {
1018 if (rect.isEmpty()) { 1029 if (rect.isEmpty()) {
1019 return; 1030 return;
1020 } 1031 }
1021 1032
1022 AutoRestoreEffects are; 1033 AutoRestoreEffects are;
1023 AutoCheckFlush acf(this); 1034 AutoCheckFlush acf(this);
1024 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); 1035 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf );
1025 1036
1026 if (!fOvalRenderer->drawSimpleRRect(target, this, paint.isAntiAlias(), rect, stroke)) { 1037 bool useAA = paint.isAntiAlias() &&
1038 !target->getDrawState().getRenderTarget()->isMultisampled() &&
1039 !disable_coverage_aa_for_blend(target);
1040
1041 if (!fOvalRenderer->drawSimpleRRect(target, this, useAA, rect, stroke)) {
1027 SkPath path; 1042 SkPath path;
1028 path.addRRect(rect); 1043 path.addRRect(rect);
1029 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); 1044 this->internalDrawPath(target, useAA, path, stroke);
1030 } 1045 }
1031 } 1046 }
1032 1047
1033 /////////////////////////////////////////////////////////////////////////////// 1048 ///////////////////////////////////////////////////////////////////////////////
1034 1049
1035 void GrContext::drawOval(const GrPaint& paint, 1050 void GrContext::drawOval(const GrPaint& paint,
1036 const SkRect& oval, 1051 const SkRect& oval,
1037 const SkStrokeRec& stroke) { 1052 const SkStrokeRec& stroke) {
1038 if (oval.isEmpty()) { 1053 if (oval.isEmpty()) {
1039 return; 1054 return;
1040 } 1055 }
1041 1056
1042 AutoRestoreEffects are; 1057 AutoRestoreEffects are;
1043 AutoCheckFlush acf(this); 1058 AutoCheckFlush acf(this);
1044 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); 1059 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf );
1045 1060
1046 if (!fOvalRenderer->drawOval(target, this, paint.isAntiAlias(), oval, stroke )) { 1061 bool useAA = paint.isAntiAlias() &&
1062 !target->getDrawState().getRenderTarget()->isMultisampled() &&
1063 !disable_coverage_aa_for_blend(target);
1064
1065 if (!fOvalRenderer->drawOval(target, this, useAA, oval, stroke)) {
1047 SkPath path; 1066 SkPath path;
1048 path.addOval(oval); 1067 path.addOval(oval);
1049 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); 1068 this->internalDrawPath(target, useAA, path, stroke);
1050 } 1069 }
1051 } 1070 }
1052 1071
1053 // Can 'path' be drawn as a pair of filled nested rectangles? 1072 // Can 'path' be drawn as a pair of filled nested rectangles?
1054 static bool is_nested_rects(GrDrawTarget* target, 1073 static bool is_nested_rects(GrDrawTarget* target,
1055 const SkPath& path, 1074 const SkPath& path,
1056 const SkStrokeRec& stroke, 1075 const SkStrokeRec& stroke,
1057 SkRect rects[2], 1076 SkRect rects[2],
1058 bool* useVertexCoverage) { 1077 bool* useVertexCoverage) {
1059 SkASSERT(stroke.isFillStyle()); 1078 SkASSERT(stroke.isFillStyle());
1060 1079
1061 if (path.isInverseFillType()) { 1080 if (path.isInverseFillType()) {
1062 return false; 1081 return false;
1063 } 1082 }
1064 1083
1065 const GrDrawState& drawState = target->getDrawState(); 1084 const GrDrawState& drawState = target->getDrawState();
1066 1085
1067 // TODO: this restriction could be lifted if we were willing to apply 1086 // TODO: this restriction could be lifted if we were willing to apply
1068 // the matrix to all the points individually rather than just to the rect 1087 // the matrix to all the points individually rather than just to the rect
1069 if (!drawState.getViewMatrix().preservesAxisAlignment()) { 1088 if (!drawState.getViewMatrix().preservesAxisAlignment()) {
1070 return false; 1089 return false;
1071 } 1090 }
1072 1091
1073 *useVertexCoverage = false; 1092 *useVertexCoverage = false;
1074 if (!target->getDrawState().canTweakAlphaForCoverage()) { 1093 if (!target->getDrawState().canTweakAlphaForCoverage()) {
1075 if (target->shouldDisableCoverageAAForBlend()) { 1094 if (disable_coverage_aa_for_blend(target)) {
1076 return false; 1095 return false;
1077 } else { 1096 } else {
1078 *useVertexCoverage = true; 1097 *useVertexCoverage = true;
1079 } 1098 }
1080 } 1099 }
1081 1100
1082 SkPath::Direction dirs[2]; 1101 SkPath::Direction dirs[2];
1083 if (!path.isNestedRects(rects, dirs)) { 1102 if (!path.isNestedRects(rects, dirs)) {
1084 return false; 1103 return false;
1085 } 1104 }
(...skipping 29 matching lines...) Expand all
1115 } 1134 }
1116 1135
1117 // Note that internalDrawPath may sw-rasterize the path into a scratch textu re. 1136 // Note that internalDrawPath may sw-rasterize the path into a scratch textu re.
1118 // Scratch textures can be recycled after they are returned to the texture 1137 // Scratch textures can be recycled after they are returned to the texture
1119 // cache. This presents a potential hazard for buffered drawing. However, 1138 // cache. This presents a potential hazard for buffered drawing. However,
1120 // the writePixels that uploads to the scratch will perform a flush so we're 1139 // the writePixels that uploads to the scratch will perform a flush so we're
1121 // OK. 1140 // OK.
1122 AutoRestoreEffects are; 1141 AutoRestoreEffects are;
1123 AutoCheckFlush acf(this); 1142 AutoCheckFlush acf(this);
1124 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf ); 1143 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are, &acf );
1125 GrDrawState* drawState = target->drawState();
1126 1144
1127 bool useCoverageAA = paint.isAntiAlias() && !drawState->getRenderTarget()->i sMultisampled(); 1145 bool useAA = paint.isAntiAlias() && !target->getDrawState().getRenderTarget( )->isMultisampled();
1128 1146 if (useAA && stroke.getWidth() < 0 && !path.isConvex()) {
1129 if (useCoverageAA && stroke.getWidth() < 0 && !path.isConvex()) {
1130 // Concave AA paths are expensive - try to avoid them for special cases 1147 // Concave AA paths are expensive - try to avoid them for special cases
1131 bool useVertexCoverage; 1148 bool useVertexCoverage;
1132 SkRect rects[2]; 1149 SkRect rects[2];
1133 1150
1134 if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) { 1151 if (is_nested_rects(target, path, stroke, rects, &useVertexCoverage)) {
1135 SkMatrix origViewMatrix = drawState->getViewMatrix(); 1152 SkMatrix origViewMatrix = target->getDrawState().getViewMatrix();
1136 GrDrawState::AutoViewMatrixRestore avmr; 1153 GrDrawState::AutoViewMatrixRestore avmr;
1137 if (!avmr.setIdentity(target->drawState())) { 1154 if (!avmr.setIdentity(target->drawState())) {
1138 return; 1155 return;
1139 } 1156 }
1140 1157
1141 fAARectRenderer->fillAANestedRects(this->getGpu(), target, 1158 fAARectRenderer->fillAANestedRects(this->getGpu(), target,
1142 rects, 1159 rects,
1143 origViewMatrix, 1160 origViewMatrix,
1144 useVertexCoverage); 1161 useVertexCoverage);
1145 return; 1162 return;
1146 } 1163 }
1147 } 1164 }
1148 1165
1149 SkRect ovalRect; 1166 SkRect ovalRect;
1150 bool isOval = path.isOval(&ovalRect); 1167 bool isOval = path.isOval(&ovalRect);
1151 1168
1152 if (!isOval || path.isInverseFillType() 1169 if (!isOval || path.isInverseFillType()
1153 || !fOvalRenderer->drawOval(target, this, paint.isAntiAlias(), ovalRect, stroke)) { 1170 || !fOvalRenderer->drawOval(target, this, useAA, ovalRect, stroke)) {
1154 this->internalDrawPath(target, paint.isAntiAlias(), path, stroke); 1171 this->internalDrawPath(target, useAA, path, stroke);
1155 } 1172 }
1156 } 1173 }
1157 1174
1158 namespace { 1175 void GrContext::internalDrawPath(GrDrawTarget* target, bool useAA, const SkPath& path,
1159 // See also: SkDrawTreatAsHairline. 1176 const SkStrokeRec& stroke) {
1160 static inline bool should_convert_to_hairline(bool useAA, const SkStrokeRec& str oke,
1161 const SkMatrix& matrix, SkScalar* coverage) {
1162
1163 if (stroke.getStyle() != SkStrokeRec::kStroke_Style) {
1164 return false;
1165 }
1166
1167 SkASSERT(0 != stroke.getWidth());
1168
1169 if (!useAA) {
1170 return false;
1171 }
1172
1173 return SkDrawTreatAAStrokeAsHairline(stroke.getWidth(), matrix, coverage);
1174 }
1175 }
1176
1177
1178 void GrContext::internalDrawPath(GrDrawTarget* target, bool useAA,
1179 const SkPath& path, const SkStrokeRec& origStro ke) {
1180 SkASSERT(!path.isEmpty()); 1177 SkASSERT(!path.isEmpty());
1181 1178
1182 // An Assumption here is that path renderer would use some form of tweaking 1179 // An Assumption here is that path renderer would use some form of tweaking
1183 // the src color (either the input alpha or in the frag shader) to implement 1180 // the src color (either the input alpha or in the frag shader) to implement
1184 // aa. If we have some future driver-mojo path AA that can do the right 1181 // aa. If we have some future driver-mojo path AA that can do the right
1185 // thing WRT to the blend then we'll need some query on the PR. 1182 // thing WRT to the blend then we'll need some query on the PR.
1186 bool useCoverageAA = useAA && 1183 if (disable_coverage_aa_for_blend(target)) {
1187 !target->getDrawState().getRenderTarget()->isMultisampled() && 1184 #ifdef SK_DEBUG
1188 !target->shouldDisableCoverageAAForBlend(); 1185 //GrPrintf("Turning off AA to correctly apply blend.\n");
1189 1186 #endif
1190 SkTCopyOnFirstWrite<SkStrokeRec> stroke(origStroke); 1187 useAA = false;
1191 // Can we treat a thin stroke as a hairline w/ coverage? If we can, we draw lots faster (raster
1192 // device does this same test).
1193
1194 // Do not do this if gpu supports path rendering natively and we might be us ing the support
1195 // (useCoverageAA == false). Hairline renderer is likely to be slow due to p rogram switches.
1196 if (!useCoverageAA || !fGpu->caps()->pathRenderingSupport()) {
1197 SkScalar hairlineCoverage;
1198 if (should_convert_to_hairline(useAA, *stroke, this->getMatrix(), &hairl ineCoverage)) {
1199 target->drawState()->setCoverage(SkScalarRoundToInt(hairlineCoverage * target->getDrawState().getCoverage()));
1200 stroke.writable()->setHairlineStyle();
1201 }
1202 } 1188 }
1203 1189
1204 GrPathRendererChain::DrawType type = 1190 GrPathRendererChain::DrawType type = useAA ? GrPathRendererChain::kColorAnti Alias_DrawType :
1205 useCoverageAA ? GrPathRendererChain::kColorAntiAlias_DrawType : 1191 GrPathRendererChain::kColor_Dra wType;
1206 GrPathRendererChain::kColor_DrawType;
1207 1192
1208 const SkPath* pathPtr = &path; 1193 const SkPath* pathPtr = &path;
1209 SkPath tmpPath; 1194 SkPath tmpPath;
1195 SkStrokeRec strokeRec(stroke);
1210 1196
1211 // Try a 1st time without stroking the path and without allowing the SW rend erer 1197 // Try a 1st time without stroking the path and without allowing the SW rend erer
1212 GrPathRenderer* pr = this->getPathRenderer(*pathPtr, *stroke, target, false, type); 1198 GrPathRenderer* pr = this->getPathRenderer(*pathPtr, strokeRec, target, fals e, type);
1213 1199
1214 if (NULL == pr) { 1200 if (NULL == pr) {
1215 if (!stroke->isHairlineStyle()) { 1201 if (!strokeRec.isHairlineStyle()) {
1216 // It didn't work the 1st time, so try again with the stroked path 1202 // It didn't work the 1st time, so try again with the stroked path
1217 if (stroke->applyToPath(&tmpPath, *pathPtr)) { 1203 if (strokeRec.applyToPath(&tmpPath, *pathPtr)) {
1218 pathPtr = &tmpPath; 1204 pathPtr = &tmpPath;
1219 stroke.writable()->setFillStyle(); 1205 strokeRec.setFillStyle();
1220 } 1206 }
1221 } 1207 }
1222 if (pathPtr->isEmpty()) { 1208 if (pathPtr->isEmpty()) {
1223 return; 1209 return;
1224 } 1210 }
1225 1211
1226 // This time, allow SW renderer 1212 // This time, allow SW renderer
1227 pr = this->getPathRenderer(*pathPtr, *stroke, target, true, type); 1213 pr = this->getPathRenderer(*pathPtr, strokeRec, target, true, type);
1228 } 1214 }
1229 1215
1230 if (NULL == pr) { 1216 if (NULL == pr) {
1231 #ifdef SK_DEBUG 1217 #ifdef SK_DEBUG
1232 GrPrintf("Unable to find path renderer compatible with path.\n"); 1218 GrPrintf("Unable to find path renderer compatible with path.\n");
1233 #endif 1219 #endif
1234 return; 1220 return;
1235 } 1221 }
1236 1222
1237 pr->drawPath(*pathPtr, *stroke, target, useCoverageAA); 1223 pr->drawPath(*pathPtr, strokeRec, target, useAA);
1238 } 1224 }
1239 1225
1240 //////////////////////////////////////////////////////////////////////////////// 1226 ////////////////////////////////////////////////////////////////////////////////
1241 1227
1242 void GrContext::flush(int flagsBitfield) { 1228 void GrContext::flush(int flagsBitfield) {
1243 if (NULL == fDrawBuffer) { 1229 if (NULL == fDrawBuffer) {
1244 return; 1230 return;
1245 } 1231 }
1246 1232
1247 if (kDiscard_FlushBit & flagsBitfield) { 1233 if (kDiscard_FlushBit & flagsBitfield) {
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after
1843 } 1829 }
1844 return path; 1830 return path;
1845 } 1831 }
1846 1832
1847 /////////////////////////////////////////////////////////////////////////////// 1833 ///////////////////////////////////////////////////////////////////////////////
1848 #if GR_CACHE_STATS 1834 #if GR_CACHE_STATS
1849 void GrContext::printCacheStats() const { 1835 void GrContext::printCacheStats() const {
1850 fTextureCache->printStats(); 1836 fTextureCache->printStats();
1851 } 1837 }
1852 #endif 1838 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrAAHairLinePathRenderer.cpp ('k') | src/gpu/GrDrawState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698