| 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 "GrPathProcessor.h" | 8 #include "GrPathProcessor.h" | 
| 9 | 9 | 
| 10 #include "gl/GrGLGpu.h" | 10 #include "gl/GrGLGpu.h" | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 27 | 27 | 
| 28     void emitCode(EmitArgs& args) override { | 28     void emitCode(EmitArgs& args) override { | 
| 29         GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder; | 29         GrGLSLPPFragmentBuilder* fragBuilder = args.fFragBuilder; | 
| 30         const GrPathProcessor& pathProc = args.fGP.cast<GrPathProcessor>(); | 30         const GrPathProcessor& pathProc = args.fGP.cast<GrPathProcessor>(); | 
| 31 | 31 | 
| 32         if (!pathProc.viewMatrix().hasPerspective()) { | 32         if (!pathProc.viewMatrix().hasPerspective()) { | 
| 33             args.fVaryingHandler->setNoPerspective(); | 33             args.fVaryingHandler->setNoPerspective(); | 
| 34         } | 34         } | 
| 35 | 35 | 
| 36         // emit transforms | 36         // emit transforms | 
| 37         this->emitTransforms(args.fVaryingHandler, args.fTransformsIn, args.fTra
     nsformsOut); | 37         this->emitTransforms(args.fVaryingHandler, args.fFPCoordTransformHandler
     ); | 
| 38 | 38 | 
| 39         // Setup uniform color | 39         // Setup uniform color | 
| 40         if (pathProc.overrides().readsColor()) { | 40         if (pathProc.overrides().readsColor()) { | 
| 41             const char* stagedLocalVarName; | 41             const char* stagedLocalVarName; | 
| 42             fColorUniform = args.fUniformHandler->addUniform(kFragment_GrShaderF
     lag, | 42             fColorUniform = args.fUniformHandler->addUniform(kFragment_GrShaderF
     lag, | 
| 43                                                              kVec4f_GrSLType, | 43                                                              kVec4f_GrSLType, | 
| 44                                                              kDefault_GrSLPrecis
     ion, | 44                                                              kDefault_GrSLPrecis
     ion, | 
| 45                                                              "Color", | 45                                                              "Color", | 
| 46                                                              &stagedLocalVarName
     ); | 46                                                              &stagedLocalVarName
     ); | 
| 47             fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalV
     arName); | 47             fragBuilder->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalV
     arName); | 
| 48         } | 48         } | 
| 49 | 49 | 
| 50         // setup constant solid coverage | 50         // setup constant solid coverage | 
| 51         if (pathProc.overrides().readsCoverage()) { | 51         if (pathProc.overrides().readsCoverage()) { | 
| 52             fragBuilder->codeAppendf("%s = vec4(1);", args.fOutputCoverage); | 52             fragBuilder->codeAppendf("%s = vec4(1);", args.fOutputCoverage); | 
| 53         } | 53         } | 
| 54     } | 54     } | 
| 55 | 55 | 
| 56     void emitTransforms(GrGLSLVaryingHandler* varyingHandler, | 56     void emitTransforms(GrGLSLVaryingHandler* varyingHandler, | 
| 57                         const TransformsIn& tin, | 57                         FPCoordTransformHandler* transformHandler) { | 
| 58                         TransformsOut* tout) { | 58         int i = 0; | 
| 59         tout->push_back_n(tin.count()); | 59         while (const GrCoordTransform* coordTransform = transformHandler->nextCo
     ordTransform()) { | 
| 60         fInstalledTransforms.push_back_n(tin.count()); | 60             GrSLType varyingType = | 
| 61         for (int i = 0; i < tin.count(); i++) { | 61                     coordTransform->getMatrix().hasPerspective() ? kVec3f_GrSLTy
     pe | 
| 62             const ProcCoords& coordTransforms = tin[i]; | 62                                                                  : kVec2f_GrSLTy
     pe; | 
| 63             fInstalledTransforms[i].push_back_n(coordTransforms.count()); |  | 
| 64             for (int t = 0; t < coordTransforms.count(); t++) { |  | 
| 65                 GrSLType varyingType = |  | 
| 66                         coordTransforms[t]->getMatrix().hasPerspective() ? kVec3
     f_GrSLType : |  | 
| 67                                                                            kVec2
     f_GrSLType; |  | 
| 68 | 63 | 
| 69                 SkString strVaryingName("MatrixCoord"); | 64             SkString strVaryingName; | 
| 70                 strVaryingName.appendf("_%i_%i", i, t); | 65             strVaryingName.printf("TransformedCoord_%d", i); | 
| 71                 GrGLSLVertToFrag v(varyingType); | 66             GrGLSLVertToFrag v(varyingType); | 
| 72                 GrGLVaryingHandler* glVaryingHandler = (GrGLVaryingHandler*) var
     yingHandler; | 67             GrGLVaryingHandler* glVaryingHandler = (GrGLVaryingHandler*) varying
     Handler; | 
| 73                 fInstalledTransforms[i][t].fHandle = | 68             fInstalledTransforms.push_back().fHandle = | 
| 74                         glVaryingHandler->addPathProcessingVarying(strVaryingNam
     e.c_str(), | 69                     glVaryingHandler->addPathProcessingVarying(strVaryingName.c_
     str(), | 
| 75                                                                    &v).toIndex()
     ; | 70                                                                &v).toIndex(); | 
| 76                 fInstalledTransforms[i][t].fType = varyingType; | 71             fInstalledTransforms.back().fType = varyingType; | 
| 77 | 72 | 
| 78                 (*tout)[i].emplace_back(SkString(v.fsIn()), varyingType); | 73             transformHandler->specifyCoordsForCurrCoordTransform(SkString(v.fsIn
     ()), varyingType); | 
| 79             } | 74             ++i; | 
| 80         } | 75         } | 
| 81     } | 76     } | 
| 82 | 77 | 
| 83     void setData(const GrGLSLProgramDataManager& pd, | 78     void setData(const GrGLSLProgramDataManager& pd, | 
| 84                  const GrPrimitiveProcessor& primProc) override { | 79                  const GrPrimitiveProcessor& primProc, | 
|  | 80                  FPCoordTransformIter&& transformIter) override { | 
| 85         const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); | 81         const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); | 
| 86         if (pathProc.overrides().readsColor() && pathProc.color() != fColor) { | 82         if (pathProc.overrides().readsColor() && pathProc.color() != fColor) { | 
| 87             float c[4]; | 83             float c[4]; | 
| 88             GrColorToRGBAFloat(pathProc.color(), c); | 84             GrColorToRGBAFloat(pathProc.color(), c); | 
| 89             pd.set4fv(fColorUniform, 1, c); | 85             pd.set4fv(fColorUniform, 1, c); | 
| 90             fColor = pathProc.color(); | 86             fColor = pathProc.color(); | 
| 91         } | 87         } | 
| 92     } |  | 
| 93 | 88 | 
| 94     void setTransformData(const GrPrimitiveProcessor& primProc, | 89         int t = 0; | 
| 95                           const GrGLSLProgramDataManager& pdman, | 90         while (const GrCoordTransform* coordTransform = transformIter.next()) { | 
| 96                           int index, | 91             SkASSERT(fInstalledTransforms[t].fHandle.isValid()); | 
| 97                           const SkTArray<const GrCoordTransform*, true>& coordTr
     ansforms) override { | 92             const SkMatrix& m = GetTransformMatrix(pathProc.localMatrix(), *coor
     dTransform); | 
| 98         const GrPathProcessor& pathProc = primProc.cast<GrPathProcessor>(); | 93             if (fInstalledTransforms[t].fCurrentValue.cheapEqualTo(m)) { | 
| 99         SkTArray<TransformVarying, true>& transforms = fInstalledTransforms[inde
     x]; |  | 
| 100         int numTransforms = transforms.count(); |  | 
| 101         for (int t = 0; t < numTransforms; ++t) { |  | 
| 102             SkASSERT(transforms[t].fHandle.isValid()); |  | 
| 103             const SkMatrix& transform = GetTransformMatrix(pathProc.localMatrix(
     ), |  | 
| 104                                                            *coordTransforms[t]); |  | 
| 105             if (transforms[t].fCurrentValue.cheapEqualTo(transform)) { |  | 
| 106                 continue; | 94                 continue; | 
| 107             } | 95             } | 
| 108             transforms[t].fCurrentValue = transform; | 96             fInstalledTransforms[t].fCurrentValue = m; | 
| 109 | 97 | 
| 110             SkASSERT(transforms[t].fType == kVec2f_GrSLType || | 98             SkASSERT(fInstalledTransforms[t].fType == kVec2f_GrSLType || | 
| 111                      transforms[t].fType == kVec3f_GrSLType); | 99                      fInstalledTransforms[t].fType == kVec3f_GrSLType); | 
| 112             unsigned components = transforms[t].fType == kVec2f_GrSLType ? 2 : 3
     ; | 100             unsigned components = fInstalledTransforms[t].fType == kVec2f_GrSLTy
     pe ? 2 : 3; | 
| 113             pdman.setPathFragmentInputTransform(transforms[t].fHandle, component
     s, transform); | 101             pd.setPathFragmentInputTransform(fInstalledTransforms[t].fHandle, co
     mponents, m); | 
|  | 102             ++t; | 
| 114         } | 103         } | 
| 115     } | 104     } | 
| 116 | 105 | 
| 117 private: | 106 private: | 
| 118     typedef GrGLSLProgramDataManager::VaryingHandle VaryingHandle; | 107     typedef GrGLSLProgramDataManager::VaryingHandle VaryingHandle; | 
| 119     struct TransformVarying { | 108     struct TransformVarying { | 
| 120         VaryingHandle  fHandle; | 109         VaryingHandle  fHandle; | 
| 121         SkMatrix       fCurrentValue = SkMatrix::InvalidMatrix(); | 110         SkMatrix       fCurrentValue = SkMatrix::InvalidMatrix(); | 
| 122         GrSLType       fType = kVoid_GrSLType; | 111         GrSLType       fType = kVoid_GrSLType; | 
| 123     }; | 112     }; | 
| 124 | 113 | 
| 125     SkSTArray<8, SkSTArray<2, TransformVarying, true> > fInstalledTransforms; | 114     SkTArray<TransformVarying, true> fInstalledTransforms; | 
| 126 | 115 | 
| 127     UniformHandle fColorUniform; | 116     UniformHandle fColorUniform; | 
| 128     GrColor fColor; | 117     GrColor fColor; | 
| 129 | 118 | 
| 130     typedef GrGLSLPrimitiveProcessor INHERITED; | 119     typedef GrGLSLPrimitiveProcessor INHERITED; | 
| 131 }; | 120 }; | 
| 132 | 121 | 
| 133 GrPathProcessor::GrPathProcessor(GrColor color, | 122 GrPathProcessor::GrPathProcessor(GrColor color, | 
| 134                                  const GrXPOverridesForBatch& overrides, | 123                                  const GrXPOverridesForBatch& overrides, | 
| 135                                  const SkMatrix& viewMatrix, | 124                                  const SkMatrix& viewMatrix, | 
| 136                                  const SkMatrix& localMatrix) | 125                                  const SkMatrix& localMatrix) | 
| 137     : fColor(color) | 126     : fColor(color) | 
| 138     , fViewMatrix(viewMatrix) | 127     , fViewMatrix(viewMatrix) | 
| 139     , fLocalMatrix(localMatrix) | 128     , fLocalMatrix(localMatrix) | 
| 140     , fOverrides(overrides) { | 129     , fOverrides(overrides) { | 
| 141     this->initClassID<GrPathProcessor>(); | 130     this->initClassID<GrPathProcessor>(); | 
| 142 } | 131 } | 
| 143 | 132 | 
| 144 void GrPathProcessor::getGLSLProcessorKey(const GrGLSLCaps& caps, | 133 void GrPathProcessor::getGLSLProcessorKey(const GrGLSLCaps& caps, | 
| 145                                           GrProcessorKeyBuilder* b) const { | 134                                           GrProcessorKeyBuilder* b) const { | 
| 146     GrGLPathProcessor::GenKey(*this, caps, b); | 135     GrGLPathProcessor::GenKey(*this, caps, b); | 
| 147 } | 136 } | 
| 148 | 137 | 
| 149 GrGLSLPrimitiveProcessor* GrPathProcessor::createGLSLInstance(const GrGLSLCaps& 
     caps) const { | 138 GrGLSLPrimitiveProcessor* GrPathProcessor::createGLSLInstance(const GrGLSLCaps& 
     caps) const { | 
| 150     SkASSERT(caps.pathRenderingSupport()); | 139     SkASSERT(caps.pathRenderingSupport()); | 
| 151     return new GrGLPathProcessor(); | 140     return new GrGLPathProcessor(); | 
| 152 } | 141 } | 
| OLD | NEW | 
|---|