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

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

Issue 746423007: Draft change to start pulling uniform color into GP (Closed) Base URL: https://skia.googlesource.com/skia.git@no_factories
Patch Set: cleanup Created 6 years 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 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 "GrProcessor.h" 10 #include "GrProcessor.h"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 71
72 inline bool isStroked() const { return fStroke; } 72 inline bool isStroked() const { return fStroke; }
73 73
74 class GLProcessor : public GrGLGeometryProcessor { 74 class GLProcessor : public GrGLGeometryProcessor {
75 public: 75 public:
76 GLProcessor(const GrGeometryProcessor&, 76 GLProcessor(const GrGeometryProcessor&,
77 const GrBatchTracker&) {} 77 const GrBatchTracker&) {}
78 78
79 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { 79 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
80 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); 80 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>();
81 GrGLGPBuilder* pb = args.fPB;
82 const BatchTracker& local = args.fBT.cast<BatchTracker>();
81 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 83 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
82 84
83 GrGLVertToFrag v(kVec4f_GrSLType); 85 GrGLVertToFrag v(kVec4f_GrSLType);
84 args.fPB->addVarying("CircleEdge", &v); 86 args.fPB->addVarying("CircleEdge", &v);
85 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa me); 87 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa me);
86 88
89 // Setup pass through color
90 this->setupColor(pb, local.fInputColorType, args.fOutputColor, NULL, &fColorUniform);
91
87 // setup coord outputs 92 // setup coord outputs
88 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ce.i nPosition()->fName); 93 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ce.i nPosition()->fName);
89 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ce.inPo sition()->fName); 94 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ce.inPo sition()->fName);
90 95
91 // setup position varying 96 // setup position varying
92 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi on(), 97 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi on(),
93 vsBuilder->uViewM(), ce.inPosition()->fName); 98 vsBuilder->uViewM(), ce.inPosition()->fName);
94 99
95 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r(); 100 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r();
96 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); 101 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn());
97 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z - d, 0.0, 1.0); ", v.fsIn()); 102 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z - d, 0.0, 1.0); ", v.fsIn());
98 if (ce.isStroked()) { 103 if (ce.isStroked()) {
99 fsBuilder->codeAppendf("float innerAlpha = clamp(d - %s.w, 0.0, 1.0);", 104 fsBuilder->codeAppendf("float innerAlpha = clamp(d - %s.w, 0.0, 1.0);",
100 v.fsIn()); 105 v.fsIn());
101 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); 106 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;");
102 } 107 }
103 108
104 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage ); 109 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage );
105 } 110 }
106 111
107 static void GenKey(const GrGeometryProcessor& processor, 112 static void GenKey(const GrGeometryProcessor& processor,
108 const GrBatchTracker&, 113 const GrBatchTracker& bt,
109 const GrGLCaps&, 114 const GrGLCaps&,
110 GrProcessorKeyBuilder* b) { 115 GrProcessorKeyBuilder* b) {
116 const BatchTracker& local = bt.cast<BatchTracker>();
111 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe ct>(); 117 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe ct>();
112 b->add32(circleEffect.isStroked()); 118 b->add32(circleEffect.isStroked() << 16 | local.fInputColorType);
113 } 119 }
114 120
115 virtual void setData(const GrGLProgramDataManager&, 121 virtual void setData(const GrGLProgramDataManager& pdman,
116 const GrGeometryProcessor&, 122 const GrGeometryProcessor& gp,
117 const GrBatchTracker&) SK_OVERRIDE {} 123 const GrBatchTracker& bt) SK_OVERRIDE {
124 const BatchTracker& local = bt.cast<BatchTracker>();
125 this->setUniformColorIfRequired(pdman, local.fInputColorType, local. fColor,
126 fColorUniform);
127 }
118 128
119 private: 129 private:
130 UniformHandle fColorUniform;
120 typedef GrGLGeometryProcessor INHERITED; 131 typedef GrGLGeometryProcessor INHERITED;
121 }; 132 };
122 133
123 virtual void getGLProcessorKey(const GrBatchTracker& bt, 134 virtual void getGLProcessorKey(const GrBatchTracker& bt,
124 const GrGLCaps& caps, 135 const GrGLCaps& caps,
125 GrProcessorKeyBuilder* b) const SK_OVERRIDE { 136 GrProcessorKeyBuilder* b) const SK_OVERRIDE {
126 GLProcessor::GenKey(*this, bt, caps, b); 137 GLProcessor::GenKey(*this, bt, caps, b);
127 } 138 }
128 139
129 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE { 140 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE {
130 return SkNEW_ARGS(GLProcessor, (*this, bt)); 141 return SkNEW_ARGS(GLProcessor, (*this, bt));
131 } 142 }
132 143
144 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR IDE {
145 BatchTracker* local = bt->cast<BatchTracker>();
146
147 // We will ignore this color unless we have uniform color
148 local->fColor = init.fColor;
149 local->fInputColorType = GetColorInputType(init, false);
150 }
151
152 bool onCanBatch(const GrBatchTracker& l, const GrBatchTracker& r) const SK_O VERRIDE {
153 const BatchTracker& left = l.cast<BatchTracker>();
154 const BatchTracker& right = r.cast<BatchTracker>();
155 return CanCombineOutput(left.fInputColorType, left.fColor,
156 right.fInputColorType, right.fColor);
157 }
158
133 private: 159 private:
134 CircleEdgeEffect(GrColor color, bool stroke) : INHERITED(color) { 160 CircleEdgeEffect(GrColor color, bool stroke) : INHERITED(color) {
135 this->initClassID<CircleEdgeEffect>(); 161 this->initClassID<CircleEdgeEffect>();
136 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr VertexAttribType)); 162 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr VertexAttribType));
137 fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge", 163 fInCircleEdge = &this->addVertexAttrib(GrAttribute("inCircleEdge",
138 kVec4f_GrVertexAttrib Type)); 164 kVec4f_GrVertexAttrib Type));
139 fStroke = stroke; 165 fStroke = stroke;
140 } 166 }
141 167
142 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { 168 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE {
143 const CircleEdgeEffect& cee = other.cast<CircleEdgeEffect>(); 169 const CircleEdgeEffect& cee = other.cast<CircleEdgeEffect>();
144 return cee.fStroke == fStroke; 170 return cee.fStroke == fStroke;
145 } 171 }
146 172
147 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE { 173 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE {
148 out->setUnknownSingleComponent(); 174 out->setUnknownSingleComponent();
149 } 175 }
150 176
177 struct BatchTracker {
178 GPInput fInputColorType;
179 GrColor fColor;
180 };
181
151 const GrAttribute* fInPosition; 182 const GrAttribute* fInPosition;
152 const GrAttribute* fInCircleEdge; 183 const GrAttribute* fInCircleEdge;
153 bool fStroke; 184 bool fStroke;
154 185
155 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 186 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
156 187
157 typedef GrGeometryProcessor INHERITED; 188 typedef GrGeometryProcessor INHERITED;
158 }; 189 };
159 190
160 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(CircleEdgeEffect); 191 GR_DEFINE_GEOMETRY_PROCESSOR_TEST(CircleEdgeEffect);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 223
193 inline bool isStroked() const { return fStroke; } 224 inline bool isStroked() const { return fStroke; }
194 225
195 class GLProcessor : public GrGLGeometryProcessor { 226 class GLProcessor : public GrGLGeometryProcessor {
196 public: 227 public:
197 GLProcessor(const GrGeometryProcessor&, 228 GLProcessor(const GrGeometryProcessor&,
198 const GrBatchTracker&) {} 229 const GrBatchTracker&) {}
199 230
200 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { 231 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
201 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); 232 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>();
202 233 GrGLGPBuilder* pb = args.fPB;
234 const BatchTracker& local = args.fBT.cast<BatchTracker>();
203 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 235 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
204 236
205 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType); 237 GrGLVertToFrag ellipseOffsets(kVec2f_GrSLType);
206 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); 238 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets);
207 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), 239 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(),
208 ee.inEllipseOffset()->fName); 240 ee.inEllipseOffset()->fName);
209 241
210 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType); 242 GrGLVertToFrag ellipseRadii(kVec4f_GrSLType);
211 args.fPB->addVarying("EllipseRadii", &ellipseRadii); 243 args.fPB->addVarying("EllipseRadii", &ellipseRadii);
212 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), 244 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(),
213 ee.inEllipseRadii()->fName); 245 ee.inEllipseRadii()->fName);
214 246
247 // Setup pass through color
248 this->setupColor(pb, local.fInputColorType, args.fOutputColor, NULL, &fColorUniform);
249
215 // setup coord outputs 250 // setup coord outputs
216 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i nPosition()->fName); 251 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i nPosition()->fName);
217 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo sition()->fName); 252 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo sition()->fName);
218 253
219 // setup position varying 254 // setup position varying
220 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi on(), 255 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi on(),
221 vsBuilder->uViewM(), ee.inPosition()->fName); 256 vsBuilder->uViewM(), ee.inPosition()->fName);
222 257
223 // for outer curve 258 // for outer curve
224 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r(); 259 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r();
(...skipping 16 matching lines...) Expand all
241 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;", 276 fsBuilder->codeAppendf("grad = 2.0*scaledOffset*%s.zw;",
242 ellipseRadii.fsIn()); 277 ellipseRadii.fsIn());
243 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); 278 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));");
244 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);"); 279 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);");
245 } 280 }
246 281
247 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage ); 282 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage );
248 } 283 }
249 284
250 static void GenKey(const GrGeometryProcessor& processor, 285 static void GenKey(const GrGeometryProcessor& processor,
251 const GrBatchTracker&, 286 const GrBatchTracker& bt,
252 const GrGLCaps&, 287 const GrGLCaps&,
253 GrProcessorKeyBuilder* b) { 288 GrProcessorKeyBuilder* b) {
289 const BatchTracker& local = bt.cast<BatchTracker>();
254 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE ffect>(); 290 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE ffect>();
255 b->add32(ellipseEffect.isStroked()); 291 b->add32(ellipseEffect.isStroked() << 16 | local.fInputColorType);
256 } 292 }
257 293
258 virtual void setData(const GrGLProgramDataManager&, 294 virtual void setData(const GrGLProgramDataManager& pdman,
259 const GrGeometryProcessor&, 295 const GrGeometryProcessor& gp,
260 const GrBatchTracker&) SK_OVERRIDE { 296 const GrBatchTracker& bt) SK_OVERRIDE {
297 const BatchTracker& local = bt.cast<BatchTracker>();
298 this->setUniformColorIfRequired(pdman, local.fInputColorType, local. fColor,
299 fColorUniform);
261 } 300 }
262 301
263 private: 302 private:
303 UniformHandle fColorUniform;
304
264 typedef GrGLGeometryProcessor INHERITED; 305 typedef GrGLGeometryProcessor INHERITED;
265 }; 306 };
266 307
267 virtual void getGLProcessorKey(const GrBatchTracker& bt, 308 virtual void getGLProcessorKey(const GrBatchTracker& bt,
268 const GrGLCaps& caps, 309 const GrGLCaps& caps,
269 GrProcessorKeyBuilder* b) const SK_OVERRIDE { 310 GrProcessorKeyBuilder* b) const SK_OVERRIDE {
270 GLProcessor::GenKey(*this, bt, caps, b); 311 GLProcessor::GenKey(*this, bt, caps, b);
271 } 312 }
272 313
273 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE { 314 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE {
274 return SkNEW_ARGS(GLProcessor, (*this, bt)); 315 return SkNEW_ARGS(GLProcessor, (*this, bt));
275 } 316 }
276 317
318 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR IDE {
319 BatchTracker* local = bt->cast<BatchTracker>();
320
321 // We will ignore this color unless we have uniform color
322 local->fColor = init.fColor;
323 local->fInputColorType = GetColorInputType(init, false);
324 }
325
326 bool onCanBatch(const GrBatchTracker& l, const GrBatchTracker& r) const SK_O VERRIDE {
327 const BatchTracker& left = l.cast<BatchTracker>();
328 const BatchTracker& right = r.cast<BatchTracker>();
329 return CanCombineOutput(left.fInputColorType, left.fColor,
330 right.fInputColorType, right.fColor);
331 }
332
277 private: 333 private:
278 EllipseEdgeEffect(GrColor color, bool stroke) : INHERITED(color) { 334 EllipseEdgeEffect(GrColor color, bool stroke) : INHERITED(color) {
279 this->initClassID<EllipseEdgeEffect>(); 335 this->initClassID<EllipseEdgeEffect>();
280 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr VertexAttribType)); 336 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr VertexAttribType));
281 fInEllipseOffset = &this->addVertexAttrib(GrAttribute("inEllipseOffset", 337 fInEllipseOffset = &this->addVertexAttrib(GrAttribute("inEllipseOffset",
282 kVec2f_GrVertexAtt ribType)); 338 kVec2f_GrVertexAtt ribType));
283 fInEllipseRadii = &this->addVertexAttrib(GrAttribute("inEllipseRadii", 339 fInEllipseRadii = &this->addVertexAttrib(GrAttribute("inEllipseRadii",
284 kVec4f_GrVertexAttr ibType)); 340 kVec4f_GrVertexAttr ibType));
285 fStroke = stroke; 341 fStroke = stroke;
286 } 342 }
287 343
288 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { 344 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE {
289 const EllipseEdgeEffect& eee = other.cast<EllipseEdgeEffect>(); 345 const EllipseEdgeEffect& eee = other.cast<EllipseEdgeEffect>();
290 return eee.fStroke == fStroke; 346 return eee.fStroke == fStroke;
291 } 347 }
292 348
293 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE { 349 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE {
294 out->setUnknownSingleComponent(); 350 out->setUnknownSingleComponent();
295 } 351 }
296 352
353 struct BatchTracker {
354 GPInput fInputColorType;
355 GrColor fColor;
356 };
357
297 const GrAttribute* fInPosition; 358 const GrAttribute* fInPosition;
298 const GrAttribute* fInEllipseOffset; 359 const GrAttribute* fInEllipseOffset;
299 const GrAttribute* fInEllipseRadii; 360 const GrAttribute* fInEllipseRadii;
300 bool fStroke; 361 bool fStroke;
301 362
302 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 363 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
303 364
304 typedef GrGeometryProcessor INHERITED; 365 typedef GrGeometryProcessor INHERITED;
305 }; 366 };
306 367
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
342 403
343 inline Mode getMode() const { return fMode; } 404 inline Mode getMode() const { return fMode; }
344 405
345 class GLProcessor : public GrGLGeometryProcessor { 406 class GLProcessor : public GrGLGeometryProcessor {
346 public: 407 public:
347 GLProcessor(const GrGeometryProcessor&, 408 GLProcessor(const GrGeometryProcessor&,
348 const GrBatchTracker&) {} 409 const GrBatchTracker&) {}
349 410
350 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE { 411 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
351 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>() ; 412 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>() ;
352 413 GrGLGPBuilder* pb = args.fPB;
414 const BatchTracker& local = args.fBT.cast<BatchTracker>();
353 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 415 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
354 416
355 GrGLVertToFrag offsets0(kVec2f_GrSLType); 417 GrGLVertToFrag offsets0(kVec2f_GrSLType);
356 args.fPB->addVarying("EllipseOffsets0", &offsets0); 418 args.fPB->addVarying("EllipseOffsets0", &offsets0);
357 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), 419 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(),
358 ee.inEllipseOffsets0()->fName); 420 ee.inEllipseOffsets0()->fName);
359 421
360 GrGLVertToFrag offsets1(kVec2f_GrSLType); 422 GrGLVertToFrag offsets1(kVec2f_GrSLType);
361 args.fPB->addVarying("EllipseOffsets1", &offsets1); 423 args.fPB->addVarying("EllipseOffsets1", &offsets1);
362 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), 424 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(),
363 ee.inEllipseOffsets1()->fName); 425 ee.inEllipseOffsets1()->fName);
364 426
427 // Setup pass through color
428 this->setupColor(pb, local.fInputColorType, args.fOutputColor, NULL, &fColorUniform);
429
365 // setup coord outputs 430 // setup coord outputs
366 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i nPosition()->fName); 431 vsBuilder->codeAppendf("%s = %s;", vsBuilder->positionCoords(), ee.i nPosition()->fName);
367 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo sition()->fName); 432 vsBuilder->codeAppendf("%s = %s;", vsBuilder->localCoords(), ee.inPo sition()->fName);
368 433
369 // setup position varying 434 // setup position varying
370 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi on(), 435 vsBuilder->codeAppendf("%s = %s * vec3(%s, 1);", vsBuilder->glPositi on(),
371 vsBuilder->uViewM(), ee.inPosition()->fName); 436 vsBuilder->uViewM(), ee.inPosition()->fName);
372 437
373 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r(); 438 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r();
374 SkAssertResult(fsBuilder->enableFeature( 439 SkAssertResult(fsBuilder->enableFeature(
(...skipping 30 matching lines...) Expand all
405 offsets1.fsIn(), offsets1.fsIn(), offsets 1.fsIn(), 470 offsets1.fsIn(), offsets1.fsIn(), offsets 1.fsIn(),
406 offsets1.fsIn()); 471 offsets1.fsIn());
407 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));"); 472 fsBuilder->codeAppend("invlen = inversesqrt(dot(grad, grad));");
408 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);"); 473 fsBuilder->codeAppend("edgeAlpha *= clamp(0.5+test*invlen, 0.0, 1.0);");
409 } 474 }
410 475
411 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage ); 476 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage );
412 } 477 }
413 478
414 static void GenKey(const GrGeometryProcessor& processor, 479 static void GenKey(const GrGeometryProcessor& processor,
415 const GrBatchTracker&, 480 const GrBatchTracker& bt,
416 const GrGLCaps&, 481 const GrGLCaps&,
417 GrProcessorKeyBuilder* b) { 482 GrProcessorKeyBuilder* b) {
483 const BatchTracker& local = bt.cast<BatchTracker>();
418 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE dgeEffect>(); 484 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE dgeEffect>();
419 485 b->add32(ellipseEffect.getMode() << 16 | local.fInputColorType);
420 b->add32(ellipseEffect.getMode());
421 } 486 }
422 487
423 virtual void setData(const GrGLProgramDataManager&, 488 virtual void setData(const GrGLProgramDataManager& pdman,
424 const GrGeometryProcessor&, 489 const GrGeometryProcessor& gp,
425 const GrBatchTracker&) SK_OVERRIDE { 490 const GrBatchTracker& bt) SK_OVERRIDE {
491 const BatchTracker& local = bt.cast<BatchTracker>();
492 this->setUniformColorIfRequired(pdman, local.fInputColorType, local. fColor,
493 fColorUniform);
426 } 494 }
427 495
428 private: 496 private:
497 UniformHandle fColorUniform;
498
429 typedef GrGLGeometryProcessor INHERITED; 499 typedef GrGLGeometryProcessor INHERITED;
430 }; 500 };
431 501
432 virtual void getGLProcessorKey(const GrBatchTracker& bt, 502 virtual void getGLProcessorKey(const GrBatchTracker& bt,
433 const GrGLCaps& caps, 503 const GrGLCaps& caps,
434 GrProcessorKeyBuilder* b) const SK_OVERRIDE { 504 GrProcessorKeyBuilder* b) const SK_OVERRIDE {
435 GLProcessor::GenKey(*this, bt, caps, b); 505 GLProcessor::GenKey(*this, bt, caps, b);
436 } 506 }
437 507
438 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE { 508 virtual GrGLGeometryProcessor* createGLInstance(const GrBatchTracker& bt) co nst SK_OVERRIDE {
439 return SkNEW_ARGS(GLProcessor, (*this, bt)); 509 return SkNEW_ARGS(GLProcessor, (*this, bt));
440 } 510 }
441 511
512 void initBatchTracker(GrBatchTracker* bt, const InitBT& init) const SK_OVERR IDE {
513 BatchTracker* local = bt->cast<BatchTracker>();
514
515 // We will ignore this color unless we have uniform color
516 local->fColor = init.fColor;
517 local->fInputColorType = GetColorInputType(init, false);
518 }
519
520 bool onCanBatch(const GrBatchTracker& l, const GrBatchTracker& r) const SK_O VERRIDE {
521 const BatchTracker& left = l.cast<BatchTracker>();
522 const BatchTracker& right = r.cast<BatchTracker>();
523 return CanCombineOutput(left.fInputColorType, left.fColor,
524 right.fInputColorType, right.fColor);
525 }
526
442 private: 527 private:
443 DIEllipseEdgeEffect(GrColor color, Mode mode) : INHERITED(color) { 528 DIEllipseEdgeEffect(GrColor color, Mode mode) : INHERITED(color) {
444 this->initClassID<DIEllipseEdgeEffect>(); 529 this->initClassID<DIEllipseEdgeEffect>();
445 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr VertexAttribType)); 530 fInPosition = &this->addVertexAttrib(GrAttribute("inPosition", kVec2f_Gr VertexAttribType));
446 fInEllipseOffsets0 = &this->addVertexAttrib(GrAttribute("inEllipseOffset s0", 531 fInEllipseOffsets0 = &this->addVertexAttrib(GrAttribute("inEllipseOffset s0",
447 kVec2f_GrVertexA ttribType)); 532 kVec2f_GrVertexA ttribType));
448 fInEllipseOffsets1 = &this->addVertexAttrib(GrAttribute("inEllipseOffset s1", 533 fInEllipseOffsets1 = &this->addVertexAttrib(GrAttribute("inEllipseOffset s1",
449 kVec2f_GrVertexA ttribType)); 534 kVec2f_GrVertexA ttribType));
450 fMode = mode; 535 fMode = mode;
451 } 536 }
452 537
453 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE { 538 virtual bool onIsEqual(const GrGeometryProcessor& other) const SK_OVERRIDE {
454 const DIEllipseEdgeEffect& eee = other.cast<DIEllipseEdgeEffect>(); 539 const DIEllipseEdgeEffect& eee = other.cast<DIEllipseEdgeEffect>();
455 return eee.fMode == fMode; 540 return eee.fMode == fMode;
456 } 541 }
457 542
458 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE { 543 virtual void onGetInvariantOutputCoverage(GrInitInvariantOutput* out) const SK_OVERRIDE {
459 out->setUnknownSingleComponent(); 544 out->setUnknownSingleComponent();
460 } 545 }
461 546
547 struct BatchTracker {
548 GPInput fInputColorType;
549 GrColor fColor;
550 };
551
462 const GrAttribute* fInPosition; 552 const GrAttribute* fInPosition;
463 const GrAttribute* fInEllipseOffsets0; 553 const GrAttribute* fInEllipseOffsets0;
464 const GrAttribute* fInEllipseOffsets1; 554 const GrAttribute* fInEllipseOffsets1;
465 Mode fMode; 555 Mode fMode;
466 556
467 GR_DECLARE_GEOMETRY_PROCESSOR_TEST; 557 GR_DECLARE_GEOMETRY_PROCESSOR_TEST;
468 558
469 typedef GrGeometryProcessor INHERITED; 559 typedef GrGeometryProcessor INHERITED;
470 }; 560 };
471 561
(...skipping 768 matching lines...) Expand 10 before | Expand all | Expand 10 after
1240 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : 1330 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
1241 SK_ARRAY_COUNT(gRRectIndices); 1331 SK_ARRAY_COUNT(gRRectIndices);
1242 target->setIndexSourceToBuffer(indexBuffer); 1332 target->setIndexSourceToBuffer(indexBuffer);
1243 target->drawIndexedInstances(drawState, effect, kTriangles_GrPrimitiveTy pe, 1, 16, indexCnt, 1333 target->drawIndexedInstances(drawState, effect, kTriangles_GrPrimitiveTy pe, 1, 16, indexCnt,
1244 &bounds); 1334 &bounds);
1245 } 1335 }
1246 1336
1247 target->resetIndexSource(); 1337 target->resetIndexSource();
1248 return true; 1338 return true;
1249 } 1339 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698