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

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

Powered by Google App Engine
This is Rietveld 408576698