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