| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright 2012 Google Inc. | 2  * Copyright 2012 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 #ifndef GrGLShaderBuilder_DEFINED | 8 #ifndef GrGLShaderBuilder_DEFINED | 
| 9 #define GrGLShaderBuilder_DEFINED | 9 #define GrGLShaderBuilder_DEFINED | 
| 10 | 10 | 
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 64                   uint32_t configComponentMask, | 64                   uint32_t configComponentMask, | 
| 65                   const char* swizzle, | 65                   const char* swizzle, | 
| 66                   int idx) { | 66                   int idx) { | 
| 67             SkASSERT(!this->isInitialized()); | 67             SkASSERT(!this->isInitialized()); | 
| 68             SkASSERT(0 != configComponentMask); | 68             SkASSERT(0 != configComponentMask); | 
| 69             SkASSERT(!fSamplerUniform.isValid()); | 69             SkASSERT(!fSamplerUniform.isValid()); | 
| 70 | 70 | 
| 71             SkASSERT(NULL != builder); | 71             SkASSERT(NULL != builder); | 
| 72             SkString name; | 72             SkString name; | 
| 73             name.printf("Sampler%d", idx); | 73             name.printf("Sampler%d", idx); | 
| 74             fSamplerUniform = builder->addUniform(GrGLShaderBuilder::kFragment_S
     haderType, | 74             fSamplerUniform = builder->addUniform(GrGLShaderBuilder::kFragment_V
     isibility, | 
| 75                                                   kSampler2D_GrSLType, | 75                                                   kSampler2D_GrSLType, | 
| 76                                                   name.c_str()); | 76                                                   name.c_str()); | 
| 77             SkASSERT(fSamplerUniform.isValid()); | 77             SkASSERT(fSamplerUniform.isValid()); | 
| 78 | 78 | 
| 79             fConfigComponentMask = configComponentMask; | 79             fConfigComponentMask = configComponentMask; | 
| 80             memcpy(fSwizzle, swizzle, 4); | 80             memcpy(fSwizzle, swizzle, 4); | 
| 81         } | 81         } | 
| 82 | 82 | 
| 83         void init(GrGLShaderBuilder* builder, const GrTextureAccess* access, int
      idx) { | 83         void init(GrGLShaderBuilder* builder, const GrTextureAccess* access, int
      idx) { | 
| 84             SkASSERT(NULL != access); | 84             SkASSERT(NULL != access); | 
| 85             this->init(builder, | 85             this->init(builder, | 
| 86                        GrPixelConfigComponentMask(access->getTexture()->config()
     ), | 86                        GrPixelConfigComponentMask(access->getTexture()->config()
     ), | 
| 87                        access->getSwizzle(), | 87                        access->getSwizzle(), | 
| 88                        idx); | 88                        idx); | 
| 89         } | 89         } | 
| 90 | 90 | 
| 91         uint32_t                          fConfigComponentMask; | 91         uint32_t                          fConfigComponentMask; | 
| 92         char                              fSwizzle[5]; | 92         char                              fSwizzle[5]; | 
| 93         GrGLUniformManager::UniformHandle fSamplerUniform; | 93         GrGLUniformManager::UniformHandle fSamplerUniform; | 
| 94 | 94 | 
| 95         friend class GrGLShaderBuilder; // to call init(). | 95         friend class GrGLShaderBuilder; // to call init(). | 
| 96     }; | 96     }; | 
| 97 | 97 | 
| 98     typedef SkTArray<TextureSampler> TextureSamplerArray; | 98     typedef SkTArray<TextureSampler> TextureSamplerArray; | 
| 99 | 99 | 
| 100     enum ShaderType { | 100     enum ShaderVisibility { | 
| 101         kVertex_ShaderType   = 0x1, | 101         kVertex_Visibility   = 0x1, | 
| 102         kGeometry_ShaderType = 0x2, | 102         kGeometry_Visibility = 0x2, | 
| 103         kFragment_ShaderType = 0x4, | 103         kFragment_Visibility = 0x4, | 
| 104     }; | 104     }; | 
| 105 | 105 | 
| 106     GrGLShaderBuilder(const GrGLContextInfo&, GrGLUniformManager&, const GrGLPro
     gramDesc&); | 106     GrGLShaderBuilder(const GrGLContextInfo&, GrGLUniformManager&, const GrGLPro
     gramDesc&); | 
| 107 | 107 | 
| 108     /** | 108     /** | 
| 109      * Use of these features may require a GLSL extension to be enabled. Shaders
      may not compile | 109      * Use of these features may require a GLSL extension to be enabled. Shaders
      may not compile | 
| 110      * if code is added that uses one of these features without calling enableFe
     ature() | 110      * if code is added that uses one of these features without calling enableFe
     ature() | 
| 111      */ | 111      */ | 
| 112     enum GLSLFeature { | 112     enum GLSLFeature { | 
| 113         kStandardDerivatives_GLSLFeature = 0, | 113         kStandardDerivatives_GLSLFeature = 0, | 
| 114 | 114 | 
| 115         kLastGLSLFeature = kStandardDerivatives_GLSLFeature | 115         kLastGLSLFeature = kStandardDerivatives_GLSLFeature | 
| 116     }; | 116     }; | 
| 117 | 117 | 
| 118     /** | 118     /** | 
| 119      * If the feature is supported then true is returned and any necessary #exte
     nsion declarations | 119      * If the feature is supported then true is returned and any necessary #exte
     nsion declarations | 
| 120      * are added to the shaders. If the feature is not supported then false will
      be returned. | 120      * are added to the shaders. If the feature is not supported then false will
      be returned. | 
| 121      */ | 121      */ | 
| 122     bool enableFeature(GLSLFeature); | 122     bool enableFeature(GLSLFeature); | 
| 123 | 123 | 
| 124     /** | 124     /** | 
| 125      * Called by GrGLEffects to add code to one of the shaders. | 125      * Called by GrGLEffects to add code to one of the shaders. | 
| 126      */ | 126      */ | 
| 127     void vsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) { | 127     void vsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) { | 
| 128         va_list args; | 128         va_list args; | 
| 129         va_start(args, format); | 129         va_start(args, format); | 
| 130         this->codeAppendf(kVertex_ShaderType, format, args); | 130         fVSCode.appendf(format, args); | 
| 131         va_end(args); | 131         va_end(args); | 
| 132     } | 132     } | 
| 133 | 133 | 
| 134     void gsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) { | 134     void gsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) { | 
| 135         va_list args; | 135         va_list args; | 
| 136         va_start(args, format); | 136         va_start(args, format); | 
| 137         this->codeAppendf(kGeometry_ShaderType, format, args); | 137         fGSCode.appendf(format, args); | 
| 138         va_end(args); | 138         va_end(args); | 
| 139     } | 139     } | 
| 140 | 140 | 
| 141     void fsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) { | 141     void fsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) { | 
| 142         va_list args; | 142         va_list args; | 
| 143         va_start(args, format); | 143         va_start(args, format); | 
| 144         this->codeAppendf(kFragment_ShaderType, format, args); | 144         fFSCode.appendf(format, args); | 
| 145         va_end(args); | 145         va_end(args); | 
| 146     } | 146     } | 
| 147 | 147 | 
| 148     void vsCodeAppend(const char* str) { this->codeAppend(kVertex_ShaderType, st
     r); } | 148     void vsCodeAppend(const char* str) { fVSCode.append(str); } | 
| 149     void gsCodeAppend(const char* str) { this->codeAppend(kGeometry_ShaderType, 
     str); } | 149     void gsCodeAppend(const char* str) { fGSCode.append(str); } | 
| 150     void fsCodeAppend(const char* str) { this->codeAppend(kFragment_ShaderType, 
     str); } | 150     void fsCodeAppend(const char* str) { fFSCode.append(str); } | 
| 151 | 151 | 
| 152     /** Appends a 2D texture sample with projection if necessary. coordType must
      either be Vec2f or | 152     /** Appends a 2D texture sample with projection if necessary. coordType must
      either be Vec2f or | 
| 153         Vec3f. The latter is interpreted as projective texture coords. The vec l
     ength and swizzle | 153         Vec3f. The latter is interpreted as projective texture coords. The vec l
     ength and swizzle | 
| 154         order of the result depends on the GrTextureAccess associated with the T
     extureSampler. */ | 154         order of the result depends on the GrTextureAccess associated with the T
     extureSampler. */ | 
| 155     void appendTextureLookup(SkString* out, | 155     void appendTextureLookup(SkString* out, | 
| 156                              const TextureSampler&, | 156                              const TextureSampler&, | 
| 157                              const char* coordName, | 157                              const char* coordName, | 
| 158                              GrSLType coordType = kVec2f_GrSLType) const; | 158                              GrSLType coordType = kVec2f_GrSLType) const; | 
| 159 | 159 | 
| 160     /** Version of above that appends the result to the shader code rather than 
     an SkString. | 160     /** Version of above that appends the result to the fragment shader code ins
     tead.*/ | 
| 161         Currently the shader type must be kFragment */ | 161     void fsAppendTextureLookup(const TextureSampler&, | 
| 162     void appendTextureLookup(ShaderType, | 162                                const char* coordName, | 
| 163                              const TextureSampler&, | 163                                GrSLType coordType = kVec2f_GrSLType); | 
| 164                              const char* coordName, |  | 
| 165                              GrSLType coordType = kVec2f_GrSLType); |  | 
| 166 | 164 | 
| 167 | 165 | 
| 168     /** Does the work of appendTextureLookup and modulates the result by modulat
     ion. The result is | 166     /** Does the work of appendTextureLookup and modulates the result by modulat
     ion. The result is | 
| 169         always a vec4. modulation and the swizzle specified by TextureSampler mu
     st both be vec4 or | 167         always a vec4. modulation and the swizzle specified by TextureSampler mu
     st both be vec4 or | 
| 170         float. If modulation is "" or NULL it this function acts as though appen
     dTextureLookup were | 168         float. If modulation is "" or NULL it this function acts as though appen
     dTextureLookup were | 
| 171         called. */ | 169         called. */ | 
| 172     void appendTextureLookupAndModulate(ShaderType, | 170     void fsAppendTextureLookupAndModulate(const char* modulation, | 
| 173                                         const char* modulation, | 171                                           const TextureSampler&, | 
| 174                                         const TextureSampler&, | 172                                           const char* coordName, | 
| 175                                         const char* coordName, | 173                                           GrSLType coordType = kVec2f_GrSLType); | 
| 176                                         GrSLType coordType = kVec2f_GrSLType); |  | 
| 177 | 174 | 
| 178     /** Emits a helper function outside of main(). Currently ShaderType must be | 175     /** Emits a helper function outside of main() in the fragment shader. */ | 
| 179         kFragment_ShaderType. */ | 176     void fsEmitFunction(GrSLType returnType, | 
| 180     void emitFunction(ShaderType shader, | 177                         const char* name, | 
| 181                       GrSLType returnType, | 178                         int argCnt, | 
| 182                       const char* name, | 179                         const GrGLShaderVar* args, | 
| 183                       int argCnt, | 180                         const char* body, | 
| 184                       const GrGLShaderVar* args, | 181                         SkString* outName); | 
| 185                       const char* body, |  | 
| 186                       SkString* outName); |  | 
| 187 | 182 | 
| 188     /** Generates a EffectKey for the shader code based on the texture access pa
     rameters and the | 183     /** Generates a EffectKey for the shader code based on the texture access pa
     rameters and the | 
| 189         capabilities of the GL context.  This is useful for keying the shader pr
     ograms that may | 184         capabilities of the GL context.  This is useful for keying the shader pr
     ograms that may | 
| 190         have multiple representations, based on the type/format of textures used
     . */ | 185         have multiple representations, based on the type/format of textures used
     . */ | 
| 191     static GrBackendEffectFactory::EffectKey KeyForTextureAccess(const GrTexture
     Access&, | 186     static GrBackendEffectFactory::EffectKey KeyForTextureAccess(const GrTexture
     Access&, | 
| 192                                                                  const GrGLCaps&
     ); | 187                                                                  const GrGLCaps&
     ); | 
| 193 | 188 | 
| 194     typedef uint8_t DstReadKey; | 189     typedef uint8_t DstReadKey; | 
| 195     typedef uint8_t FragPosKey; | 190     typedef uint8_t FragPosKey; | 
| 196 | 191 | 
| 197     /**  Returns a key for adding code to read the copy-of-dst color in service 
     of effects that | 192     /**  Returns a key for adding code to read the copy-of-dst color in service 
     of effects that | 
| 198          require reading the dst. It must not return 0 because 0 indicates that 
     there is no dst | 193          require reading the dst. It must not return 0 because 0 indicates that 
     there is no dst | 
| 199          copy read at all (in which case this function should not be called). */ | 194          copy read at all (in which case this function should not be called). */ | 
| 200     static DstReadKey KeyForDstRead(const GrTexture* dstCopy, const GrGLCaps&); | 195     static DstReadKey KeyForDstRead(const GrTexture* dstCopy, const GrGLCaps&); | 
| 201 | 196 | 
| 202     /** Returns a key for reading the fragment location. This should only be cal
     led if there is an | 197     /** Returns a key for reading the fragment location. This should only be cal
     led if there is an | 
| 203         effect that will requires the fragment position. If the fragment positio
     n is not required, | 198         effect that will requires the fragment position. If the fragment positio
     n is not required, | 
| 204         the key is 0. */ | 199         the key is 0. */ | 
| 205     static FragPosKey KeyForFragmentPosition(const GrRenderTarget* dst, const Gr
     GLCaps&); | 200     static FragPosKey KeyForFragmentPosition(const GrRenderTarget* dst, const Gr
     GLCaps&); | 
| 206 | 201 | 
| 207     /** If texture swizzling is available using tex parameters then it is prefer
     red over mangling | 202     /** If texture swizzling is available using tex parameters then it is prefer
     red over mangling | 
| 208         the generated shader code. This potentially allows greater reuse of cach
     ed shaders. */ | 203         the generated shader code. This potentially allows greater reuse of cach
     ed shaders. */ | 
| 209     static const GrGLenum* GetTexParamSwizzle(GrPixelConfig config, const GrGLCa
     ps& caps); | 204     static const GrGLenum* GetTexParamSwizzle(GrPixelConfig config, const GrGLCa
     ps& caps); | 
| 210 | 205 | 
| 211     /** Add a uniform variable to the current program, that has visibility in on
     e or more shaders. | 206     /** Add a uniform variable to the current program, that has visibility in on
     e or more shaders. | 
| 212         visibility is a bitfield of ShaderType values indicating from which shad
     ers the uniform | 207         visibility is a bitfield of ShaderVisibility values indicating from whic
     h shaders the | 
| 213         should be accessible. At least one bit must be set. Geometry shader unif
     orms are not | 208         uniform should be accessible. At least one bit must be set. Geometry sha
     der uniforms are not | 
| 214         supported at this time. The actual uniform name will be mangled. If outN
     ame is not NULL then | 209         supported at this time. The actual uniform name will be mangled. If outN
     ame is not NULL then | 
| 215         it will refer to the final uniform name after return. Use the addUniform
     Array variant to add | 210         it will refer to the final uniform name after return. Use the addUniform
     Array variant to add | 
| 216         an array of uniforms. | 211         an array of uniforms. | 
| 217     */ | 212     */ | 
| 218     GrGLUniformManager::UniformHandle addUniform(uint32_t visibility, | 213     GrGLUniformManager::UniformHandle addUniform(uint32_t visibility, | 
| 219                                                  GrSLType type, | 214                                                  GrSLType type, | 
| 220                                                  const char* name, | 215                                                  const char* name, | 
| 221                                                  const char** outName = NULL) { | 216                                                  const char** outName = NULL) { | 
| 222         return this->addUniformArray(visibility, type, name, GrGLShaderVar::kNon
     Array, outName); | 217         return this->addUniformArray(visibility, type, name, GrGLShaderVar::kNon
     Array, outName); | 
| 223     } | 218     } | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 273      */ | 268      */ | 
| 274     bool hasExplicitLocalCoords() const { return (fLocalCoordsVar != fPositionVa
     r); } | 269     bool hasExplicitLocalCoords() const { return (fLocalCoordsVar != fPositionVa
     r); } | 
| 275 | 270 | 
| 276     /** | 271     /** | 
| 277      * Interfaces used by GrGLProgram. | 272      * Interfaces used by GrGLProgram. | 
| 278      * TODO: Hide these from the GrEffects using friend or splitting this into t
     wo related classes. | 273      * TODO: Hide these from the GrEffects using friend or splitting this into t
     wo related classes. | 
| 279      * Also, GrGLProgram's shader string construction should be moved to this cl
     ass. | 274      * Also, GrGLProgram's shader string construction should be moved to this cl
     ass. | 
| 280      */ | 275      */ | 
| 281 | 276 | 
| 282     /** Called after building is complete to get the final shader string. */ | 277     /** Called after building is complete to get the final shader string. */ | 
| 283     void getShader(ShaderType, SkString*) const; | 278     void vsGetShader(SkString*) const; | 
|  | 279     void gsGetShader(SkString*) const; | 
|  | 280     void fsGetShader(SkString*) const; | 
| 284 | 281 | 
| 285     /** | 282     /** | 
| 286      * Adds code for effects. effectStages contains the effects to add. effectKe
     ys[i] is the key | 283      * Adds code for effects. effectStages contains the effects to add. effectKe
     ys[i] is the key | 
| 287      * generated from effectStages[i]. An entry in effectStages can be NULL, in 
     which case it is | 284      * generated from effectStages[i]. An entry in effectStages can be NULL, in 
     which case it is | 
| 288      * skipped. Moreover, if the corresponding key is GrGLEffect::NoEffectKey th
     en it is skipped. | 285      * skipped. Moreover, if the corresponding key is GrGLEffect::NoEffectKey th
     en it is skipped. | 
| 289      * inOutFSColor specifies the input color to the first stage and is updated 
     to be the | 286      * inOutFSColor specifies the input color to the first stage and is updated 
     to be the | 
| 290      * output color of the last stage. fsInOutColorKnownValue specifies whether 
     the input color | 287      * output color of the last stage. fsInOutColorKnownValue specifies whether 
     the input color | 
| 291      * has a known constant value and is updated to refer to the status of the o
     utput color. | 288      * has a known constant value and is updated to refer to the status of the o
     utput color. | 
| 292      * The handles to texture samplers for effectStage[i] are added to effectSam
     plerHandles[i]. The | 289      * The handles to texture samplers for effectStage[i] are added to effectSam
     plerHandles[i]. The | 
| 293      * glEffects array is updated to contain the GrGLEffect generated for each e
     ntry in | 290      * glEffects array is updated to contain the GrGLEffect generated for each e
     ntry in | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 323         return fEffectAttributes; | 320         return fEffectAttributes; | 
| 324     } | 321     } | 
| 325     const SkString* getEffectAttributeName(int attributeIndex) const; | 322     const SkString* getEffectAttributeName(int attributeIndex) const; | 
| 326 | 323 | 
| 327     // TODO: Make this do all the compiling, linking, etc. | 324     // TODO: Make this do all the compiling, linking, etc. | 
| 328     void finished(GrGLuint programID); | 325     void finished(GrGLuint programID); | 
| 329 | 326 | 
| 330     const GrGLContextInfo& ctxInfo() const { return fCtxInfo; } | 327     const GrGLContextInfo& ctxInfo() const { return fCtxInfo; } | 
| 331 | 328 | 
| 332 private: | 329 private: | 
| 333     void codeAppendf(ShaderType type, const char format[], va_list args); |  | 
| 334     void codeAppend(ShaderType type, const char* str); |  | 
| 335 |  | 
| 336     typedef GrTAllocator<GrGLShaderVar> VarArray; | 330     typedef GrTAllocator<GrGLShaderVar> VarArray; | 
| 337 | 331 | 
| 338     void appendDecls(const VarArray&, SkString*) const; | 332     void appendDecls(const VarArray&, SkString*) const; | 
| 339     void appendUniformDecls(ShaderType, SkString*) const; | 333     void appendUniformDecls(ShaderVisibility, SkString*) const; | 
| 340 | 334 | 
| 341     typedef GrGLUniformManager::BuilderUniform BuilderUniform; | 335     typedef GrGLUniformManager::BuilderUniform BuilderUniform; | 
| 342     GrGLUniformManager::BuilderUniformArray fUniforms; | 336     GrGLUniformManager::BuilderUniformArray fUniforms; | 
| 343 | 337 | 
| 344     // TODO: Everything below here private. | 338     // TODO: Everything below here private. | 
| 345 public: | 339 public: | 
| 346 | 340 | 
| 347     VarArray    fVSAttrs; | 341     VarArray    fVSAttrs; | 
| 348     VarArray    fVSOutputs; | 342     VarArray    fVSOutputs; | 
| 349     VarArray    fGSInputs; | 343     VarArray    fGSInputs; | 
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 407     /** | 401     /** | 
| 408      * Features that should only be enabled by GrGLShaderBuilder itself. | 402      * Features that should only be enabled by GrGLShaderBuilder itself. | 
| 409      */ | 403      */ | 
| 410     enum GLSLPrivateFeature { | 404     enum GLSLPrivateFeature { | 
| 411         kFragCoordConventions_GLSLPrivateFeature = kLastGLSLFeature + 1, | 405         kFragCoordConventions_GLSLPrivateFeature = kLastGLSLFeature + 1, | 
| 412         kEXTShaderFramebufferFetch_GLSLPrivateFeature, | 406         kEXTShaderFramebufferFetch_GLSLPrivateFeature, | 
| 413         kNVShaderFramebufferFetch_GLSLPrivateFeature, | 407         kNVShaderFramebufferFetch_GLSLPrivateFeature, | 
| 414     }; | 408     }; | 
| 415     bool enablePrivateFeature(GLSLPrivateFeature); | 409     bool enablePrivateFeature(GLSLPrivateFeature); | 
| 416 | 410 | 
| 417     // If we ever have VS/GS features we can expand this to take a bitmask of Sh
     aderType and track | 411     // If we ever have VS/GS features we can expand this to take a bitmask of Sh
     aderVisibility and | 
| 418     // the enables separately for each shader. | 412     // track the enables separately for each shader. | 
| 419     void addFSFeature(uint32_t featureBit, const char* extensionName); | 413     void addFSFeature(uint32_t featureBit, const char* extensionName); | 
| 420 | 414 | 
| 421     // Generates a name for a variable. The generated string will be name prefix
     ed by the prefix | 415     // Generates a name for a variable. The generated string will be name prefix
     ed by the prefix | 
| 422     // char (unless the prefix is '\0'). It also mangles the name to be stage-sp
     ecific if we're | 416     // char (unless the prefix is '\0'). It also mangles the name to be stage-sp
     ecific if we're | 
| 423     // generating stage code. | 417     // generating stage code. | 
| 424     void nameVariable(SkString* out, char prefix, const char* name); | 418     void nameVariable(SkString* out, char prefix, const char* name); | 
| 425 | 419 | 
| 426     // Interpretation of DstReadKey when generating code | 420     // Interpretation of DstReadKey when generating code | 
| 427     enum { | 421     enum { | 
| 428         kNoDstRead_DstReadKey         = 0, | 422         kNoDstRead_DstReadKey         = 0, | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
| 459     bool                                fTopLeftFragPosRead; | 453     bool                                fTopLeftFragPosRead; | 
| 460 | 454 | 
| 461     SkSTArray<10, AttributePair, true>  fEffectAttributes; | 455     SkSTArray<10, AttributePair, true>  fEffectAttributes; | 
| 462 | 456 | 
| 463     GrGLShaderVar*                      fPositionVar; | 457     GrGLShaderVar*                      fPositionVar; | 
| 464     GrGLShaderVar*                      fLocalCoordsVar; | 458     GrGLShaderVar*                      fLocalCoordsVar; | 
| 465 | 459 | 
| 466 }; | 460 }; | 
| 467 | 461 | 
| 468 #endif | 462 #endif | 
| OLD | NEW | 
|---|