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

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

Powered by Google App Engine
This is Rietveld 408576698