OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |