GrPathProcessor.cpp 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. * Copyright 2013 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "src/gpu/GrPathProcessor.h"
  8. #include "include/private/SkTo.h"
  9. #include "src/gpu/GrShaderCaps.h"
  10. #include "src/gpu/gl/GrGLGpu.h"
  11. #include "src/gpu/gl/GrGLVaryingHandler.h"
  12. #include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h"
  13. #include "src/gpu/glsl/GrGLSLPrimitiveProcessor.h"
  14. #include "src/gpu/glsl/GrGLSLUniformHandler.h"
  15. #include "src/gpu/glsl/GrGLSLVarying.h"
  16. class GrGLPathProcessor : public GrGLSLPrimitiveProcessor {
  17. public:
  18. GrGLPathProcessor() : fColor(SK_PMColor4fILLEGAL) {}
  19. static void GenKey(const GrPathProcessor& pathProc,
  20. const GrShaderCaps&,
  21. GrProcessorKeyBuilder* b) {
  22. b->add32(SkToInt(pathProc.viewMatrix().hasPerspective()));
  23. }
  24. void emitCode(EmitArgs& args) override {
  25. GrGLSLFPFragmentBuilder* fragBuilder = args.fFragBuilder;
  26. const GrPathProcessor& pathProc = args.fGP.cast<GrPathProcessor>();
  27. if (!pathProc.viewMatrix().hasPerspective()) {
  28. args.fVaryingHandler->setNoPerspective();
  29. }
  30. // emit transforms
  31. this->emitTransforms(args.fVaryingHandler, args.fFPCoordTransformHandler);
  32. // Setup uniform color
  33. const char* stagedLocalVarName;
  34. fColorUniform = args.fUniformHandler->addUniform(kFragment_GrShaderFlag,
  35. kHalf4_GrSLType,
  36. "Color",
  37. &stagedLocalVarName);
  38. fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalVarName);
  39. // setup constant solid coverage
  40. fragBuilder->codeAppendf("%s = half4(1);", args.fOutputCoverage);
  41. }
  42. void emitTransforms(GrGLSLVaryingHandler* varyingHandler,
  43. FPCoordTransformHandler* transformHandler) {
  44. int i = 0;
  45. while (const GrCoordTransform* coordTransform = transformHandler->nextCoordTransform()) {
  46. GrSLType varyingType =
  47. coordTransform->getMatrix().hasPerspective() ? kHalf3_GrSLType
  48. : kHalf2_GrSLType;
  49. SkString strVaryingName;
  50. strVaryingName.printf("TransformedCoord_%d", i);
  51. GrGLSLVarying v(varyingType);
  52. GrGLVaryingHandler* glVaryingHandler = (GrGLVaryingHandler*) varyingHandler;
  53. fInstalledTransforms.push_back().fHandle =
  54. glVaryingHandler->addPathProcessingVarying(strVaryingName.c_str(),
  55. &v).toIndex();
  56. fInstalledTransforms.back().fType = varyingType;
  57. transformHandler->specifyCoordsForCurrCoordTransform(SkString(v.fsIn()), varyingType);
  58. ++i;
  59. }
  60. }
  61. void setData(const GrGLSLProgramDataManager& pd,
  62. const GrPrimitiveProcessor& primProc,
  63. FPCoordTransformIter&& transformIter) override {
  64. const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>();
  65. if (pathProc.color() != fColor) {
  66. pd.set4fv(fColorUniform, 1, pathProc.color().vec());
  67. fColor = pathProc.color();
  68. }
  69. int t = 0;
  70. while (const GrCoordTransform* coordTransform = transformIter.next()) {
  71. SkASSERT(fInstalledTransforms[t].fHandle.isValid());
  72. const SkMatrix& m = GetTransformMatrix(pathProc.localMatrix(), *coordTransform);
  73. if (fInstalledTransforms[t].fCurrentValue.cheapEqualTo(m)) {
  74. continue;
  75. }
  76. fInstalledTransforms[t].fCurrentValue = m;
  77. SkASSERT(fInstalledTransforms[t].fType == kHalf2_GrSLType ||
  78. fInstalledTransforms[t].fType == kHalf3_GrSLType);
  79. unsigned components = fInstalledTransforms[t].fType == kHalf2_GrSLType ? 2 : 3;
  80. pd.setPathFragmentInputTransform(fInstalledTransforms[t].fHandle, components, m);
  81. ++t;
  82. }
  83. }
  84. private:
  85. typedef GrGLSLProgramDataManager::VaryingHandle VaryingHandle;
  86. struct TransformVarying {
  87. VaryingHandle fHandle;
  88. SkMatrix fCurrentValue = SkMatrix::InvalidMatrix();
  89. GrSLType fType = kVoid_GrSLType;
  90. };
  91. SkTArray<TransformVarying, true> fInstalledTransforms;
  92. UniformHandle fColorUniform;
  93. SkPMColor4f fColor;
  94. typedef GrGLSLPrimitiveProcessor INHERITED;
  95. };
  96. GrPathProcessor::GrPathProcessor(const SkPMColor4f& color,
  97. const SkMatrix& viewMatrix,
  98. const SkMatrix& localMatrix)
  99. : INHERITED(kGrPathProcessor_ClassID)
  100. , fColor(color)
  101. , fViewMatrix(viewMatrix)
  102. , fLocalMatrix(localMatrix) {}
  103. void GrPathProcessor::getGLSLProcessorKey(const GrShaderCaps& caps,
  104. GrProcessorKeyBuilder* b) const {
  105. GrGLPathProcessor::GenKey(*this, caps, b);
  106. }
  107. GrGLSLPrimitiveProcessor* GrPathProcessor::createGLSLInstance(const GrShaderCaps& caps) const {
  108. SkASSERT(caps.pathRenderingSupport());
  109. return new GrGLPathProcessor();
  110. }