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 "glsl/GrGLSLFragmentShaderBuilder.h" | 24 #include "glsl/GrGLSLFragmentShaderBuilder.h" |
25 #include "glsl/GrGLSLGeometryProcessor.h" | 25 #include "glsl/GrGLSLGeometryProcessor.h" |
26 #include "glsl/GrGLSLProgramBuilder.h" | |
27 #include "glsl/GrGLSLProgramDataManager.h" | 26 #include "glsl/GrGLSLProgramDataManager.h" |
28 #include "glsl/GrGLSLVarying.h" | 27 #include "glsl/GrGLSLVarying.h" |
29 #include "glsl/GrGLSLVertexShaderBuilder.h" | 28 #include "glsl/GrGLSLVertexShaderBuilder.h" |
| 29 #include "glsl/GrGLSLUniformHandler.h" |
30 #include "glsl/GrGLSLUtil.h" | 30 #include "glsl/GrGLSLUtil.h" |
31 | 31 |
32 // TODO(joshualitt) - Break this file up during GrBatch post implementation clea
nup | 32 // TODO(joshualitt) - Break this file up during GrBatch post implementation clea
nup |
33 | 33 |
34 namespace { | 34 namespace { |
35 // TODO(joshualitt) add per vertex colors | 35 // TODO(joshualitt) add per vertex colors |
36 struct CircleVertex { | 36 struct CircleVertex { |
37 SkPoint fPos; | 37 SkPoint fPos; |
38 SkPoint fOffset; | 38 SkPoint fOffset; |
39 SkScalar fOuterRadius; | 39 SkScalar fOuterRadius; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 | 91 |
92 inline bool isStroked() const { return fStroke; } | 92 inline bool isStroked() const { return fStroke; } |
93 | 93 |
94 class GLSLProcessor : public GrGLSLGeometryProcessor { | 94 class GLSLProcessor : public GrGLSLGeometryProcessor { |
95 public: | 95 public: |
96 GLSLProcessor() | 96 GLSLProcessor() |
97 : fColor(GrColor_ILLEGAL) {} | 97 : fColor(GrColor_ILLEGAL) {} |
98 | 98 |
99 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 99 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
100 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); | 100 const CircleEdgeEffect& ce = args.fGP.cast<CircleEdgeEffect>(); |
101 GrGLSLGPBuilder* pb = args.fPB; | |
102 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 101 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
103 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 102 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 103 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
104 | 104 |
105 // emit attributes | 105 // emit attributes |
106 varyingHandler->emitAttributes(ce); | 106 varyingHandler->emitAttributes(ce); |
107 | 107 |
108 GrGLSLVertToFrag v(kVec4f_GrSLType); | 108 GrGLSLVertToFrag v(kVec4f_GrSLType); |
109 varyingHandler->addVarying("CircleEdge", &v); | 109 varyingHandler->addVarying("CircleEdge", &v); |
110 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->f
Name); | 110 vertBuilder->codeAppendf("%s = %s;", v.vsOut(), ce.inCircleEdge()->f
Name); |
111 | 111 |
112 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 112 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
113 // setup pass through color | 113 // setup pass through color |
114 if (!ce.colorIgnored()) { | 114 if (!ce.colorIgnored()) { |
115 this->setupUniformColor(pb, fragBuilder, args.fOutputColor, &fCo
lorUniform); | 115 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutpu
tColor, |
| 116 &fColorUniform); |
116 } | 117 } |
117 | 118 |
118 // Setup position | 119 // Setup position |
119 this->setupPosition(pb, vertBuilder, gpArgs, ce.inPosition()->fName)
; | 120 this->setupPosition(vertBuilder, gpArgs, ce.inPosition()->fName); |
120 | 121 |
121 // emit transforms | 122 // emit transforms |
122 this->emitTransforms(args.fPB, | 123 this->emitTransforms(vertBuilder, |
123 vertBuilder, | |
124 varyingHandler, | 124 varyingHandler, |
| 125 uniformHandler, |
125 gpArgs->fPositionVar, | 126 gpArgs->fPositionVar, |
126 ce.inPosition()->fName, | 127 ce.inPosition()->fName, |
127 ce.localMatrix(), | 128 ce.localMatrix(), |
128 args.fTransformsIn, | 129 args.fTransformsIn, |
129 args.fTransformsOut); | 130 args.fTransformsOut); |
130 | 131 |
131 fragBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); | 132 fragBuilder->codeAppendf("float d = length(%s.xy);", v.fsIn()); |
132 fragBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d),
0.0, 1.0);", | 133 fragBuilder->codeAppendf("float edgeAlpha = clamp(%s.z * (1.0 - d),
0.0, 1.0);", |
133 v.fsIn()); | 134 v.fsIn()); |
134 if (ce.isStroked()) { | 135 if (ce.isStroked()) { |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 | 248 |
248 inline bool isStroked() const { return fStroke; } | 249 inline bool isStroked() const { return fStroke; } |
249 | 250 |
250 class GLSLProcessor : public GrGLSLGeometryProcessor { | 251 class GLSLProcessor : public GrGLSLGeometryProcessor { |
251 public: | 252 public: |
252 GLSLProcessor() | 253 GLSLProcessor() |
253 : fColor(GrColor_ILLEGAL) {} | 254 : fColor(GrColor_ILLEGAL) {} |
254 | 255 |
255 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ | 256 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override{ |
256 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); | 257 const EllipseEdgeEffect& ee = args.fGP.cast<EllipseEdgeEffect>(); |
257 GrGLSLGPBuilder* pb = args.fPB; | |
258 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 258 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
259 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 259 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 260 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
260 | 261 |
261 // emit attributes | 262 // emit attributes |
262 varyingHandler->emitAttributes(ee); | 263 varyingHandler->emitAttributes(ee); |
263 | 264 |
264 GrGLSLVertToFrag ellipseOffsets(kVec2f_GrSLType); | 265 GrGLSLVertToFrag ellipseOffsets(kVec2f_GrSLType); |
265 varyingHandler->addVarying("EllipseOffsets", &ellipseOffsets); | 266 varyingHandler->addVarying("EllipseOffsets", &ellipseOffsets); |
266 vertBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), | 267 vertBuilder->codeAppendf("%s = %s;", ellipseOffsets.vsOut(), |
267 ee.inEllipseOffset()->fName); | 268 ee.inEllipseOffset()->fName); |
268 | 269 |
269 GrGLSLVertToFrag ellipseRadii(kVec4f_GrSLType); | 270 GrGLSLVertToFrag ellipseRadii(kVec4f_GrSLType); |
270 varyingHandler->addVarying("EllipseRadii", &ellipseRadii); | 271 varyingHandler->addVarying("EllipseRadii", &ellipseRadii); |
271 vertBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), | 272 vertBuilder->codeAppendf("%s = %s;", ellipseRadii.vsOut(), |
272 ee.inEllipseRadii()->fName); | 273 ee.inEllipseRadii()->fName); |
273 | 274 |
274 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 275 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
275 // setup pass through color | 276 // setup pass through color |
276 if (!ee.colorIgnored()) { | 277 if (!ee.colorIgnored()) { |
277 this->setupUniformColor(pb, fragBuilder, args.fOutputColor, &fCo
lorUniform); | 278 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutpu
tColor, |
| 279 &fColorUniform); |
278 } | 280 } |
279 | 281 |
280 // Setup position | 282 // Setup position |
281 this->setupPosition(pb, vertBuilder, gpArgs, ee.inPosition()->fName)
; | 283 this->setupPosition(vertBuilder, gpArgs, ee.inPosition()->fName); |
282 | 284 |
283 // emit transforms | 285 // emit transforms |
284 this->emitTransforms(args.fPB, | 286 this->emitTransforms(vertBuilder, |
285 vertBuilder, | |
286 varyingHandler, | 287 varyingHandler, |
| 288 uniformHandler, |
287 gpArgs->fPositionVar, | 289 gpArgs->fPositionVar, |
288 ee.inPosition()->fName, | 290 ee.inPosition()->fName, |
289 ee.localMatrix(), | 291 ee.localMatrix(), |
290 args.fTransformsIn, | 292 args.fTransformsIn, |
291 args.fTransformsOut); | 293 args.fTransformsOut); |
292 | 294 |
293 // for outer curve | 295 // for outer curve |
294 fragBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOff
sets.fsIn(), | 296 fragBuilder->codeAppendf("vec2 scaledOffset = %s*%s.xy;", ellipseOff
sets.fsIn(), |
295 ellipseRadii.fsIn()); | 297 ellipseRadii.fsIn()); |
296 fragBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset
) - 1.0;"); | 298 fragBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset
) - 1.0;"); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
429 | 431 |
430 inline Mode getMode() const { return fMode; } | 432 inline Mode getMode() const { return fMode; } |
431 | 433 |
432 class GLSLProcessor : public GrGLSLGeometryProcessor { | 434 class GLSLProcessor : public GrGLSLGeometryProcessor { |
433 public: | 435 public: |
434 GLSLProcessor() | 436 GLSLProcessor() |
435 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {} | 437 : fViewMatrix(SkMatrix::InvalidMatrix()), fColor(GrColor_ILLEGAL) {} |
436 | 438 |
437 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { | 439 void onEmitCode(EmitArgs& args, GrGPArgs* gpArgs) override { |
438 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; | 440 const DIEllipseEdgeEffect& ee = args.fGP.cast<DIEllipseEdgeEffect>()
; |
439 GrGLSLGPBuilder* pb = args.fPB; | |
440 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; | 441 GrGLSLVertexBuilder* vertBuilder = args.fVertBuilder; |
441 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; | 442 GrGLSLVaryingHandler* varyingHandler = args.fVaryingHandler; |
| 443 GrGLSLUniformHandler* uniformHandler = args.fUniformHandler; |
442 | 444 |
443 // emit attributes | 445 // emit attributes |
444 varyingHandler->emitAttributes(ee); | 446 varyingHandler->emitAttributes(ee); |
445 | 447 |
446 GrGLSLVertToFrag offsets0(kVec2f_GrSLType); | 448 GrGLSLVertToFrag offsets0(kVec2f_GrSLType); |
447 varyingHandler->addVarying("EllipseOffsets0", &offsets0); | 449 varyingHandler->addVarying("EllipseOffsets0", &offsets0); |
448 vertBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), | 450 vertBuilder->codeAppendf("%s = %s;", offsets0.vsOut(), |
449 ee.inEllipseOffsets0()->fName); | 451 ee.inEllipseOffsets0()->fName); |
450 | 452 |
451 GrGLSLVertToFrag offsets1(kVec2f_GrSLType); | 453 GrGLSLVertToFrag offsets1(kVec2f_GrSLType); |
452 varyingHandler->addVarying("EllipseOffsets1", &offsets1); | 454 varyingHandler->addVarying("EllipseOffsets1", &offsets1); |
453 vertBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), | 455 vertBuilder->codeAppendf("%s = %s;", offsets1.vsOut(), |
454 ee.inEllipseOffsets1()->fName); | 456 ee.inEllipseOffsets1()->fName); |
455 | 457 |
456 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; | 458 GrGLSLFragmentBuilder* fragBuilder = args.fFragBuilder; |
457 // setup pass through color | 459 // setup pass through color |
458 if (!ee.colorIgnored()) { | 460 if (!ee.colorIgnored()) { |
459 this->setupUniformColor(pb, fragBuilder, args.fOutputColor, &fCo
lorUniform); | 461 this->setupUniformColor(fragBuilder, uniformHandler, args.fOutpu
tColor, |
| 462 &fColorUniform); |
460 } | 463 } |
461 | 464 |
462 // Setup position | 465 // Setup position |
463 this->setupPosition(pb, | 466 this->setupPosition(vertBuilder, |
464 vertBuilder, | 467 uniformHandler, |
465 gpArgs, | 468 gpArgs, |
466 ee.inPosition()->fName, | 469 ee.inPosition()->fName, |
467 ee.viewMatrix(), | 470 ee.viewMatrix(), |
468 &fViewMatrixUniform); | 471 &fViewMatrixUniform); |
469 | 472 |
470 // emit transforms | 473 // emit transforms |
471 this->emitTransforms(args.fPB, | 474 this->emitTransforms(vertBuilder, |
472 vertBuilder, | |
473 varyingHandler, | 475 varyingHandler, |
| 476 uniformHandler, |
474 gpArgs->fPositionVar, | 477 gpArgs->fPositionVar, |
475 ee.inPosition()->fName, | 478 ee.inPosition()->fName, |
476 args.fTransformsIn, | 479 args.fTransformsIn, |
477 args.fTransformsOut); | 480 args.fTransformsOut); |
478 | 481 |
479 SkAssertResult(fragBuilder->enableFeature( | 482 SkAssertResult(fragBuilder->enableFeature( |
480 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); | 483 GrGLSLFragmentShaderBuilder::kStandardDerivatives_GLSLFeatur
e)); |
481 // for outer curve | 484 // for outer curve |
482 fragBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn
()); | 485 fragBuilder->codeAppendf("vec2 scaledOffset = %s.xy;", offsets0.fsIn
()); |
483 fragBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset
) - 1.0;"); | 486 fragBuilder->codeAppend("float test = dot(scaledOffset, scaledOffset
) - 1.0;"); |
(...skipping 1593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2077 } | 2080 } |
2078 | 2081 |
2079 DRAW_BATCH_TEST_DEFINE(RRectBatch) { | 2082 DRAW_BATCH_TEST_DEFINE(RRectBatch) { |
2080 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); | 2083 SkMatrix viewMatrix = GrTest::TestMatrixRectStaysRect(random); |
2081 GrColor color = GrRandomColor(random); | 2084 GrColor color = GrRandomColor(random); |
2082 const SkRRect& rrect = GrTest::TestRRectSimple(random); | 2085 const SkRRect& rrect = GrTest::TestRRectSimple(random); |
2083 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); | 2086 return create_rrect_batch(color, viewMatrix, rrect, GrTest::TestStrokeRec(ra
ndom)); |
2084 } | 2087 } |
2085 | 2088 |
2086 #endif | 2089 #endif |
OLD | NEW |