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