| 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 |