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

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

Issue 1438003003: Move all ShaderBuilder files to GLSL (Closed) Base URL: https://skia.googlesource.com/skia.git@glslProgBuild
Patch Set: nits Created 5 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/GrFragmentProcessor.cpp ('k') | src/gpu/GrPathProcessor.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 "GrBatchFlushState.h" 10 #include "GrBatchFlushState.h"
11 #include "GrBatchTest.h" 11 #include "GrBatchTest.h"
12 #include "GrDrawTarget.h" 12 #include "GrDrawTarget.h"
13 #include "GrGeometryProcessor.h" 13 #include "GrGeometryProcessor.h"
14 #include "GrInvariantOutput.h" 14 #include "GrInvariantOutput.h"
15 #include "GrPipelineBuilder.h" 15 #include "GrPipelineBuilder.h"
16 #include "GrProcessor.h" 16 #include "GrProcessor.h"
17 #include "GrResourceProvider.h" 17 #include "GrResourceProvider.h"
18 #include "GrVertexBuffer.h" 18 #include "GrVertexBuffer.h"
19 #include "SkRRect.h" 19 #include "SkRRect.h"
20 #include "SkStrokeRec.h" 20 #include "SkStrokeRec.h"
21 #include "SkTLazy.h" 21 #include "SkTLazy.h"
22 #include "batches/GrVertexBatch.h" 22 #include "batches/GrVertexBatch.h"
23 #include "effects/GrRRectEffect.h" 23 #include "effects/GrRRectEffect.h"
24 #include "gl/GrGLUtil.h" 24 #include "gl/GrGLUtil.h"
25 #include "gl/GrGLGeometryProcessor.h" 25 #include "gl/GrGLGeometryProcessor.h"
26 #include "gl/builders/GrGLProgramBuilder.h" 26 #include "glsl/GrGLSLFragmentShaderBuilder.h"
27 #include "glsl/GrGLSLProgramBuilder.h"
27 #include "glsl/GrGLSLProgramDataManager.h" 28 #include "glsl/GrGLSLProgramDataManager.h"
29 #include "glsl/GrGLSLVertexShaderBuilder.h"
28 30
29 // TODO(joshualitt) - Break this file up during GrBatch post implementation clea nup 31 // TODO(joshualitt) - Break this file up during GrBatch post implementation clea nup
30 32
31 namespace { 33 namespace {
32 // TODO(joshualitt) add per vertex colors 34 // TODO(joshualitt) add per vertex colors
33 struct CircleVertex { 35 struct CircleVertex {
34 SkPoint fPos; 36 SkPoint fPos;
35 SkPoint fOffset; 37 SkPoint fOffset;
36 SkScalar fOuterRadius; 38 SkScalar fOuterRadius;
37 SkScalar fInnerRadius; 39 SkScalar fInnerRadius;
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 inline bool isStroked() const { return fStroke; } 91 inline bool isStroked() const { return fStroke; }
90 92
91 class GLProcessor : public GrGLGeometryProcessor { 93 class GLProcessor : public GrGLGeometryProcessor {
92 public: 94 public:
93 GLProcessor() 95 GLProcessor()
94 : fColor(GrColor_ILLEGAL) {} 96 : fColor(GrColor_ILLEGAL) {}
95 97
96 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 98 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
97 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); 99 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>();
98 GrGLSLGPBuilder* pb = args.fPB; 100 GrGLSLGPBuilder* pb = args.fPB;
99 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 101 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
100 102
101 // emit attributes 103 // emit attributes
102 vsBuilder->emitAttributes(ce); 104 vsBuilder->emitAttributes(ce);
103 105
104 GrGLSLVertToFrag v(kVec4f_GrSLType); 106 GrGLSLVertToFrag v(kVec4f_GrSLType);
105 args.fPB->addVarying("CircleEdge", &v); 107 args.fPB->addVarying("CircleEdge", &v);
106 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa me); 108 vsBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->fNa me);
107 109
108 // setup pass through color 110 // setup pass through color
109 if (!ce.colorIgnored()) { 111 if (!ce.colorIgnored()) {
110 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 112 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
111 } 113 }
112 114
113 // Setup position 115 // Setup position
114 this->setupPosition(pb, gpArgs, ce.inPosition()->fName); 116 this->setupPosition(pb, gpArgs, ce.inPosition()->fName);
115 117
116 // emit transforms 118 // emit transforms
117 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ce.inPosition() ->fName, 119 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ce.inPosition() ->fName,
118 ce.localMatrix(), args.fTransformsIn, args.fTra nsformsOut); 120 ce.localMatrix(), args.fTransformsIn, args.fTra nsformsOut);
119 121
120 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder( ); 122 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r();
121 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); 123 fsBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn());
122 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0. 0, 1.0);", v.fsIn()); 124 fsBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d), 0. 0, 1.0);", v.fsIn());
123 if (ce.isStroked()) { 125 if (ce.isStroked()) {
124 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s. w), 0.0, 1.0);", 126 fsBuilder->codeAppendf("float innerAlpha = clamp(%s.z * (d - %s. w), 0.0, 1.0);",
125 v.fsIn(), v.fsIn()); 127 v.fsIn(), v.fsIn());
126 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;"); 128 fsBuilder->codeAppend("edgeAlpha *= innerAlpha;");
127 } 129 }
128 130
129 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage ); 131 fsBuilder->codeAppendf("%s = vec4(edgeAlpha);", args.fOutputCoverage );
130 } 132 }
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 inline bool isStroked() const { return fStroke; } 239 inline bool isStroked() const { return fStroke; }
238 240
239 class GLProcessor : public GrGLGeometryProcessor { 241 class GLProcessor : public GrGLGeometryProcessor {
240 public: 242 public:
241 GLProcessor() 243 GLProcessor()
242 : fColor(GrColor_ILLEGAL) {} 244 : fColor(GrColor_ILLEGAL) {}
243 245
244 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ 246 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{
245 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); 247 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>();
246 GrGLSLGPBuilder* pb = args.fPB; 248 GrGLSLGPBuilder* pb = args.fPB;
247 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 249 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
248 250
249 // emit attributes 251 // emit attributes
250 vsBuilder->emitAttributes(ee); 252 vsBuilder->emitAttributes(ee);
251 253
252 GrGLSLVertToFrag ellipseOffsets(kVec2f_GrSLType); 254 GrGLSLVertToFrag ellipseOffsets(kVec2f_GrSLType);
253 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets); 255 args.fPB->addVarying("EllipseOffsets", &ellipseOffsets);
254 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), 256 vsBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(),
255 ee.inEllipseOffset()->fName); 257 ee.inEllipseOffset()->fName);
256 258
257 GrGLSLVertToFrag ellipseRadii(kVec4f_GrSLType); 259 GrGLSLVertToFrag ellipseRadii(kVec4f_GrSLType);
258 args.fPB->addVarying("EllipseRadii", &ellipseRadii); 260 args.fPB->addVarying("EllipseRadii", &ellipseRadii);
259 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), 261 vsBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(),
260 ee.inEllipseRadii()->fName); 262 ee.inEllipseRadii()->fName);
261 263
262 // setup pass through color 264 // setup pass through color
263 if (!ee.colorIgnored()) { 265 if (!ee.colorIgnored()) {
264 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 266 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
265 } 267 }
266 268
267 // Setup position 269 // Setup position
268 this->setupPosition(pb, gpArgs, ee.inPosition()->fName); 270 this->setupPosition(pb, gpArgs, ee.inPosition()->fName);
269 271
270 // emit transforms 272 // emit transforms
271 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition() ->fName, 273 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition() ->fName,
272 ee.localMatrix(), args.fTransformsIn, args.fTra nsformsOut); 274 ee.localMatrix(), args.fTransformsIn, args.fTra nsformsOut);
273 275
274 // for outer curve 276 // for outer curve
275 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder( ); 277 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r();
276 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse ts.fsIn(), 278 fsBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOffse ts.fsIn(),
277 ellipseRadii.fsIn()); 279 ellipseRadii.fsIn());
278 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset) - 1.0;"); 280 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset) - 1.0;");
279 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips eRadii.fsIn()); 281 fsBuilder->codeAppendf("vec2 grad = 2.0*scaledOffset*%s.xy;", ellips eRadii.fsIn());
280 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); 282 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);");
281 283
282 // avoid calling inversesqrt on zero. 284 // avoid calling inversesqrt on zero.
283 fsBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);"); 285 fsBuilder->codeAppend("grad_dot = max(grad_dot, 1.0e-4);");
284 fsBuilder->codeAppend("float invlen = inversesqrt(grad_dot);"); 286 fsBuilder->codeAppend("float invlen = inversesqrt(grad_dot);");
285 fsBuilder->codeAppend("float edgeAlpha = clamp(0.5-test*invlen, 0.0, 1.0);"); 287 fsBuilder->codeAppend("float edgeAlpha = clamp(0.5-test*invlen, 0.0, 1.0);");
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
412 inline Mode getMode() const { return fMode; } 414 inline Mode getMode() const { return fMode; }
413 415
414 class GLProcessor : public GrGLGeometryProcessor { 416 class GLProcessor : public GrGLGeometryProcessor {
415 public: 417 public:
416 GLProcessor() 418 GLProcessor()
417 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {} 419 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {}
418 420
419 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { 421 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override {
420 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>() ; 422 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>() ;
421 GrGLSLGPBuilder* pb = args.fPB; 423 GrGLSLGPBuilder* pb = args.fPB;
422 GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); 424 GrGLSLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder();
423 425
424 // emit attributes 426 // emit attributes
425 vsBuilder->emitAttributes(ee); 427 vsBuilder->emitAttributes(ee);
426 428
427 GrGLSLVertToFrag offsets0(kVec2f_GrSLType); 429 GrGLSLVertToFrag offsets0(kVec2f_GrSLType);
428 args.fPB->addVarying("EllipseOffsets0", &offsets0); 430 args.fPB->addVarying("EllipseOffsets0", &offsets0);
429 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), 431 vsBuilder->codeAppendf("%s = %s;", offsets0.vsOut(),
430 ee.inEllipseOffsets0()->fName); 432 ee.inEllipseOffsets0()->fName);
431 433
432 GrGLSLVertToFrag offsets1(kVec2f_GrSLType); 434 GrGLSLVertToFrag offsets1(kVec2f_GrSLType);
433 args.fPB->addVarying("EllipseOffsets1", &offsets1); 435 args.fPB->addVarying("EllipseOffsets1", &offsets1);
434 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), 436 vsBuilder->codeAppendf("%s = %s;", offsets1.vsOut(),
435 ee.inEllipseOffsets1()->fName); 437 ee.inEllipseOffsets1()->fName);
436 438
437 // setup pass through color 439 // setup pass through color
438 if (!ee.colorIgnored()) { 440 if (!ee.colorIgnored()) {
439 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform); 441 this->setupUniformColor(pb, args.fOutputColor, &fColorUniform);
440 } 442 }
441 443
442 // Setup position 444 // Setup position
443 this->setupPosition(pb, gpArgs, ee.inPosition()->fName, ee.viewMatri x(), 445 this->setupPosition(pb, gpArgs, ee.inPosition()->fName, ee.viewMatri x(),
444 &fViewMatrixUniform); 446 &fViewMatrixUniform);
445 447
446 // emit transforms 448 // emit transforms
447 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition() ->fName, 449 this->emitTransforms(args.fPB, gpArgs->fPositionVar, ee.inPosition() ->fName,
448 args.fTransformsIn, args.fTransformsOut); 450 args.fTransformsIn, args.fTransformsOut);
449 451
450 GrGLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilder( ); 452 GrGLSLFragmentBuilder* fsBuilder = args.fPB->getFragmentShaderBuilde r();
451 SkAssertResult(fsBuilder->enableFeature( 453 SkAssertResult(fsBuilder->enableFeature(
452 GrGLFragmentShaderBuilder::kStandardDerivatives_GLSLFeature) ); 454 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur e));
453 // for outer curve 455 // for outer curve
454 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn() ); 456 fsBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn() );
455 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset) - 1.0;"); 457 fsBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset) - 1.0;");
456 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn()); 458 fsBuilder->codeAppendf("vec2 duvdx = dFdx(%s);", offsets0.fsIn());
457 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn()); 459 fsBuilder->codeAppendf("vec2 duvdy = dFdy(%s);", offsets0.fsIn());
458 fsBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y *duvdx.y," 460 fsBuilder->codeAppendf("vec2 grad = vec2(2.0*%s.x*duvdx.x + 2.0*%s.y *duvdx.y,"
459 " 2.0*%s.x*duvdy.x + 2.0*%s.y *duvdy.y);", 461 " 2.0*%s.x*duvdy.x + 2.0*%s.y *duvdy.y);",
460 offsets0.fsIn(), offsets0.fsIn(), offsets0.fs In(), offsets0.fsIn()); 462 offsets0.fsIn(), offsets0.fsIn(), offsets0.fs In(), offsets0.fsIn());
461 463
462 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);"); 464 fsBuilder->codeAppend("float grad_dot = dot(grad, grad);");
(...skipping 1567 matching lines...) Expand 10 before | Expand all | Expand 10 after
2030 } 2032 }
2031 2033
2032 DRAW_BATCH_TEST_DEFINE(RRectBatch) { 2034 DRAW_BATCH_TEST_DEFINE(RRectBatch) {
2033 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); 2035 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random);
2034 GrColor color = GrRandomColor(random); 2036 GrColor color = GrRandomColor(random);
2035 const SkRRect& rrect = GrTest::TestRRectSimple(random); 2037 const SkRRect& rrect = GrTest::TestRRectSimple(random);
2036 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra ndom)); 2038 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra ndom));
2037 } 2039 }
2038 2040
2039 #endif 2041 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrFragmentProcessor.cpp ('k') | src/gpu/GrPathProcessor.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698