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

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

Issue 12657003: Move oval rendering code to GrOvalRenderer (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Remove spurious comments Created 7 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « include/gpu/GrOvalRenderer.h ('k') | src/gpu/GrOvalRenderer.cpp » ('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/GrConvolutionEffect.h" 12 #include "effects/GrConvolutionEffect.h"
13 #include "effects/GrSingleTextureEffect.h" 13 #include "effects/GrSingleTextureEffect.h"
14 #include "effects/GrConfigConversionEffect.h" 14 #include "effects/GrConfigConversionEffect.h"
15 #include "effects/GrCircleEdgeEffect.h"
16 #include "effects/GrEllipseEdgeEffect.h"
17 15
18 #include "GrBufferAllocPool.h" 16 #include "GrBufferAllocPool.h"
19 #include "GrGpu.h" 17 #include "GrGpu.h"
20 #include "GrIndexBuffer.h" 18 #include "GrIndexBuffer.h"
21 #include "GrInOrderDrawBuffer.h" 19 #include "GrInOrderDrawBuffer.h"
20 #include "GrOvalRenderer.h"
22 #include "GrPathRenderer.h" 21 #include "GrPathRenderer.h"
23 #include "GrPathUtils.h" 22 #include "GrPathUtils.h"
24 #include "GrResourceCache.h" 23 #include "GrResourceCache.h"
25 #include "GrSoftwarePathRenderer.h" 24 #include "GrSoftwarePathRenderer.h"
26 #include "GrStencilBuffer.h" 25 #include "GrStencilBuffer.h"
27 #include "GrTextStrike.h" 26 #include "GrTextStrike.h"
28 #include "SkRTConf.h" 27 #include "SkRTConf.h"
29 #include "SkStrokeRec.h" 28 #include "SkStrokeRec.h"
30 #include "SkTLazy.h" 29 #include "SkTLazy.h"
31 #include "SkTLS.h" 30 #include "SkTLS.h"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 fDrawState = NULL; 91 fDrawState = NULL;
93 fGpu = NULL; 92 fGpu = NULL;
94 fPathRendererChain = NULL; 93 fPathRendererChain = NULL;
95 fSoftwarePathRenderer = NULL; 94 fSoftwarePathRenderer = NULL;
96 fTextureCache = NULL; 95 fTextureCache = NULL;
97 fFontCache = NULL; 96 fFontCache = NULL;
98 fDrawBuffer = NULL; 97 fDrawBuffer = NULL;
99 fDrawBufferVBAllocPool = NULL; 98 fDrawBufferVBAllocPool = NULL;
100 fDrawBufferIBAllocPool = NULL; 99 fDrawBufferIBAllocPool = NULL;
101 fAARectRenderer = NULL; 100 fAARectRenderer = NULL;
101 fOvalRenderer = NULL;
102 } 102 }
103 103
104 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) { 104 bool GrContext::init(GrBackend backend, GrBackendContext backendContext) {
105 GrAssert(NULL == fGpu); 105 GrAssert(NULL == fGpu);
106 106
107 fGpu = GrGpu::Create(backend, backendContext, this); 107 fGpu = GrGpu::Create(backend, backendContext, this);
108 if (NULL == fGpu) { 108 if (NULL == fGpu) {
109 return false; 109 return false;
110 } 110 }
111 111
112 fDrawState = SkNEW(GrDrawState); 112 fDrawState = SkNEW(GrDrawState);
113 fGpu->setDrawState(fDrawState); 113 fGpu->setDrawState(fDrawState);
114 114
115 115
116 fTextureCache = SkNEW_ARGS(GrResourceCache, 116 fTextureCache = SkNEW_ARGS(GrResourceCache,
117 (MAX_TEXTURE_CACHE_COUNT, 117 (MAX_TEXTURE_CACHE_COUNT,
118 MAX_TEXTURE_CACHE_BYTES)); 118 MAX_TEXTURE_CACHE_BYTES));
119 fFontCache = SkNEW_ARGS(GrFontCache, (fGpu)); 119 fFontCache = SkNEW_ARGS(GrFontCache, (fGpu));
120 120
121 fLastDrawWasBuffered = kNo_BufferedDraw; 121 fLastDrawWasBuffered = kNo_BufferedDraw;
122 122
123 fAARectRenderer = SkNEW(GrAARectRenderer); 123 fAARectRenderer = SkNEW(GrAARectRenderer);
124 fOvalRenderer = SkNEW(GrOvalRenderer);
124 125
125 fDidTestPMConversions = false; 126 fDidTestPMConversions = false;
126 127
127 this->setupDrawBuffer(); 128 this->setupDrawBuffer();
128 129
129 return true; 130 return true;
130 } 131 }
131 132
132 int GrContext::GetThreadInstanceCount() { 133 int GrContext::GetThreadInstanceCount() {
133 return THREAD_INSTANCE_COUNT; 134 return THREAD_INSTANCE_COUNT;
(...skipping 11 matching lines...) Expand all
145 fGpu->purgeResources(); 146 fGpu->purgeResources();
146 147
147 delete fTextureCache; 148 delete fTextureCache;
148 fTextureCache = NULL; 149 fTextureCache = NULL;
149 delete fFontCache; 150 delete fFontCache;
150 delete fDrawBuffer; 151 delete fDrawBuffer;
151 delete fDrawBufferVBAllocPool; 152 delete fDrawBufferVBAllocPool;
152 delete fDrawBufferIBAllocPool; 153 delete fDrawBufferIBAllocPool;
153 154
154 fAARectRenderer->unref(); 155 fAARectRenderer->unref();
156 fOvalRenderer->unref();
155 157
156 fGpu->unref(); 158 fGpu->unref();
157 GrSafeUnref(fPathRendererChain); 159 GrSafeUnref(fPathRendererChain);
158 GrSafeUnref(fSoftwarePathRenderer); 160 GrSafeUnref(fSoftwarePathRenderer);
159 fDrawState->unref(); 161 fDrawState->unref();
160 162
161 --THREAD_INSTANCE_COUNT; 163 --THREAD_INSTANCE_COUNT;
162 } 164 }
163 165
164 void GrContext::contextLost() { 166 void GrContext::contextLost() {
(...skipping 817 matching lines...) Expand 10 before | Expand all | Expand 10 after
982 984
983 if (NULL != indices) { 985 if (NULL != indices) {
984 target->setIndexSourceToArray(indices, indexCount); 986 target->setIndexSourceToArray(indices, indexCount);
985 target->drawIndexed(primitiveType, 0, 0, vertexCount, indexCount); 987 target->drawIndexed(primitiveType, 0, 0, vertexCount, indexCount);
986 } else { 988 } else {
987 target->drawNonIndexed(primitiveType, 0, vertexCount); 989 target->drawNonIndexed(primitiveType, 0, vertexCount);
988 } 990 }
989 } 991 }
990 992
991 /////////////////////////////////////////////////////////////////////////////// 993 ///////////////////////////////////////////////////////////////////////////////
992 namespace {
993
994 struct CircleVertex {
995 GrPoint fPos;
996 GrPoint fCenter;
997 SkScalar fOuterRadius;
998 SkScalar fInnerRadius;
999 };
1000
1001 struct EllipseVertex {
1002 GrPoint fPos;
1003 GrPoint fCenter;
1004 SkScalar fOuterXRadius;
1005 SkScalar fOuterXYRatio;
1006 SkScalar fInnerXRadius;
1007 SkScalar fInnerXYRatio;
1008 };
1009
1010 inline bool circleStaysCircle(const SkMatrix& m) {
1011 return m.isSimilarity();
1012 }
1013
1014 }
1015 994
1016 void GrContext::drawOval(const GrPaint& paint, 995 void GrContext::drawOval(const GrPaint& paint,
1017 const GrRect& oval, 996 const GrRect& oval,
1018 const SkStrokeRec& stroke) { 997 const SkStrokeRec& stroke) {
1019 998
1020 bool isCircle; 999 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW);
1021 if (!canDrawOval(paint, oval, &isCircle)) { 1000 GrDrawState::AutoStageDisable atr(fDrawState);
1001
1002 if (!fOvalRenderer->drawOval(target, this, paint, oval, stroke)) {
1022 SkPath path; 1003 SkPath path;
1023 path.addOval(oval); 1004 path.addOval(oval);
1024 this->drawPath(paint, path, stroke); 1005 this->internalDrawPath(target, paint, path, stroke);
1025 return;
1026 } 1006 }
1027
1028 if (isCircle) {
1029 this->internalDrawCircle(paint, oval, stroke);
1030 } else {
1031 this->internalDrawOval(paint, oval, stroke);
1032 }
1033 }
1034
1035 bool GrContext::canDrawOval(const GrPaint& paint, const GrRect& oval, bool* isCi rcle) const {
1036 GrAssert(isCircle != NULL);
1037
1038 if (!paint.isAntiAlias()) {
1039 return false;
1040 }
1041
1042 // we can draw circles
1043 *isCircle = SkScalarNearlyEqual(oval.width(), oval.height())
1044 && circleStaysCircle(this->getMatrix());
1045 // and axis-aligned ellipses only
1046 bool isAxisAlignedEllipse = this->getMatrix().rectStaysRect();
1047
1048 return *isCircle || isAxisAlignedEllipse;
1049 }
1050
1051 void GrContext::internalDrawOval(const GrPaint& paint,
1052 const GrRect& oval,
1053 const SkStrokeRec& stroke) {
1054 #ifdef SK_DEBUG
1055 {
1056 // we should have checked for this previously
1057 bool isAxisAlignedEllipse = this->getMatrix().rectStaysRect();
1058 SkASSERT(paint.isAntiAlias() && isAxisAlignedEllipse);
1059 }
1060 #endif
1061 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW);
1062
1063 GrDrawState* drawState = target->drawState();
1064 GrDrawState::AutoStageDisable atr(fDrawState);
1065
1066 const GrRenderTarget* rt = drawState->getRenderTarget();
1067 if (NULL == rt) {
1068 return;
1069 }
1070
1071 const SkMatrix vm = drawState->getViewMatrix();
1072
1073 GrDrawState::AutoDeviceCoordDraw adcd(drawState);
1074 if (!adcd.succeeded()) {
1075 return;
1076 }
1077
1078 // position + edge
1079 static const GrVertexAttrib kVertexAttribs[] = {
1080 {kVec2f_GrVertexAttribType, 0},
1081 {kVec2f_GrVertexAttribType, sizeof(GrPoint)},
1082 {kVec4f_GrVertexAttribType, 2*sizeof(GrPoint)}
1083 };
1084 drawState->setVertexAttribs(kVertexAttribs, SK_ARRAY_COUNT(kVertexAttribs));
1085 drawState->setAttribIndex(GrDrawState::kPosition_AttribIndex, 0);
1086 GrAssert(sizeof(EllipseVertex) == drawState->getVertexSize());
1087
1088 GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0);
1089 if (!geo.succeeded()) {
1090 GrPrintf("Failed to get space for vertices!\n");
1091 return;
1092 }
1093
1094 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(geo.vertices());
1095
1096 GrPoint center = GrPoint::Make(oval.centerX(), oval.centerY());
1097 vm.mapPoints(&center, 1);
1098
1099 SkStrokeRec::Style style = stroke.getStyle();
1100 bool isStroked = (SkStrokeRec::kStroke_Style == style || SkStrokeRec::kHairl ine_Style == style);
1101 enum {
1102 // the edge effects share this stage with glyph rendering
1103 // (kGlyphMaskStage in GrTextContext) && SW path rendering
1104 // (kPathMaskStage in GrSWMaskHelper)
1105 kEdgeEffectStage = GrPaint::kTotalStages,
1106 };
1107 drawState->setAttribBindings(GrDrawState::kDefault_AttribBindings);
1108
1109 GrEffectRef* effect = GrEllipseEdgeEffect::Create(isStroked);
1110 static const int kEllipseCenterAttrIndex = 1;
1111 static const int kEllipseEdgeAttrIndex = 2;
1112 drawState->setEffect(kEdgeEffectStage, effect,
1113 kEllipseCenterAttrIndex, kEllipseEdgeAttrIndex)->unref( );
1114
1115 SkRect xformedRect;
1116 vm.mapRect(&xformedRect, oval);
1117
1118 SkScalar xRadius = SkScalarHalf(xformedRect.width());
1119 SkScalar yRadius = SkScalarHalf(xformedRect.height());
1120 SkScalar innerXRadius = 0.0f;
1121 SkScalar innerRatio = 1.0f;
1122
1123 if (SkStrokeRec::kFill_Style != style) {
1124 SkScalar strokeWidth = stroke.getWidth();
1125
1126 // do (potentially) anisotropic mapping
1127 SkVector scaledStroke;
1128 scaledStroke.set(strokeWidth, strokeWidth);
1129 vm.mapVectors(&scaledStroke, 1);
1130
1131 if (SkScalarNearlyZero(scaledStroke.length())) {
1132 scaledStroke.set(SK_ScalarHalf, SK_ScalarHalf);
1133 } else {
1134 scaledStroke.scale(0.5f);
1135 }
1136
1137 // this is legit only if scale & translation (which should be the case a t the moment)
1138 if (SkStrokeRec::kStroke_Style == style || SkStrokeRec::kHairline_Style == style) {
1139 SkScalar innerYRadius = SkMaxScalar(0, yRadius - scaledStroke.fY);
1140 if (innerYRadius > SK_ScalarNearlyZero) {
1141 innerXRadius = SkMaxScalar(0, xRadius - scaledStroke.fX);
1142 innerRatio = innerXRadius/innerYRadius;
1143 }
1144 }
1145 xRadius += scaledStroke.fX;
1146 yRadius += scaledStroke.fY;
1147 }
1148
1149 SkScalar outerRatio = SkScalarDiv(xRadius, yRadius);
1150
1151 for (int i = 0; i < 4; ++i) {
1152 verts[i].fCenter = center;
1153 verts[i].fOuterXRadius = xRadius + 0.5f;
1154 verts[i].fOuterXYRatio = outerRatio;
1155 verts[i].fInnerXRadius = innerXRadius - 0.5f;
1156 verts[i].fInnerXYRatio = innerRatio;
1157 }
1158
1159 SkScalar L = -xRadius;
1160 SkScalar R = +xRadius;
1161 SkScalar T = -yRadius;
1162 SkScalar B = +yRadius;
1163
1164 // We've extended the outer x radius out half a pixel to antialias.
1165 // Expand the drawn rect here so all the pixels will be captured.
1166 L += center.fX - SK_ScalarHalf;
1167 R += center.fX + SK_ScalarHalf;
1168 T += center.fY - SK_ScalarHalf;
1169 B += center.fY + SK_ScalarHalf;
1170
1171 verts[0].fPos = SkPoint::Make(L, T);
1172 verts[1].fPos = SkPoint::Make(R, T);
1173 verts[2].fPos = SkPoint::Make(L, B);
1174 verts[3].fPos = SkPoint::Make(R, B);
1175
1176 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4);
1177 }
1178
1179 void GrContext::internalDrawCircle(const GrPaint& paint,
1180 const GrRect& circle,
1181 const SkStrokeRec& stroke) {
1182
1183 SkScalar radius = SkScalarHalf(circle.width());
1184
1185 SkScalar strokeWidth = stroke.getWidth();
1186 SkStrokeRec::Style style = stroke.getStyle();
1187
1188 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW);
1189
1190 GrDrawState* drawState = target->drawState();
1191 GrDrawState::AutoStageDisable atr(fDrawState);
1192
1193 const GrRenderTarget* rt = drawState->getRenderTarget();
1194 if (NULL == rt) {
1195 return;
1196 }
1197
1198 const SkMatrix vm = drawState->getViewMatrix();
1199
1200 GrDrawState::AutoDeviceCoordDraw adcd(drawState);
1201 if (!adcd.succeeded()) {
1202 return;
1203 }
1204
1205 // position + edge
1206 static const GrVertexAttrib kVertexAttribs[] = {
1207 {kVec2f_GrVertexAttribType, 0},
1208 {kVec4f_GrVertexAttribType, sizeof(GrPoint)}
1209 };
1210 drawState->setVertexAttribs(kVertexAttribs, SK_ARRAY_COUNT(kVertexAttribs));
1211 drawState->setAttribIndex(GrDrawState::kPosition_AttribIndex, 0);
1212 GrAssert(sizeof(CircleVertex) == drawState->getVertexSize());
1213
1214 GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0);
1215 if (!geo.succeeded()) {
1216 GrPrintf("Failed to get space for vertices!\n");
1217 return;
1218 }
1219
1220 CircleVertex* verts = reinterpret_cast<CircleVertex*>(geo.vertices());
1221
1222 GrPoint center = GrPoint::Make(circle.centerX(), circle.centerY());
1223 vm.mapPoints(&center, 1);
1224
1225 bool isStroked = (SkStrokeRec::kStroke_Style == style || SkStrokeRec::kHairl ine_Style == style);
1226 enum {
1227 // the edge effects share this stage with glyph rendering
1228 // (kGlyphMaskStage in GrTextContext) && SW path rendering
1229 // (kPathMaskStage in GrSWMaskHelper)
1230 kEdgeEffectStage = GrPaint::kTotalStages,
1231 };
1232 drawState->setAttribBindings(GrDrawState::kDefault_AttribBindings);
1233
1234 GrEffectRef* effect = GrCircleEdgeEffect::Create(isStroked);
1235 static const int kCircleEdgeAttrIndex = 1;
1236 drawState->setEffect(kEdgeEffectStage, effect, kCircleEdgeAttrIndex)->unref( );
1237
1238 radius = vm.mapRadius(radius);
1239
1240 SkScalar innerRadius = -2.0f;
1241 SkScalar outerRadius = radius;
1242 SkScalar halfWidth = 0;
1243 if (style != SkStrokeRec::kFill_Style) {
1244 strokeWidth = vm.mapRadius(strokeWidth);
1245 if (SkScalarNearlyZero(strokeWidth)) {
1246 halfWidth = SK_ScalarHalf;
1247 } else {
1248 halfWidth = SkScalarHalf(strokeWidth);
1249 }
1250
1251 outerRadius += halfWidth;
1252 if (isStroked) {
1253 innerRadius = SkMaxScalar(0, radius - halfWidth);
1254 }
1255 }
1256
1257 for (int i = 0; i < 4; ++i) {
1258 verts[i].fCenter = center;
1259 verts[i].fOuterRadius = outerRadius + 0.5f;
1260 verts[i].fInnerRadius = innerRadius - 0.5f;
1261 }
1262
1263 SkScalar L = -outerRadius;
1264 SkScalar R = +outerRadius;
1265 SkScalar T = -outerRadius;
1266 SkScalar B = +outerRadius;
1267
1268 // We've extended the outer radius out half a pixel to antialias.
1269 // Expand the drawn rect here so all the pixels will be captured.
1270 L += center.fX - SK_ScalarHalf;
1271 R += center.fX + SK_ScalarHalf;
1272 T += center.fY - SK_ScalarHalf;
1273 B += center.fY + SK_ScalarHalf;
1274
1275 verts[0].fPos = SkPoint::Make(L, T);
1276 verts[1].fPos = SkPoint::Make(R, T);
1277 verts[2].fPos = SkPoint::Make(L, B);
1278 verts[3].fPos = SkPoint::Make(R, B);
1279
1280 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, 4);
1281 } 1007 }
1282 1008
1283 void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const SkStrok eRec& stroke) { 1009 void GrContext::drawPath(const GrPaint& paint, const SkPath& path, const SkStrok eRec& stroke) {
1284 1010
1285 if (path.isEmpty()) { 1011 if (path.isEmpty()) {
1286 if (path.isInverseFillType()) { 1012 if (path.isInverseFillType()) {
1287 this->drawPaint(paint); 1013 this->drawPaint(paint);
1288 } 1014 }
1289 return; 1015 return;
1290 } 1016 }
1291 1017
1292 SkRect ovalRect; 1018 // Note that internalDrawPath may sw-rasterize the path into a scratch textu re.
1293 bool isOval = path.isOval(&ovalRect);
1294
1295 bool isCircle;
1296 if (isOval && !path.isInverseFillType() && this->canDrawOval(paint, ovalRect , &isCircle)) {
1297 if (isCircle) {
1298 this->internalDrawCircle(paint, ovalRect, stroke);
1299 } else {
1300 this->internalDrawOval(paint, ovalRect, stroke);
1301 }
1302 return;
1303 }
1304
1305 this->internalDrawPath(paint, path, stroke);
1306 }
1307
1308 void GrContext::internalDrawPath(const GrPaint& paint, const SkPath& path,
1309 const SkStrokeRec& stroke) {
1310
1311 // Note that below we may sw-rasterize the path into a scratch texture.
1312 // Scratch textures can be recycled after they are returned to the texture 1019 // Scratch textures can be recycled after they are returned to the texture
1313 // cache. This presents a potential hazard for buffered drawing. However, 1020 // cache. This presents a potential hazard for buffered drawing. However,
1314 // the writePixels that uploads to the scratch will perform a flush so we're 1021 // the writePixels that uploads to the scratch will perform a flush so we're
1315 // OK. 1022 // OK.
1316 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW); 1023 GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW);
1317 GrDrawState::AutoStageDisable atr(fDrawState); 1024 GrDrawState::AutoStageDisable atr(fDrawState);
1318 1025
1026 SkRect ovalRect;
1027 bool isOval = path.isOval(&ovalRect);
1028
1029 if (!isOval || path.isInverseFillType()
1030 || !fOvalRenderer->drawOval(target, this, paint, ovalRect, stroke)) {
1031 this->internalDrawPath(target, paint, path, stroke);
1032 }
1033 }
1034
1035 void GrContext::internalDrawPath(GrDrawTarget* target, const GrPaint& paint, con st SkPath& path,
1036 const SkStrokeRec& stroke) {
1037
1319 bool prAA = paint.isAntiAlias() && !this->getRenderTarget()->isMultisampled( ); 1038 bool prAA = paint.isAntiAlias() && !this->getRenderTarget()->isMultisampled( );
1320 1039
1321 // An Assumption here is that path renderer would use some form of tweaking 1040 // An Assumption here is that path renderer would use some form of tweaking
1322 // the src color (either the input alpha or in the frag shader) to implement 1041 // the src color (either the input alpha or in the frag shader) to implement
1323 // aa. If we have some future driver-mojo path AA that can do the right 1042 // aa. If we have some future driver-mojo path AA that can do the right
1324 // thing WRT to the blend then we'll need some query on the PR. 1043 // thing WRT to the blend then we'll need some query on the PR.
1325 if (disable_coverage_aa_for_blend(target)) { 1044 if (disable_coverage_aa_for_blend(target)) {
1326 #if GR_DEBUG 1045 #if GR_DEBUG
1327 //GrPrintf("Turning off AA to correctly apply blend.\n"); 1046 //GrPrintf("Turning off AA to correctly apply blend.\n");
1328 #endif 1047 #endif
(...skipping 759 matching lines...) Expand 10 before | Expand all | Expand 10 after
2088 return srcTexture; 1807 return srcTexture;
2089 } 1808 }
2090 } 1809 }
2091 1810
2092 /////////////////////////////////////////////////////////////////////////////// 1811 ///////////////////////////////////////////////////////////////////////////////
2093 #if GR_CACHE_STATS 1812 #if GR_CACHE_STATS
2094 void GrContext::printCacheStats() const { 1813 void GrContext::printCacheStats() const {
2095 fTextureCache->printStats(); 1814 fTextureCache->printStats();
2096 } 1815 }
2097 #endif 1816 #endif
OLDNEW
« no previous file with comments | « include/gpu/GrOvalRenderer.h ('k') | src/gpu/GrOvalRenderer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698