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

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

Issue 666693012: GP Emit Code takes a struct (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 6 years, 1 month 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/GrAARectRenderer.cpp ('k') | src/gpu/effects/GrBezierEffect.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * 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 "gl/builders/GrGLProgramBuilder.h" 10 #include "gl/builders/GrGLProgramBuilder.h"
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 85
86 static const char* Name() { return "CircleEdge"; } 86 static const char* Name() { return "CircleEdge"; }
87 87
88 inline bool isStroked() const { return fStroke; } 88 inline bool isStroked() const { return fStroke; }
89 89
90 class GLProcessor : public GrGLGeometryProcessor { 90 class GLProcessor : public GrGLGeometryProcessor {
91 public: 91 public:
92 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor& ) 92 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor& )
93 : INHERITED (factory) {} 93 : INHERITED (factory) {}
94 94
95 virtual void emitCode(GrGLGPBuilder* builder, 95 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
96 const GrGeometryProcessor& geometryProcessor, 96 const CircleEdgeEffect& circleEffect = args.fGP.cast<CircleEdgeEffec t>();
97 const GrProcessorKey& key,
98 const char* outputColor,
99 const char* inputColor,
100 const TransformedCoordsArray&,
101 const TextureSamplerArray& samplers) SK_OVERRIDE {
102 const CircleEdgeEffect& circleEffect = geometryProcessor.cast<Circle EdgeEffect>();
103 const char *vsName, *fsName; 97 const char *vsName, *fsName;
104 builder->addVarying(kVec4f_GrSLType, "CircleEdge", &vsName, &fsName) ; 98 args.fPB->addVarying(kVec4f_GrSLType, "CircleEdge", &vsName, &fsName );
105 99
106 GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder();; 100 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();;
107 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, circleEffect.inCircle Edge().c_str()); 101 vsBuilder->codeAppendf("\t%s = %s;\n", vsName, circleEffect.inCircle Edge().c_str());
108 102
109 GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder (); 103 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r();
110 fsBuilder->codeAppendf("\tfloat d = length(%s.xy);\n", fsName); 104 fsBuilder->codeAppendf("\tfloat d = length(%s.xy);\n", fsName);
111 fsBuilder->codeAppendf("\tfloat edgeAlpha = clamp(%s.z - d, 0.0, 1.0 );\n", fsName); 105 fsBuilder->codeAppendf("\tfloat edgeAlpha = clamp(%s.z - d, 0.0, 1.0 );\n", fsName);
112 if (circleEffect.isStroked()) { 106 if (circleEffect.isStroked()) {
113 fsBuilder->codeAppendf("\tfloat innerAlpha = clamp(d - %s.w, 0.0 , 1.0);\n", fsName); 107 fsBuilder->codeAppendf("\tfloat innerAlpha = clamp(d - %s.w, 0.0 , 1.0);\n", fsName);
114 fsBuilder->codeAppend("\tedgeAlpha *= innerAlpha;\n"); 108 fsBuilder->codeAppend("\tedgeAlpha *= innerAlpha;\n");
115 } 109 }
116 110
117 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, 111 fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput,
118 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeA lpha")).c_str()); 112 (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("edge Alpha")).c_str());
119 } 113 }
120 114
121 static void GenKey(const GrProcessor& processor, const GrGLCaps&, 115 static void GenKey(const GrProcessor& processor, const GrGLCaps&,
122 GrProcessorKeyBuilder* b) { 116 GrProcessorKeyBuilder* b) {
123 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe ct>(); 117 const CircleEdgeEffect& circleEffect = processor.cast<CircleEdgeEffe ct>();
124 b->add32(circleEffect.isStroked()); 118 b->add32(circleEffect.isStroked());
125 } 119 }
126 120
127 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE {} 121 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE {}
128 122
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 const GrShaderVar& inEllipseOffset() const { return fInEllipseOffset; } 196 const GrShaderVar& inEllipseOffset() const { return fInEllipseOffset; }
203 const GrShaderVar& inEllipseRadii() const { return fInEllipseRadii; } 197 const GrShaderVar& inEllipseRadii() const { return fInEllipseRadii; }
204 198
205 inline bool isStroked() const { return fStroke; } 199 inline bool isStroked() const { return fStroke; }
206 200
207 class GLProcessor : public GrGLGeometryProcessor { 201 class GLProcessor : public GrGLGeometryProcessor {
208 public: 202 public:
209 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor& ) 203 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor& )
210 : INHERITED (factory) {} 204 : INHERITED (factory) {}
211 205
212 virtual void emitCode(GrGLGPBuilder* builder, 206 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
213 const GrGeometryProcessor& geometryProcessor, 207 const EllipseEdgeEffect& ellipseEffect = args.fGP.cast<EllipseEdgeEf fect>();
214 const GrProcessorKey& key,
215 const char* outputColor,
216 const char* inputColor,
217 const TransformedCoordsArray&,
218 const TextureSamplerArray& samplers) SK_OVERRIDE {
219 const EllipseEdgeEffect& ellipseEffect = geometryProcessor.cast<Elli pseEdgeEffect>();
220 208
221 const char *vsOffsetName, *fsOffsetName; 209 const char *vsOffsetName, *fsOffsetName;
222 const char *vsRadiiName, *fsRadiiName; 210 const char *vsRadiiName, *fsRadiiName;
223 211
224 builder->addVarying(kVec2f_GrSLType, "EllipseOffsets", &vsOffsetName , &fsOffsetName); 212 args.fPB->addVarying(kVec2f_GrSLType, "EllipseOffsets", &vsOffsetNam e, &fsOffsetName);
225 213
226 GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); 214 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
227 vsBuilder->codeAppendf("%s = %s;", vsOffsetName, 215 vsBuilder->codeAppendf("%s = %s;", vsOffsetName,
228 ellipseEffect.inEllipseOffset().c_str()); 216 ellipseEffect.inEllipseOffset().c_str());
229 217
230 builder->addVarying(kVec4f_GrSLType, "EllipseRadii", &vsRadiiName, & fsRadiiName); 218 args.fPB->addVarying(kVec4f_GrSLType, "EllipseRadii", &vsRadiiName, &fsRadiiName);
231 vsBuilder->codeAppendf("%s = %s;", vsRadiiName, ellipseEffect.inElli pseRadii().c_str()); 219 vsBuilder->codeAppendf("%s = %s;", vsRadiiName, ellipseEffect.inElli pseRadii().c_str());
232 220
233 // for outer curve 221 // for outer curve
234 GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder (); 222 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r();
235 fsBuilder->codeAppendf("\tvec2 scaledOffset = %s*%s.xy;\n", fsOffset Name, fsRadiiName); 223 fsBuilder->codeAppendf("\tvec2 scaledOffset = %s*%s.xy;\n", fsOffset Name, fsRadiiName);
236 fsBuilder->codeAppend("\tfloat test = dot(scaledOffset, scaledOffset ) - 1.0;\n"); 224 fsBuilder->codeAppend("\tfloat test = dot(scaledOffset, scaledOffset ) - 1.0;\n");
237 fsBuilder->codeAppendf("\tvec2 grad = 2.0*scaledOffset*%s.xy;\n", fs RadiiName); 225 fsBuilder->codeAppendf("\tvec2 grad = 2.0*scaledOffset*%s.xy;\n", fs RadiiName);
238 fsBuilder->codeAppend("\tfloat grad_dot = dot(grad, grad);\n"); 226 fsBuilder->codeAppend("\tfloat grad_dot = dot(grad, grad);\n");
239 // avoid calling inversesqrt on zero. 227 // avoid calling inversesqrt on zero.
240 fsBuilder->codeAppend("\tgrad_dot = max(grad_dot, 1.0e-4);\n"); 228 fsBuilder->codeAppend("\tgrad_dot = max(grad_dot, 1.0e-4);\n");
241 fsBuilder->codeAppend("\tfloat invlen = inversesqrt(grad_dot);\n"); 229 fsBuilder->codeAppend("\tfloat invlen = inversesqrt(grad_dot);\n");
242 fsBuilder->codeAppend("\tfloat edgeAlpha = clamp(0.5-test*invlen, 0. 0, 1.0);\n"); 230 fsBuilder->codeAppend("\tfloat edgeAlpha = clamp(0.5-test*invlen, 0. 0, 1.0);\n");
243 231
244 // for inner curve 232 // for inner curve
245 if (ellipseEffect.isStroked()) { 233 if (ellipseEffect.isStroked()) {
246 fsBuilder->codeAppendf("\tscaledOffset = %s*%s.zw;\n", fsOffsetN ame, fsRadiiName); 234 fsBuilder->codeAppendf("\tscaledOffset = %s*%s.zw;\n", fsOffsetN ame, fsRadiiName);
247 fsBuilder->codeAppend("\ttest = dot(scaledOffset, scaledOffset) - 1.0;\n"); 235 fsBuilder->codeAppend("\ttest = dot(scaledOffset, scaledOffset) - 1.0;\n");
248 fsBuilder->codeAppendf("\tgrad = 2.0*scaledOffset*%s.zw;\n", fsR adiiName); 236 fsBuilder->codeAppendf("\tgrad = 2.0*scaledOffset*%s.zw;\n", fsR adiiName);
249 fsBuilder->codeAppend("\tinvlen = inversesqrt(dot(grad, grad));\ n"); 237 fsBuilder->codeAppend("\tinvlen = inversesqrt(dot(grad, grad));\ n");
250 fsBuilder->codeAppend("\tedgeAlpha *= clamp(0.5+test*invlen, 0.0 , 1.0);\n"); 238 fsBuilder->codeAppend("\tedgeAlpha *= clamp(0.5+test*invlen, 0.0 , 1.0);\n");
251 } 239 }
252 240
253 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, 241 fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput,
254 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeA lpha")).c_str()); 242 (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("edge Alpha")).c_str());
255 } 243 }
256 244
257 static void GenKey(const GrProcessor& processor, const GrGLCaps&, 245 static void GenKey(const GrProcessor& processor, const GrGLCaps&,
258 GrProcessorKeyBuilder* b) { 246 GrProcessorKeyBuilder* b) {
259 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE ffect>(); 247 const EllipseEdgeEffect& ellipseEffect = processor.cast<EllipseEdgeE ffect>();
260 b->add32(ellipseEffect.isStroked()); 248 b->add32(ellipseEffect.isStroked());
261 } 249 }
262 250
263 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE { 251 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE {
264 } 252 }
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 const GrShaderVar& inEllipseOffsets0() const { return fInEllipseOffsets0; } 338 const GrShaderVar& inEllipseOffsets0() const { return fInEllipseOffsets0; }
351 const GrShaderVar& inEllipseOffsets1() const { return fInEllipseOffsets1; } 339 const GrShaderVar& inEllipseOffsets1() const { return fInEllipseOffsets1; }
352 340
353 inline Mode getMode() const { return fMode; } 341 inline Mode getMode() const { return fMode; }
354 342
355 class GLProcessor : public GrGLGeometryProcessor { 343 class GLProcessor : public GrGLGeometryProcessor {
356 public: 344 public:
357 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor& ) 345 GLProcessor(const GrBackendProcessorFactory& factory, const GrProcessor& )
358 : INHERITED (factory) {} 346 : INHERITED (factory) {}
359 347
360 virtual void emitCode(GrGLGPBuilder* builder, 348 virtual void emitCode(const EmitArgs& args) SK_OVERRIDE {
361 const GrGeometryProcessor& geometryProcessor, 349 const DIEllipseEdgeEffect& ellipseEffect = args.fGP.cast<DIEllipseEd geEffect>();
362 const GrProcessorKey& key,
363 const char* outputColor,
364 const char* inputColor,
365 const TransformedCoordsArray&,
366 const TextureSamplerArray& samplers) SK_OVERRIDE {
367 const DIEllipseEdgeEffect& ellipseEffect =
368 geometryProcessor.cast<DIEllipseEdgeEffect>();
369 350
370 const char *vsOffsetName0, *fsOffsetName0; 351 const char *vsOffsetName0, *fsOffsetName0;
371 builder->addVarying(kVec2f_GrSLType, "EllipseOffsets0", 352 args.fPB->addVarying(kVec2f_GrSLType, "EllipseOffsets0",
372 &vsOffsetName0, &fsOffsetName0); 353 &vsOffsetName0, &fsOffsetName0);
373 354
374 GrGLVertexBuilder* vsBuilder = builder->getVertexShaderBuilder(); 355 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
375 vsBuilder->codeAppendf("%s = %s;", vsOffsetName0, 356 vsBuilder->codeAppendf("%s = %s;", vsOffsetName0,
376 ellipseEffect.inEllipseOffsets0().c_str()); 357 ellipseEffect.inEllipseOffsets0().c_str());
377 const char *vsOffsetName1, *fsOffsetName1; 358 const char *vsOffsetName1, *fsOffsetName1;
378 builder->addVarying(kVec2f_GrSLType, "EllipseOffsets1", 359 args.fPB->addVarying(kVec2f_GrSLType, "EllipseOffsets1",
379 &vsOffsetName1, &fsOffsetName1); 360 &vsOffsetName1, &fsOffsetName1);
380 vsBuilder->codeAppendf("\t%s = %s;\n", vsOffsetName1, 361 vsBuilder->codeAppendf("\t%s = %s;\n", vsOffsetName1,
381 ellipseEffect.inEllipseOffsets1().c_str()); 362 ellipseEffect.inEllipseOffsets1().c_str());
382 363
383 GrGLGPFragmentBuilder* fsBuilder = builder->getFragmentShaderBuilder (); 364 GrGLGPFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r();
384 SkAssertResult(fsBuilder->enableFeature( 365 SkAssertResult(fsBuilder->enableFeature(
385 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature) ); 366 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature) );
386 // for outer curve 367 // for outer curve
387 fsBuilder->codeAppendf("\tvec2 scaledOffset = %s.xy;\n", fsOffsetNam e0); 368 fsBuilder->codeAppendf("\tvec2 scaledOffset = %s.xy;\n", fsOffsetNam e0);
388 fsBuilder->codeAppend("\tfloat test = dot(scaledOffset, scaledOffset ) - 1.0;\n"); 369 fsBuilder->codeAppend("\tfloat test = dot(scaledOffset, scaledOffset ) - 1.0;\n");
389 fsBuilder->codeAppendf("\tvec2 duvdx = dFdx(%s);\n", fsOffsetName0); 370 fsBuilder->codeAppendf("\tvec2 duvdx = dFdx(%s);\n", fsOffsetName0);
390 fsBuilder->codeAppendf("\tvec2 duvdy = dFdy(%s);\n", fsOffsetName0); 371 fsBuilder->codeAppendf("\tvec2 duvdy = dFdy(%s);\n", fsOffsetName0);
391 fsBuilder->codeAppendf("\tvec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s .y*duvdx.y,\n" 372 fsBuilder->codeAppendf("\tvec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s .y*duvdx.y,\n"
392 "\t 2.0*%s.x*duvdy.x + 2.0*%s .y*duvdy.y);\n", 373 "\t 2.0*%s.x*duvdy.x + 2.0*%s .y*duvdy.y);\n",
393 fsOffsetName0, fsOffsetName0, fsOffsetName0, fsOffsetName0); 374 fsOffsetName0, fsOffsetName0, fsOffsetName0, fsOffsetName0);
(...skipping 16 matching lines...) Expand all
410 fsBuilder->codeAppend("\ttest = dot(scaledOffset, scaledOffset) - 1.0;\n"); 391 fsBuilder->codeAppend("\ttest = dot(scaledOffset, scaledOffset) - 1.0;\n");
411 fsBuilder->codeAppendf("\tduvdx = dFdx(%s);\n", fsOffsetName1); 392 fsBuilder->codeAppendf("\tduvdx = dFdx(%s);\n", fsOffsetName1);
412 fsBuilder->codeAppendf("\tduvdy = dFdy(%s);\n", fsOffsetName1); 393 fsBuilder->codeAppendf("\tduvdy = dFdy(%s);\n", fsOffsetName1);
413 fsBuilder->codeAppendf("\tgrad = vec2(2.0*%s.x*duvdx.x + 2.0*%s. y*duvdx.y,\n" 394 fsBuilder->codeAppendf("\tgrad = vec2(2.0*%s.x*duvdx.x + 2.0*%s. y*duvdx.y,\n"
414 "\t 2.0*%s.x*duvdy.x + 2.0*%s. y*duvdy.y);\n", 395 "\t 2.0*%s.x*duvdy.x + 2.0*%s. y*duvdy.y);\n",
415 fsOffsetName1, fsOffsetName1, fsOffsetNam e1, fsOffsetName1); 396 fsOffsetName1, fsOffsetName1, fsOffsetNam e1, fsOffsetName1);
416 fsBuilder->codeAppend("\tinvlen = inversesqrt(dot(grad, grad));\ n"); 397 fsBuilder->codeAppend("\tinvlen = inversesqrt(dot(grad, grad));\ n");
417 fsBuilder->codeAppend("\tedgeAlpha *= clamp(0.5+test*invlen, 0.0 , 1.0);\n"); 398 fsBuilder->codeAppend("\tedgeAlpha *= clamp(0.5+test*invlen, 0.0 , 1.0);\n");
418 } 399 }
419 400
420 fsBuilder->codeAppendf("\t%s = %s;\n", outputColor, 401 fsBuilder->codeAppendf("\t%s = %s;\n", args.fOutput,
421 (GrGLSLExpr4(inputColor) * GrGLSLExpr1("edgeA lpha")).c_str()); 402 (GrGLSLExpr4(args.fInput) * GrGLSLExpr1("edge Alpha")).c_str());
422 } 403 }
423 404
424 static void GenKey(const GrProcessor& processor, const GrGLCaps&, 405 static void GenKey(const GrProcessor& processor, const GrGLCaps&,
425 GrProcessorKeyBuilder* b) { 406 GrProcessorKeyBuilder* b) {
426 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE dgeEffect>(); 407 const DIEllipseEdgeEffect& ellipseEffect = processor.cast<DIEllipseE dgeEffect>();
427 408
428 b->add32(ellipseEffect.getMode()); 409 b->add32(ellipseEffect.getMode());
429 } 410 }
430 411
431 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE { 412 virtual void setData(const GrGLProgramDataManager&, const GrProcessor&) SK_OVERRIDE {
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after
1234 1215
1235 // drop out the middle quad if we're stroked 1216 // drop out the middle quad if we're stroked
1236 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 : 1217 int indexCnt = isStrokeOnly ? SK_ARRAY_COUNT(gRRectIndices) - 6 :
1237 SK_ARRAY_COUNT(gRRectIndices); 1218 SK_ARRAY_COUNT(gRRectIndices);
1238 target->setIndexSourceToBuffer(indexBuffer); 1219 target->setIndexSourceToBuffer(indexBuffer);
1239 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou nds); 1220 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, 16, indexCnt, &bou nds);
1240 } 1221 }
1241 1222
1242 return true; 1223 return true;
1243 } 1224 }
OLDNEW
« no previous file with comments | « src/gpu/GrAARectRenderer.cpp ('k') | src/gpu/effects/GrBezierEffect.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698