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

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

Issue 1132323003: Revert of Preliminary attempt to remove batch tracker (Closed) Base URL: https://skia.googlesource.com/skia.git@cleanup5
Patch Set: Created 5 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/GrGeometryProcessor.h ('k') | src/gpu/GrPathProcessor.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 * Copyright 2013 Google Inc. 2 * Copyright 2013 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 "GrOvalRenderer.h" 8 #include "GrOvalRenderer.h"
9 9
10 #include "GrBatch.h" 10 #include "GrBatch.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
64 * with origin at the circle center. Two vertex attributes are used: 64 * with origin at the circle center. Two vertex attributes are used:
65 * vec2f : position in device space of the bounding geometry vertices 65 * vec2f : position in device space of the bounding geometry vertices
66 * vec4f : (p.xy, outerRad, innerRad) 66 * vec4f : (p.xy, outerRad, innerRad)
67 * p is the position in the normalized space. 67 * p is the position in the normalized space.
68 * outerRad is the outerRadius in device space. 68 * outerRad is the outerRadius in device space.
69 * innerRad is the innerRadius in normalized space (ignored if not s troking). 69 * innerRad is the innerRadius in normalized space (ignored if not s troking).
70 */ 70 */
71 71
72 class CircleEdgeEffect : public GrGeometryProcessor { 72 class CircleEdgeEffect : public GrGeometryProcessor {
73 public: 73 public:
74 static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatri x& localMatrix, 74 static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatri x& localMatrix) {
75 bool usesLocalCoords) { 75 return SkNEW_ARGS(CircleEdgeEffect, (color, stroke, localMatrix));
76 return SkNEW_ARGS(CircleEdgeEffect, (color, stroke, localMatrix, usesLoc alCoords));
77 } 76 }
78 77
79 const Attribute* inPosition() const { return fInPosition; } 78 const Attribute* inPosition() const { return fInPosition; }
80 const Attribute* inCircleEdge() const { return fInCircleEdge; } 79 const Attribute* inCircleEdge() const { return fInCircleEdge; }
81 GrColor color() const { return fColor; } 80 GrColor color() const { return fColor; }
82 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; }
83 const SkMatrix& localMatrix() const { return fLocalMatrix; } 81 const SkMatrix& localMatrix() const { return fLocalMatrix; }
84 bool usesLocalCoords() const { return fUsesLocalCoords; }
85 virtual ~CircleEdgeEffect() {} 82 virtual ~CircleEdgeEffect() {}
86 83
87 const char* name() const override { return "CircleEdge"; } 84 const char* name() const override { return "CircleEdge"; }
88 85
89 inline bool isStroked() const { return fStroke; } 86 inline bool isStroked() const { return fStroke; }
90 87
91 class GLProcessor : public GrGLGeometryProcessor { 88 class GLProcessor : public GrGLGeometryProcessor {
92 public: 89 public:
93 GLProcessor(const GrGeometryProcessor&, 90 GLProcessor(const GrGeometryProcessor&,
94 const GrBatchTracker&) 91 const GrBatchTracker&)
95 : fColor(GrColor_ILLEGAL) {} 92 : fColor(GrColor_ILLEGAL) {}
96 93
97 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 94 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
98 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); 95 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>();
99 GrGLGPBuilder* pb = args.fPB; 96 GrGLGPBuilder* pb = args.fPB;
97 const BatchTracker& local = args.fBT.cast<BatchTracker>();
100 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 98 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
101 99
102 // emit attributes 100 // emit attributes
103 vsBuilder->emitAttributes(ce); 101 vsBuilder->emitAttributes(ce);
104 102
105 GrGLVertToFrag v(kVec4f_GrSLType); 103 GrGLVertToFrag v(kVec4f_GrSLType);
106 args.fPB->addVarying("CircleEdge", &v); 104 args.fPB->addVarying("CircleEdge", &v);
107 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa me); 105 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa me);
108 106
109 // setup pass through color 107 // Setup pass through color
110 if (!ce.colorIgnored()) { 108 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC olor, NULL,
111 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 109 &fColorUniform);
112 }
113 110
114 // Setup position 111 // Setup position
115 this->setupPosition(pb, gpArgs, ce.inPosition()->fName); 112 this->setupPosition(pb, gpArgs, ce.inPosition()->fName);
116 113
117 // emit transforms 114 // emit transforms
118 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ce.inPosition() ->fName, 115 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ce.inPosition() ->fName,
119 ce.localMatrix(), args.fTransformsIn, args.fTra nsformsOut); 116 ce.localMatrix(), args.fTransformsIn, args.fTra nsformsOut);
120 117
121 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder( ); 118 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder( );
122 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); 119 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn());
123 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0. 0, 1.0);", v.fsIn()); 120 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0. 0, 1.0);", v.fsIn());
124 if (ce.isStroked()) { 121 if (ce.isStroked()) {
125 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s. w), 0.0, 1.0);", 122 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s. w), 0.0, 1.0);",
126 v.fsIn(), v.fsIn()); 123 v.fsIn(), v.fsIn());
127 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); 124 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;");
128 } 125 }
129 126
130 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage ); 127 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage );
131 } 128 }
132 129
133 static void GenKey(const GrGeometryProcessor& gp, 130 static void GenKey(const GrGeometryProcessor& gp,
134 const GrBatchTracker& bt, 131 const GrBatchTracker& bt,
135 const GrGLSLCaps&, 132 const GrGLSLCaps&,
136 GrProcessorKeyBuilder* b) { 133 GrProcessorKeyBuilder* b) {
134 const BatchTracker& local = bt.cast<BatchTracker>();
137 const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>(); 135 const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>();
138 uint16_t key = ce.isStroked() ? 0x1 : 0x0; 136 uint16_t key = ce.isStroked() ? 0x1 : 0x0;
139 key |= ce.usesLocalCoords() && ce.localMatrix().hasPerspective() ? 0 x2 : 0x0; 137 key |= local.fUsesLocalCoords && ce.localMatrix().hasPerspective() ? 0x2 : 0x0;
140 key |= ce.colorIgnored() ? 0x4 : 0x0; 138 b->add32(key << 16 | local.fInputColorType);
141 b->add32(key);
142 } 139 }
143 140
144 virtual void setData(const GrGLProgramDataManager& pdman, 141 virtual void setData(const GrGLProgramDataManager& pdman,
145 const GrPrimitiveProcessor& gp, 142 const GrPrimitiveProcessor& gp,
146 const GrBatchTracker& bt) override { 143 const GrBatchTracker& bt) override {
147 const CircleEdgeEffect& ce = gp.cast<CircleEdgeEffect>(); 144 const BatchTracker& local = bt.cast<BatchTracker>();
148 if (ce.color() != fColor) { 145 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f Color) {
149 GrGLfloat c[4]; 146 GrGLfloat c[4];
150 GrColorToRGBAFloat(ce.color(), c); 147 GrColorToRGBAFloat(local.fColor, c);
151 pdman.set4fv(fColorUniform, 1, c); 148 pdman.set4fv(fColorUniform, 1, c);
152 fColor = ce.color(); 149 fColor = local.fColor;
153 } 150 }
154 } 151 }
155 152
156 void setTransformData(const GrPrimitiveProcessor& primProc, 153 void setTransformData(const GrPrimitiveProcessor& primProc,
157 const GrGLProgramDataManager& pdman, 154 const GrGLProgramDataManager& pdman,
158 int index, 155 int index,
159 const SkTArray<const GrCoordTransform*, true>& tra nsforms) override { 156 const SkTArray<const GrCoordTransform*, true>& tra nsforms) override {
160 this->setTransformDataHelper<CircleEdgeEffect>(primProc, pdman, inde x, transforms); 157 this->setTransformDataHelper<CircleEdgeEffect>(primProc, pdman, inde x, transforms);
161 } 158 }
162 159
163 private: 160 private:
164 GrColor fColor; 161 GrColor fColor;
165 UniformHandle fColorUniform; 162 UniformHandle fColorUniform;
166 typedef GrGLGeometryProcessor INHERITED; 163 typedef GrGLGeometryProcessor INHERITED;
167 }; 164 };
168 165
169 virtual void getGLProcessorKey(const GrBatchTracker& bt, 166 virtual void getGLProcessorKey(const GrBatchTracker& bt,
170 const GrGLSLCaps& caps, 167 const GrGLSLCaps& caps,
171 GrProcessorKeyBuilder* b) const override { 168 GrProcessorKeyBuilder* b) const override {
172 GLProcessor::GenKey(*this, bt, caps, b); 169 GLProcessor::GenKey(*this, bt, caps, b);
173 } 170 }
174 171
175 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, 172 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt,
176 const GrGLSLCaps&) const ov erride { 173 const GrGLSLCaps&) const ov erride {
177 return SkNEW_ARGS(GLProcessor, (*this, bt)); 174 return SkNEW_ARGS(GLProcessor, (*this, bt));
178 } 175 }
179 176
177 void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override {
178 BatchTracker* local = bt->cast<BatchTracker>();
179 local->fInputColorType = GetColorInputType(&local->fColor, this->color() , init, false);
180 local->fUsesLocalCoords = init.fUsesLocalCoords;
181 }
182
180 private: 183 private:
181 CircleEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix, bo ol usesLocalCoords) 184 CircleEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix)
182 : fColor(color) 185 : fColor(color)
183 , fLocalMatrix(localMatrix) 186 , fLocalMatrix(localMatrix) {
184 , fUsesLocalCoords(usesLocalCoords) {
185 this->initClassID<CircleEdgeEffect>(); 187 this->initClassID<CircleEdgeEffect>();
186 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe rtexAttribType)); 188 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe rtexAttribType));
187 fInCircleEdge = &this->addVertexAttrib(Attribute("inCircleEdge", 189 fInCircleEdge = &this->addVertexAttrib(Attribute("inCircleEdge",
188 kVec4f_GrVertexAttrib Type)); 190 kVec4f_GrVertexAttrib Type));
189 fStroke = stroke; 191 fStroke = stroke;
190 } 192 }
191 193
194 struct BatchTracker {
195 GrGPInput fInputColorType;
196 GrColor fColor;
197 bool fUsesLocalCoords;
198 };
199
192 GrColor fColor; 200 GrColor fColor;
193 SkMatrix fLocalMatrix; 201 SkMatrix fLocalMatrix;
194 const Attribute* fInPosition; 202 const Attribute* fInPosition;
195 const Attribute* fInCircleEdge; 203 const Attribute* fInCircleEdge;
196 bool fStroke; 204 bool fStroke;
197 bool fUsesLocalCoords;
198 205
199 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 206 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
200 207
201 typedef GrGeometryProcessor INHERITED; 208 typedef GrGeometryProcessor INHERITED;
202 }; 209 };
203 210
204 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(CircleEdgeEffect); 211 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(CircleEdgeEffect);
205 212
206 GrGeometryProcessor* CircleEdgeEffect::TestCreate(SkRandom* random, 213 GrGeometryProcessor* CircleEdgeEffect::TestCreate(SkRandom* random,
207 GrContext* context, 214 GrContext* context,
208 const GrDrawTargetCaps&, 215 const GrDrawTargetCaps&,
209 GrTexture* textures[]) { 216 GrTexture* textures[]) {
210 return CircleEdgeEffect::Create(GrRandomColor(random), 217 return CircleEdgeEffect::Create(GrRandomColor(random),
211 random->nextBool(), 218 random->nextBool(),
212 GrTest::TestMatrix(random), 219 GrTest::TestMatrix(random));
213 random->nextBool());
214 } 220 }
215 221
216 /////////////////////////////////////////////////////////////////////////////// 222 ///////////////////////////////////////////////////////////////////////////////
217 223
218 /** 224 /**
219 * The output of this effect is a modulation of the input color and coverage for an axis-aligned 225 * The output of this effect is a modulation of the input color and coverage for an axis-aligned
220 * ellipse, specified as a 2D offset from center, and the reciprocals of the out er and inner radii, 226 * ellipse, specified as a 2D offset from center, and the reciprocals of the out er and inner radii,
221 * in both x and y directions. 227 * in both x and y directions.
222 * 228 *
223 * We are using an implicit function of x^2/a^2 + y^2/b^2 - 1 = 0. 229 * We are using an implicit function of x^2/a^2 + y^2/b^2 - 1 = 0.
224 */ 230 */
225 231
226 class EllipseEdgeEffect : public GrGeometryProcessor { 232 class EllipseEdgeEffect : public GrGeometryProcessor {
227 public: 233 public:
228 static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatri x& localMatrix, 234 static GrGeometryProcessor* Create(GrColor color, bool stroke, const SkMatri x& localMatrix) {
229 bool usesLocalCoords) { 235 return SkNEW_ARGS(EllipseEdgeEffect, (color, stroke, localMatrix));
230 return SkNEW_ARGS(EllipseEdgeEffect, (color, stroke, localMatrix, usesLo calCoords));
231 } 236 }
232 237
233 virtual ~EllipseEdgeEffect() {} 238 virtual ~EllipseEdgeEffect() {}
234 239
235 const char* name() const override { return "EllipseEdge"; } 240 const char* name() const override { return "EllipseEdge"; }
236 241
237 const Attribute* inPosition() const { return fInPosition; } 242 const Attribute* inPosition() const { return fInPosition; }
238 const Attribute* inEllipseOffset() const { return fInEllipseOffset; } 243 const Attribute* inEllipseOffset() const { return fInEllipseOffset; }
239 const Attribute* inEllipseRadii() const { return fInEllipseRadii; } 244 const Attribute* inEllipseRadii() const { return fInEllipseRadii; }
240 GrColor color() const { return fColor; } 245 GrColor color() const { return fColor; }
241 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; }
242 const SkMatrix& localMatrix() const { return fLocalMatrix; } 246 const SkMatrix& localMatrix() const { return fLocalMatrix; }
243 bool usesLocalCoords() const { return fUsesLocalCoords; }
244 247
245 inline bool isStroked() const { return fStroke; } 248 inline bool isStroked() const { return fStroke; }
246 249
247 class GLProcessor : public GrGLGeometryProcessor { 250 class GLProcessor : public GrGLGeometryProcessor {
248 public: 251 public:
249 GLProcessor(const GrGeometryProcessor&, 252 GLProcessor(const GrGeometryProcessor&,
250 const GrBatchTracker&) 253 const GrBatchTracker&)
251 : fColor(GrColor_ILLEGAL) {} 254 : fColor(GrColor_ILLEGAL) {}
252 255
253 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 256 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
254 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); 257 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>();
255 GrGLGPBuilder* pb = args.fPB; 258 GrGLGPBuilder* pb = args.fPB;
259 const BatchTracker& local = args.fBT.cast<BatchTracker>();
256 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 260 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
257 261
258 // emit attributes 262 // emit attributes
259 vsBuilder->emitAttributes(ee); 263 vsBuilder->emitAttributes(ee);
260 264
261 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType); 265 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType);
262 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); 266 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets);
263 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), 267 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(),
264 ee.inEllipseOffset()->fName); 268 ee.inEllipseOffset()->fName);
265 269
266 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType); 270 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType);
267 args.fPB->addVarying("EllipseRadii", &ellipseRadii); 271 args.fPB->addVarying("EllipseRadii", &ellipseRadii);
268 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), 272 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(),
269 ee.inEllipseRadii()->fName); 273 ee.inEllipseRadii()->fName);
270 274
271 // setup pass through color 275 // Setup pass through color
272 if (!ee.colorIgnored()) { 276 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC olor, NULL,
273 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 277 &fColorUniform);
274 }
275 278
276 // Setup position 279 // Setup position
277 this->setupPosition(pb, gpArgs, ee.inPosition()->fName); 280 this->setupPosition(pb, gpArgs, ee.inPosition()->fName);
278 281
279 // emit transforms 282 // emit transforms
280 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition() ->fName, 283 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition() ->fName,
281 ee.localMatrix(), args.fTransformsIn, args.fTra nsformsOut); 284 ee.localMatrix(), args.fTransformsIn, args.fTra nsformsOut);
282 285
283 // for outer curve 286 // for outer curve
284 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder( ); 287 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder( );
(...skipping 19 matching lines...) Expand all
304 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);"); 307 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);");
305 } 308 }
306 309
307 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage ); 310 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage );
308 } 311 }
309 312
310 static void GenKey(const GrGeometryProcessor& gp, 313 static void GenKey(const GrGeometryProcessor& gp,
311 const GrBatchTracker& bt, 314 const GrBatchTracker& bt,
312 const GrGLSLCaps&, 315 const GrGLSLCaps&,
313 GrProcessorKeyBuilder* b) { 316 GrProcessorKeyBuilder* b) {
317 const BatchTracker& local = bt.cast<BatchTracker>();
314 const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>(); 318 const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>();
315 uint16_t key = ee.isStroked() ? 0x1 : 0x0; 319 uint16_t key = ee.isStroked() ? 0x1 : 0x0;
316 key |= ee.usesLocalCoords() && ee.localMatrix().hasPerspective() ? 0 x2 : 0x0; 320 key |= local.fUsesLocalCoords && ee.localMatrix().hasPerspective() ? 0x2 : 0x0;
317 key |= ee.colorIgnored() ? 0x4 : 0x0; 321 b->add32(key << 16 | local.fInputColorType);
318 b->add32(key);
319 } 322 }
320 323
321 virtual void setData(const GrGLProgramDataManager& pdman, 324 virtual void setData(const GrGLProgramDataManager& pdman,
322 const GrPrimitiveProcessor& gp, 325 const GrPrimitiveProcessor& gp,
323 const GrBatchTracker& bt) override { 326 const GrBatchTracker& bt) override {
324 const EllipseEdgeEffect& ee = gp.cast<EllipseEdgeEffect>(); 327
325 if (ee.color() != fColor) { 328 const BatchTracker& local = bt.cast<BatchTracker>();
329 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f Color) {
326 GrGLfloat c[4]; 330 GrGLfloat c[4];
327 GrColorToRGBAFloat(ee.color(), c); 331 GrColorToRGBAFloat(local.fColor, c);
328 pdman.set4fv(fColorUniform, 1, c); 332 pdman.set4fv(fColorUniform, 1, c);
329 fColor = ee.color(); 333 fColor = local.fColor;
330 } 334 }
331 } 335 }
332 336
333 void setTransformData(const GrPrimitiveProcessor& primProc, 337 void setTransformData(const GrPrimitiveProcessor& primProc,
334 const GrGLProgramDataManager& pdman, 338 const GrGLProgramDataManager& pdman,
335 int index, 339 int index,
336 const SkTArray<const GrCoordTransform*, true>& tra nsforms) override { 340 const SkTArray<const GrCoordTransform*, true>& tra nsforms) override {
337 this->setTransformDataHelper<EllipseEdgeEffect>(primProc, pdman, ind ex, transforms); 341 this->setTransformDataHelper<EllipseEdgeEffect>(primProc, pdman, ind ex, transforms);
338 } 342 }
339 343
340 private: 344 private:
341 GrColor fColor; 345 GrColor fColor;
342 UniformHandle fColorUniform; 346 UniformHandle fColorUniform;
343 347
344 typedef GrGLGeometryProcessor INHERITED; 348 typedef GrGLGeometryProcessor INHERITED;
345 }; 349 };
346 350
347 virtual void getGLProcessorKey(const GrBatchTracker& bt, 351 virtual void getGLProcessorKey(const GrBatchTracker& bt,
348 const GrGLSLCaps& caps, 352 const GrGLSLCaps& caps,
349 GrProcessorKeyBuilder* b) const override { 353 GrProcessorKeyBuilder* b) const override {
350 GLProcessor::GenKey(*this, bt, caps, b); 354 GLProcessor::GenKey(*this, bt, caps, b);
351 } 355 }
352 356
353 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, 357 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt,
354 const GrGLSLCaps&) const ov erride { 358 const GrGLSLCaps&) const ov erride {
355 return SkNEW_ARGS(GLProcessor, (*this, bt)); 359 return SkNEW_ARGS(GLProcessor, (*this, bt));
356 } 360 }
357 361
362 void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override {
363 BatchTracker* local = bt->cast<BatchTracker>();
364 local->fInputColorType = GetColorInputType(&local->fColor, this->color() , init, false);
365 local->fUsesLocalCoords = init.fUsesLocalCoords;
366 }
367
358 private: 368 private:
359 EllipseEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix, 369 EllipseEdgeEffect(GrColor color, bool stroke, const SkMatrix& localMatrix)
360 bool usesLocalCoords)
361 : fColor(color) 370 : fColor(color)
362 , fLocalMatrix(localMatrix) 371 , fLocalMatrix(localMatrix) {
363 , fUsesLocalCoords(usesLocalCoords) {
364 this->initClassID<EllipseEdgeEffect>(); 372 this->initClassID<EllipseEdgeEffect>();
365 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe rtexAttribType)); 373 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe rtexAttribType));
366 fInEllipseOffset = &this->addVertexAttrib(Attribute("inEllipseOffset", 374 fInEllipseOffset = &this->addVertexAttrib(Attribute("inEllipseOffset",
367 kVec2f_GrVertexAtt ribType)); 375 kVec2f_GrVertexAtt ribType));
368 fInEllipseRadii = &this->addVertexAttrib(Attribute("inEllipseRadii", 376 fInEllipseRadii = &this->addVertexAttrib(Attribute("inEllipseRadii",
369 kVec4f_GrVertexAttr ibType)); 377 kVec4f_GrVertexAttr ibType));
370 fStroke = stroke; 378 fStroke = stroke;
371 } 379 }
372 380
381 struct BatchTracker {
382 GrGPInput fInputColorType;
383 GrColor fColor;
384 bool fUsesLocalCoords;
385 };
386
373 const Attribute* fInPosition; 387 const Attribute* fInPosition;
374 const Attribute* fInEllipseOffset; 388 const Attribute* fInEllipseOffset;
375 const Attribute* fInEllipseRadii; 389 const Attribute* fInEllipseRadii;
376 GrColor fColor; 390 GrColor fColor;
377 SkMatrix fLocalMatrix; 391 SkMatrix fLocalMatrix;
378 bool fStroke; 392 bool fStroke;
379 bool fUsesLocalCoords;
380 393
381 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 394 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
382 395
383 typedef GrGeometryProcessor INHERITED; 396 typedef GrGeometryProcessor INHERITED;
384 }; 397 };
385 398
386 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(EllipseEdgeEffect); 399 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(EllipseEdgeEffect);
387 400
388 GrGeometryProcessor* EllipseEdgeEffect::TestCreate(SkRandom* random, 401 GrGeometryProcessor* EllipseEdgeEffect::TestCreate(SkRandom* random,
389 GrContext* context, 402 GrContext* context,
390 const GrDrawTargetCaps&, 403 const GrDrawTargetCaps&,
391 GrTexture* textures[]) { 404 GrTexture* textures[]) {
392 return EllipseEdgeEffect::Create(GrRandomColor(random), 405 return EllipseEdgeEffect::Create(GrRandomColor(random),
393 random->nextBool(), 406 random->nextBool(),
394 GrTest::TestMatrix(random), 407 GrTest::TestMatrix(random));
395 random->nextBool());
396 } 408 }
397 409
398 /////////////////////////////////////////////////////////////////////////////// 410 ///////////////////////////////////////////////////////////////////////////////
399 411
400 /** 412 /**
401 * The output of this effect is a modulation of the input color and coverage for an ellipse, 413 * The output of this effect is a modulation of the input color and coverage for an ellipse,
402 * specified as a 2D offset from center for both the outer and inner paths (if s troked). The 414 * specified as a 2D offset from center for both the outer and inner paths (if s troked). The
403 * implict equation used is for a unit circle (x^2 + y^2 - 1 = 0) and the edge c orrected by 415 * implict equation used is for a unit circle (x^2 + y^2 - 1 = 0) and the edge c orrected by
404 * using differentials. 416 * using differentials.
405 * 417 *
406 * The result is device-independent and can be used with any affine matrix. 418 * The result is device-independent and can be used with any affine matrix.
407 */ 419 */
408 420
409 class DIEllipseEdgeEffect : public GrGeometryProcessor { 421 class DIEllipseEdgeEffect : public GrGeometryProcessor {
410 public: 422 public:
411 enum Mode { kStroke = 0, kHairline, kFill }; 423 enum Mode { kStroke = 0, kHairline, kFill };
412 424
413 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix , Mode mode, 425 static GrGeometryProcessor* Create(GrColor color, const SkMatrix& viewMatrix , Mode mode) {
414 bool usesLocalCoords) { 426 return SkNEW_ARGS(DIEllipseEdgeEffect, (color, viewMatrix, mode));
415 return SkNEW_ARGS(DIEllipseEdgeEffect, (color, viewMatrix, mode, usesLoc alCoords));
416 } 427 }
417 428
418 virtual ~DIEllipseEdgeEffect() {} 429 virtual ~DIEllipseEdgeEffect() {}
419 430
420 const char* name() const override { return "DIEllipseEdge"; } 431 const char* name() const override { return "DIEllipseEdge"; }
421 432
422 const Attribute* inPosition() const { return fInPosition; } 433 const Attribute* inPosition() const { return fInPosition; }
423 const Attribute* inEllipseOffsets0() const { return fInEllipseOffsets0; } 434 const Attribute* inEllipseOffsets0() const { return fInEllipseOffsets0; }
424 const Attribute* inEllipseOffsets1() const { return fInEllipseOffsets1; } 435 const Attribute* inEllipseOffsets1() const { return fInEllipseOffsets1; }
425 GrColor color() const { return fColor; } 436 GrColor color() const { return fColor; }
426 bool colorIgnored() const { return GrColor_ILLEGAL == fColor; }
427 const SkMatrix& viewMatrix() const { return fViewMatrix; } 437 const SkMatrix& viewMatrix() const { return fViewMatrix; }
428 bool usesLocalCoords() const { return fUsesLocalCoords; }
429 438
430 inline Mode getMode() const { return fMode; } 439 inline Mode getMode() const { return fMode; }
431 440
432 class GLProcessor : public GrGLGeometryProcessor { 441 class GLProcessor : public GrGLGeometryProcessor {
433 public: 442 public:
434 GLProcessor(const GrGeometryProcessor&, 443 GLProcessor(const GrGeometryProcessor&,
435 const GrBatchTracker&) 444 const GrBatchTracker&)
436 : fColor(GrColor_ILLEGAL) {} 445 : fColor(GrColor_ILLEGAL) {}
437 446
438 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 447 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
439 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>() ; 448 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>() ;
440 GrGLGPBuilder* pb = args.fPB; 449 GrGLGPBuilder* pb = args.fPB;
450 const BatchTracker& local = args.fBT.cast<BatchTracker>();
441 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 451 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
442 452
443 // emit attributes 453 // emit attributes
444 vsBuilder->emitAttributes(ee); 454 vsBuilder->emitAttributes(ee);
445 455
446 GrGLVertToFrag offsets0(kVec2f_GrSLType); 456 GrGLVertToFrag offsets0(kVec2f_GrSLType);
447 args.fPB->addVarying("EllipseOffsets0", &offsets0); 457 args.fPB->addVarying("EllipseOffsets0", &offsets0);
448 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), 458 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(),
449 ee.inEllipseOffsets0()->fName); 459 ee.inEllipseOffsets0()->fName);
450 460
451 GrGLVertToFrag offsets1(kVec2f_GrSLType); 461 GrGLVertToFrag offsets1(kVec2f_GrSLType);
452 args.fPB->addVarying("EllipseOffsets1", &offsets1); 462 args.fPB->addVarying("EllipseOffsets1", &offsets1);
453 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), 463 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(),
454 ee.inEllipseOffsets1()->fName); 464 ee.inEllipseOffsets1()->fName);
455 465
456 // setup pass through color 466 // Setup pass through color
457 if (!ee.colorIgnored()) { 467 this->setupColorPassThrough(pb, local.fInputColorType, args.fOutputC olor, NULL,
458 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 468 &fColorUniform);
459 }
460 469
461 // Setup position 470 // Setup position
462 this->setupPosition(pb, gpArgs, ee.inPosition()->fName, ee.viewMatri x()); 471 this->setupPosition(pb, gpArgs, ee.inPosition()->fName, ee.viewMatri x());
463 472
464 // emit transforms 473 // emit transforms
465 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition() ->fName, 474 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition() ->fName,
466 args.fTransformsIn, args.fTransformsOut); 475 args.fTransformsIn, args.fTransformsOut);
467 476
468 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder( ); 477 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder( );
469 SkAssertResult(fsBuilder->enableFeature( 478 SkAssertResult(fsBuilder->enableFeature(
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);"); 512 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);");
504 } 513 }
505 514
506 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage ); 515 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage );
507 } 516 }
508 517
509 static void GenKey(const GrGeometryProcessor& gp, 518 static void GenKey(const GrGeometryProcessor& gp,
510 const GrBatchTracker& bt, 519 const GrBatchTracker& bt,
511 const GrGLSLCaps&, 520 const GrGLSLCaps&,
512 GrProcessorKeyBuilder* b) { 521 GrProcessorKeyBuilder* b) {
522 const BatchTracker& local = bt.cast<BatchTracker>();
513 const DIEllipseEdgeEffect& ellipseEffect = gp.cast<DIEllipseEdgeEffe ct>(); 523 const DIEllipseEdgeEffect& ellipseEffect = gp.cast<DIEllipseEdgeEffe ct>();
514 uint16_t key = ellipseEffect.getMode(); 524 uint16_t key = ellipseEffect.getMode();
515 key |= ellipseEffect.colorIgnored() << 9; 525 key |= ComputePosKey(ellipseEffect.viewMatrix()) << 9;
516 key |= ComputePosKey(ellipseEffect.viewMatrix()) << 10; 526 b->add32(key << 16 | local.fInputColorType);
517 b->add32(key);
518 } 527 }
519 528
520 virtual void setData(const GrGLProgramDataManager& pdman, 529 virtual void setData(const GrGLProgramDataManager& pdman,
521 const GrPrimitiveProcessor& gp, 530 const GrPrimitiveProcessor& gp,
522 const GrBatchTracker& bt) override { 531 const GrBatchTracker& bt) override {
523 const DIEllipseEdgeEffect& dee = gp.cast<DIEllipseEdgeEffect>(); 532 const DIEllipseEdgeEffect& dee = gp.cast<DIEllipseEdgeEffect>();
524 this->setUniformViewMatrix(pdman, dee.viewMatrix()); 533 this->setUniformViewMatrix(pdman, dee.viewMatrix());
525 534
526 if (dee.color() != fColor) { 535 const BatchTracker& local = bt.cast<BatchTracker>();
536 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != f Color) {
527 GrGLfloat c[4]; 537 GrGLfloat c[4];
528 GrColorToRGBAFloat(dee.color(), c); 538 GrColorToRGBAFloat(local.fColor, c);
529 pdman.set4fv(fColorUniform, 1, c); 539 pdman.set4fv(fColorUniform, 1, c);
530 fColor = dee.color(); 540 fColor = local.fColor;
531 } 541 }
532 } 542 }
533 543
534 private: 544 private:
535 GrColor fColor; 545 GrColor fColor;
536 UniformHandle fColorUniform; 546 UniformHandle fColorUniform;
537 547
538 typedef GrGLGeometryProcessor INHERITED; 548 typedef GrGLGeometryProcessor INHERITED;
539 }; 549 };
540 550
541 virtual void getGLProcessorKey(const GrBatchTracker& bt, 551 virtual void getGLProcessorKey(const GrBatchTracker& bt,
542 const GrGLSLCaps& caps, 552 const GrGLSLCaps& caps,
543 GrProcessorKeyBuilder* b) const override { 553 GrProcessorKeyBuilder* b) const override {
544 GLProcessor::GenKey(*this, bt, caps, b); 554 GLProcessor::GenKey(*this, bt, caps, b);
545 } 555 }
546 556
547 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt, 557 virtual GrGLPrimitiveProcessor* createGLInstance(const GrBatchTracker& bt,
548 const GrGLSLCaps&) const ov erride { 558 const GrGLSLCaps&) const ov erride {
549 return SkNEW_ARGS(GLProcessor, (*this, bt)); 559 return SkNEW_ARGS(GLProcessor, (*this, bt));
550 } 560 }
551 561
562 void initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const override {
563 BatchTracker* local = bt->cast<BatchTracker>();
564 local->fInputColorType = GetColorInputType(&local->fColor, this->color() , init, false);
565 local->fUsesLocalCoords = init.fUsesLocalCoords;
566 }
567
552 private: 568 private:
553 DIEllipseEdgeEffect(GrColor color, const SkMatrix& viewMatrix, Mode mode, 569 DIEllipseEdgeEffect(GrColor color, const SkMatrix& viewMatrix, Mode mode)
554 bool usesLocalCoords)
555 : fColor(color) 570 : fColor(color)
556 , fViewMatrix(viewMatrix) 571 , fViewMatrix(viewMatrix) {
557 , fUsesLocalCoords(usesLocalCoords) {
558 this->initClassID<DIEllipseEdgeEffect>(); 572 this->initClassID<DIEllipseEdgeEffect>();
559 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe rtexAttribType)); 573 fInPosition = &this->addVertexAttrib(Attribute("inPosition", kVec2f_GrVe rtexAttribType));
560 fInEllipseOffsets0 = &this->addVertexAttrib(Attribute("inEllipseOffsets0 ", 574 fInEllipseOffsets0 = &this->addVertexAttrib(Attribute("inEllipseOffsets0 ",
561 kVec2f_GrVertexAtt ribType)); 575 kVec2f_GrVertexA ttribType));
562 fInEllipseOffsets1 = &this->addVertexAttrib(Attribute("inEllipseOffsets1 ", 576 fInEllipseOffsets1 = &this->addVertexAttrib(Attribute("inEllipseOffsets1 ",
563 kVec2f_GrVertexAtt ribType)); 577 kVec2f_GrVertexA ttribType));
564 fMode = mode; 578 fMode = mode;
565 } 579 }
566 580
581 struct BatchTracker {
582 GrGPInput fInputColorType;
583 GrColor fColor;
584 bool fUsesLocalCoords;
585 };
586
567 const Attribute* fInPosition; 587 const Attribute* fInPosition;
568 const Attribute* fInEllipseOffsets0; 588 const Attribute* fInEllipseOffsets0;
569 const Attribute* fInEllipseOffsets1; 589 const Attribute* fInEllipseOffsets1;
570 GrColor fColor; 590 GrColor fColor;
571 SkMatrix fViewMatrix; 591 SkMatrix fViewMatrix;
572 Mode fMode; 592 Mode fMode;
573 bool fUsesLocalCoords;
574 593
575 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 594 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
576 595
577 typedef GrGeometryProcessor INHERITED; 596 typedef GrGeometryProcessor INHERITED;
578 }; 597 };
579 598
580 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DIEllipseEdgeEffect); 599 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(DIEllipseEdgeEffect);
581 600
582 GrGeometryProcessor* DIEllipseEdgeEffect::TestCreate(SkRandom* random, 601 GrGeometryProcessor* DIEllipseEdgeEffect::TestCreate(SkRandom* random,
583 GrContext* context, 602 GrContext* context,
584 const GrDrawTargetCaps&, 603 const GrDrawTargetCaps&,
585 GrTexture* textures[]) { 604 GrTexture* textures[]) {
586 return DIEllipseEdgeEffect::Create(GrRandomColor(random), 605 return DIEllipseEdgeEffect::Create(GrRandomColor(random),
587 GrTest::TestMatrix(random), 606 GrTest::TestMatrix(random),
588 (Mode)(random->nextRangeU(0,2)), 607 (Mode)(random->nextRangeU(0,2)));
589 random->nextBool());
590 } 608 }
591 609
592 /////////////////////////////////////////////////////////////////////////////// 610 ///////////////////////////////////////////////////////////////////////////////
593 611
594 bool GrOvalRenderer::drawOval(GrDrawTarget* target, 612 bool GrOvalRenderer::drawOval(GrDrawTarget* target,
595 GrPipelineBuilder* pipelineBuilder, 613 GrPipelineBuilder* pipelineBuilder,
596 GrColor color, 614 GrColor color,
597 const SkMatrix& viewMatrix, 615 const SkMatrix& viewMatrix,
598 bool useAA, 616 bool useAA,
599 const SkRect& oval, 617 const SkRect& oval,
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 685
668 void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline ) override { 686 void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline ) override {
669 SkMatrix invert; 687 SkMatrix invert;
670 if (!this->viewMatrix().invert(&invert)) { 688 if (!this->viewMatrix().invert(&invert)) {
671 return; 689 return;
672 } 690 }
673 691
674 // Setup geometry processor 692 // Setup geometry processor
675 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo r(), 693 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo r(),
676 this->stro ke(), 694 this->stro ke(),
677 invert, 695 invert));
678 this->uses LocalCoords()));
679 696
680 batchTarget->initDraw(gp, pipeline); 697 batchTarget->initDraw(gp, pipeline);
681 698
699 // TODO this is hacky, but the only way we have to initialize the GP is to use the
700 // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch
701 // everywhere we can remove this nastiness
702 GrPipelineInfo init;
703 init.fColorIgnored = fBatch.fColorIgnored;
704 init.fOverrideColor = GrColor_ILLEGAL;
705 init.fCoverageIgnored = fBatch.fCoverageIgnored;
706 init.fUsesLocalCoords = this->usesLocalCoords();
707 gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
708
682 int instanceCount = fGeoData.count(); 709 int instanceCount = fGeoData.count();
683 size_t vertexStride = gp->getVertexStride(); 710 size_t vertexStride = gp->getVertexStride();
684 SkASSERT(vertexStride == sizeof(CircleVertex)); 711 SkASSERT(vertexStride == sizeof(CircleVertex));
685 QuadHelper helper; 712 QuadHelper helper;
686 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(batchT arget, vertexStride, 713 CircleVertex* verts = reinterpret_cast<CircleVertex*>(helper.init(batchT arget, vertexStride,
687 instan ceCount)); 714 instan ceCount));
688 if (!verts) { 715 if (!verts) {
689 return; 716 return;
690 } 717 }
691 718
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 909
883 void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline ) override { 910 void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline ) override {
884 SkMatrix invert; 911 SkMatrix invert;
885 if (!this->viewMatrix().invert(&invert)) { 912 if (!this->viewMatrix().invert(&invert)) {
886 return; 913 return;
887 } 914 }
888 915
889 // Setup geometry processor 916 // Setup geometry processor
890 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col or(), 917 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col or(),
891 this->str oke(), 918 this->str oke(),
892 invert, 919 invert));
893 this->use sLocalCoords()));
894 920
895 batchTarget->initDraw(gp, pipeline); 921 batchTarget->initDraw(gp, pipeline);
896 922
923 // TODO this is hacky, but the only way we have to initialize the GP is to use the
924 // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch
925 // everywhere we can remove this nastiness
926 GrPipelineInfo init;
927 init.fColorIgnored = fBatch.fColorIgnored;
928 init.fOverrideColor = GrColor_ILLEGAL;
929 init.fCoverageIgnored = fBatch.fCoverageIgnored;
930 init.fUsesLocalCoords = this->usesLocalCoords();
931 gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
932
897 int instanceCount = fGeoData.count(); 933 int instanceCount = fGeoData.count();
898 QuadHelper helper; 934 QuadHelper helper;
899 size_t vertexStride = gp->getVertexStride(); 935 size_t vertexStride = gp->getVertexStride();
900 SkASSERT(vertexStride == sizeof(EllipseVertex)); 936 SkASSERT(vertexStride == sizeof(EllipseVertex));
901 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>( 937 EllipseVertex* verts = reinterpret_cast<EllipseVertex*>(
902 helper.init(batchTarget, vertexStride, instanceCount)); 938 helper.init(batchTarget, vertexStride, instanceCount));
903 if (!verts) { 939 if (!verts) {
904 return; 940 return;
905 } 941 }
906 942
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
1141 fBatch.fColor = fGeoData[0].fColor; 1177 fBatch.fColor = fGeoData[0].fColor;
1142 fBatch.fMode = fGeoData[0].fMode; 1178 fBatch.fMode = fGeoData[0].fMode;
1143 fBatch.fUsesLocalCoords = init.fUsesLocalCoords; 1179 fBatch.fUsesLocalCoords = init.fUsesLocalCoords;
1144 fBatch.fCoverageIgnored = init.fCoverageIgnored; 1180 fBatch.fCoverageIgnored = init.fCoverageIgnored;
1145 } 1181 }
1146 1182
1147 void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline ) override { 1183 void generateGeometry(GrBatchTarget* batchTarget, const GrPipeline* pipeline ) override {
1148 // Setup geometry processor 1184 // Setup geometry processor
1149 SkAutoTUnref<GrGeometryProcessor> gp(DIEllipseEdgeEffect::Create(this->c olor(), 1185 SkAutoTUnref<GrGeometryProcessor> gp(DIEllipseEdgeEffect::Create(this->c olor(),
1150 this->v iewMatrix(), 1186 this->v iewMatrix(),
1151 this->m ode(), 1187 this->m ode()));
1152 this->u sesLocalCoords()));
1153 1188
1154 batchTarget->initDraw(gp, pipeline); 1189 batchTarget->initDraw(gp, pipeline);
1155 1190
1191 // TODO this is hacky, but the only way we have to initialize the GP is to use the
1192 // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch
1193 // everywhere we can remove this nastiness
1194 GrPipelineInfo init;
1195 init.fColorIgnored = fBatch.fColorIgnored;
1196 init.fOverrideColor = GrColor_ILLEGAL;
1197 init.fCoverageIgnored = fBatch.fCoverageIgnored;
1198 init.fUsesLocalCoords = this->usesLocalCoords();
1199 gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
1200
1156 int instanceCount = fGeoData.count(); 1201 int instanceCount = fGeoData.count();
1157 size_t vertexStride = gp->getVertexStride(); 1202 size_t vertexStride = gp->getVertexStride();
1158 SkASSERT(vertexStride == sizeof(DIEllipseVertex)); 1203 SkASSERT(vertexStride == sizeof(DIEllipseVertex));
1159 QuadHelper helper; 1204 QuadHelper helper;
1160 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>( 1205 DIEllipseVertex* verts = reinterpret_cast<DIEllipseVertex*>(
1161 helper.init(batchTarget, vertexStride, instanceCount)); 1206 helper.init(batchTarget, vertexStride, instanceCount));
1162 if (!verts) { 1207 if (!verts) {
1163 return; 1208 return;
1164 } 1209 }
1165 1210
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
1497 // reset to device coordinates 1542 // reset to device coordinates
1498 SkMatrix invert; 1543 SkMatrix invert;
1499 if (!this->viewMatrix().invert(&invert)) { 1544 if (!this->viewMatrix().invert(&invert)) {
1500 SkDebugf("Failed to invert\n"); 1545 SkDebugf("Failed to invert\n");
1501 return; 1546 return;
1502 } 1547 }
1503 1548
1504 // Setup geometry processor 1549 // Setup geometry processor
1505 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo r(), 1550 SkAutoTUnref<GrGeometryProcessor> gp(CircleEdgeEffect::Create(this->colo r(),
1506 this->stro ke(), 1551 this->stro ke(),
1507 invert, 1552 invert));
1508 this->uses LocalCoords()));
1509 1553
1510 batchTarget->initDraw(gp, pipeline); 1554 batchTarget->initDraw(gp, pipeline);
1511 1555
1556 // TODO this is hacky, but the only way we have to initialize the GP is to use the
1557 // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch
1558 // everywhere we can remove this nastiness
1559 GrPipelineInfo init;
1560 init.fColorIgnored = fBatch.fColorIgnored;
1561 init.fOverrideColor = GrColor_ILLEGAL;
1562 init.fCoverageIgnored = fBatch.fCoverageIgnored;
1563 init.fUsesLocalCoords = this->usesLocalCoords();
1564 gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
1565
1512 int instanceCount = fGeoData.count(); 1566 int instanceCount = fGeoData.count();
1513 size_t vertexStride = gp->getVertexStride(); 1567 size_t vertexStride = gp->getVertexStride();
1514 SkASSERT(vertexStride == sizeof(CircleVertex)); 1568 SkASSERT(vertexStride == sizeof(CircleVertex));
1515 1569
1516 // drop out the middle quad if we're stroked 1570 // drop out the middle quad if we're stroked
1517 int indicesPerInstance = this->stroke() ? kIndicesPerStrokeRRect : kIndi cesPerRRect; 1571 int indicesPerInstance = this->stroke() ? kIndicesPerStrokeRRect : kIndi cesPerRRect;
1518 SkAutoTUnref<const GrIndexBuffer> indexBuffer( 1572 SkAutoTUnref<const GrIndexBuffer> indexBuffer(
1519 ref_rrect_index_buffer(this->stroke(), batchTarget->resourceProvider ())); 1573 ref_rrect_index_buffer(this->stroke(), batchTarget->resourceProvider ()));
1520 1574
1521 InstancedHelper helper; 1575 InstancedHelper helper;
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1670 // reset to device coordinates 1724 // reset to device coordinates
1671 SkMatrix invert; 1725 SkMatrix invert;
1672 if (!this->viewMatrix().invert(&invert)) { 1726 if (!this->viewMatrix().invert(&invert)) {
1673 SkDebugf("Failed to invert\n"); 1727 SkDebugf("Failed to invert\n");
1674 return; 1728 return;
1675 } 1729 }
1676 1730
1677 // Setup geometry processor 1731 // Setup geometry processor
1678 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col or(), 1732 SkAutoTUnref<GrGeometryProcessor> gp(EllipseEdgeEffect::Create(this->col or(),
1679 this->str oke(), 1733 this->str oke(),
1680 invert, 1734 invert));
1681 this->use sLocalCoords()));
1682 1735
1683 batchTarget->initDraw(gp, pipeline); 1736 batchTarget->initDraw(gp, pipeline);
1684 1737
1738 // TODO this is hacky, but the only way we have to initialize the GP is to use the
1739 // GrPipelineInfo struct so we can generate the correct shader. Once we have GrBatch
1740 // everywhere we can remove this nastiness
1741 GrPipelineInfo init;
1742 init.fColorIgnored = fBatch.fColorIgnored;
1743 init.fOverrideColor = GrColor_ILLEGAL;
1744 init.fCoverageIgnored = fBatch.fCoverageIgnored;
1745 init.fUsesLocalCoords = this->usesLocalCoords();
1746 gp->initBatchTracker(batchTarget->currentBatchTracker(), init);
1747
1685 int instanceCount = fGeoData.count(); 1748 int instanceCount = fGeoData.count();
1686 size_t vertexStride = gp->getVertexStride(); 1749 size_t vertexStride = gp->getVertexStride();
1687 SkASSERT(vertexStride == sizeof(EllipseVertex)); 1750 SkASSERT(vertexStride == sizeof(EllipseVertex));
1688 1751
1689 // drop out the middle quad if we're stroked 1752 // drop out the middle quad if we're stroked
1690 int indicesPerInstance = this->stroke() ? kIndicesPerStrokeRRect : kIndi cesPerRRect; 1753 int indicesPerInstance = this->stroke() ? kIndicesPerStrokeRRect : kIndi cesPerRRect;
1691 SkAutoTUnref<const GrIndexBuffer> indexBuffer( 1754 SkAutoTUnref<const GrIndexBuffer> indexBuffer(
1692 ref_rrect_index_buffer(this->stroke(), batchTarget->resourceProvider ())); 1755 ref_rrect_index_buffer(this->stroke(), batchTarget->resourceProvider ()));
1693 1756
1694 InstancedHelper helper; 1757 InstancedHelper helper;
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
2018 } 2081 }
2019 2082
2020 BATCH_TEST_DEFINE(RRectBatch) { 2083 BATCH_TEST_DEFINE(RRectBatch) {
2021 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); 2084 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random);
2022 GrColor color = GrRandomColor(random); 2085 GrColor color = GrRandomColor(random);
2023 const SkRRect& rrect = GrTest::TestRRectSimple(random); 2086 const SkRRect& rrect = GrTest::TestRRectSimple(random);
2024 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra ndom)); 2087 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra ndom));
2025 } 2088 }
2026 2089
2027 #endif 2090 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrGeometryProcessor.h ('k') | src/gpu/GrPathProcessor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698