Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 GrGLProgramBuilder_DEFINED | 8 #ifndef GrGLProgramBuilder_DEFINED |
| 9 #define GrGLProgramBuilder_DEFINED | 9 #define GrGLProgramBuilder_DEFINED |
| 10 | 10 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 33 */ | 33 */ |
| 34 class GrGLProgramBuilder { | 34 class GrGLProgramBuilder { |
| 35 public: | 35 public: |
| 36 enum ShaderVisibility { | 36 enum ShaderVisibility { |
| 37 kVertex_Visibility = 0x1, | 37 kVertex_Visibility = 0x1, |
| 38 kGeometry_Visibility = 0x2, | 38 kGeometry_Visibility = 0x2, |
| 39 kFragment_Visibility = 0x4, | 39 kFragment_Visibility = 0x4, |
| 40 }; | 40 }; |
| 41 | 41 |
| 42 typedef GrGLProgramDataManager::UniformHandle UniformHandle; | 42 typedef GrGLProgramDataManager::UniformHandle UniformHandle; |
| 43 typedef GrGLProgramDataManager::VaryingHandle VaryingHandle; | |
| 43 | 44 |
| 44 // Handles for program uniforms (other than per-effect uniforms) | 45 // Handles for program uniforms (other than per-effect uniforms) |
| 45 struct BuiltinUniformHandles { | 46 struct BuiltinUniformHandles { |
| 46 UniformHandle fViewMatrixUni; | 47 UniformHandle fViewMatrixUni; |
| 47 UniformHandle fRTAdjustmentUni; | 48 UniformHandle fRTAdjustmentUni; |
| 48 UniformHandle fColorUni; | 49 UniformHandle fColorUni; |
| 49 UniformHandle fCoverageUni; | 50 UniformHandle fCoverageUni; |
| 50 | 51 |
| 51 // We use the render target height to provide a y-down frag coord when s pecifying | 52 // We use the render target height to provide a y-down frag coord when s pecifying |
| 52 // origin_upper_left is not supported. | 53 // origin_upper_left is not supported. |
| 53 UniformHandle fRTHeightUni; | 54 UniformHandle fRTHeightUni; |
| 54 | 55 |
| 55 // Uniforms for computing texture coords to do the dst-copy lookup | 56 // Uniforms for computing texture coords to do the dst-copy lookup |
| 56 UniformHandle fDstCopyTopLeftUni; | 57 UniformHandle fDstCopyTopLeftUni; |
| 57 UniformHandle fDstCopyScaleUni; | 58 UniformHandle fDstCopyScaleUni; |
| 58 UniformHandle fDstCopySamplerUni; | 59 UniformHandle fDstCopySamplerUni; |
| 59 }; | 60 }; |
| 60 | 61 |
| 61 struct UniformInfo { | 62 struct UniformInfo { |
| 62 GrGLShaderVar fVariable; | 63 GrGLShaderVar fVariable; |
| 63 uint32_t fVisibility; | 64 uint32_t fVisibility; |
| 64 GrGLint fLocation; | 65 GrGLint fLocation; |
| 65 }; | 66 }; |
| 66 | 67 |
| 67 // This uses an allocator rather than array so that the GrGLShaderVars don't move in memory | 68 // This uses an allocator rather than array so that the GrGLShaderVars don't move in memory |
| 68 // after they are inserted. Users of GrGLShaderBuilder get refs to the vars and ptrs to their | 69 // after they are inserted. Users of GrGLShaderBuilder get refs to the vars and ptrs to their |
| 69 // name strings. Otherwise, we'd have to hand out copies. | 70 // name strings. Otherwise, we'd have to hand out copies. |
| 70 typedef GrTAllocator<UniformInfo> UniformInfoArray; | 71 typedef GrTAllocator<UniformInfo> UniformInfoArray; |
| 71 | 72 |
| 73 struct SeparableVaryingInfo { | |
| 74 GrGLShaderVar fVariable; | |
| 75 GrGLint fLocation; | |
| 76 }; | |
| 77 | |
| 78 typedef GrTAllocator<SeparableVaryingInfo> SeparableVaryingInfoArray; | |
| 79 | |
| 72 /** Generates a shader program. | 80 /** Generates a shader program. |
| 73 * | 81 * |
| 74 * The program implements what is specified in the stages given as input. | 82 * The program implements what is specified in the stages given as input. |
| 75 * After successful generation, the builder result objects are available | 83 * After successful generation, the builder result objects are available |
| 76 * to be used. | 84 * to be used. |
| 77 * @return true if generation was successful. | 85 * @return true if generation was successful. |
| 78 */ | 86 */ |
| 79 bool genProgram(const GrEffectStage* inColorStages[], | 87 bool genProgram(const GrEffectStage* inColorStages[], |
| 80 const GrEffectStage* inCoverageStages[]); | 88 const GrEffectStage* inCoverageStages[]); |
| 81 | 89 |
| 82 // Below are the results of the shader generation. | 90 // Below are the results of the shader generation. |
| 83 | 91 |
| 84 GrGLProgramEffects* getColorEffects() const { SkASSERT(fProgramID); return f ColorEffects.get(); } | 92 GrGLProgramEffects* getColorEffects() const { SkASSERT(fProgramID); return f ColorEffects.get(); } |
| 85 GrGLProgramEffects* getCoverageEffects() const { SkASSERT(fProgramID); retur n fCoverageEffects.get(); } | 93 GrGLProgramEffects* getCoverageEffects() const { SkASSERT(fProgramID); retur n fCoverageEffects.get(); } |
| 86 const BuiltinUniformHandles& getBuiltinUniformHandles() const { | 94 const BuiltinUniformHandles& getBuiltinUniformHandles() const { |
| 87 SkASSERT(fProgramID); | 95 SkASSERT(fProgramID); |
| 88 return fUniformHandles; | 96 return fUniformHandles; |
| 89 } | 97 } |
| 90 GrGLuint getProgramID() const { SkASSERT(fProgramID); return fProgramID; } | 98 GrGLuint getProgramID() const { SkASSERT(fProgramID); return fProgramID; } |
| 91 bool hasVertexShader() const { SkASSERT(fProgramID); return !fFragOnly; } | 99 bool hasVertexShader() const { SkASSERT(fProgramID); return !fFragOnly; } |
| 92 int getTexCoordSetCount() const { SkASSERT(fProgramID); return fTexCoordSetC nt; } | 100 int getTexCoordSetCount() const { SkASSERT(fProgramID); return fTexCoordSetC nt; } |
| 93 const UniformInfoArray& getUniformInfos() const { return fUniforms; } | 101 const UniformInfoArray& getUniformInfos() const { return fUniforms; } |
| 102 const SeparableVaryingInfoArray& getSeparableVaryingInfos() const { | |
| 103 return fSeparableVaryingInfos; | |
| 104 } | |
| 94 | 105 |
| 95 virtual ~GrGLProgramBuilder() {} | 106 virtual ~GrGLProgramBuilder() {} |
| 96 | 107 |
| 97 /** Add a uniform variable to the current program, that has visibility in on e or more shaders. | 108 /** Add a uniform variable to the current program, that has visibility in on e or more shaders. |
| 98 visibility is a bitfield of ShaderVisibility values indicating from whic h shaders the | 109 visibility is a bitfield of ShaderVisibility values indicating from whic h shaders the |
| 99 uniform should be accessible. At least one bit must be set. Geometry sha der uniforms are not | 110 uniform should be accessible. At least one bit must be set. Geometry sha der uniforms are not |
| 100 supported at this time. The actual uniform name will be mangled. If outN ame is not NULL then | 111 supported at this time. The actual uniform name will be mangled. If outN ame is not NULL then |
| 101 it will refer to the final uniform name after return. Use the addUniform Array variant to add | 112 it will refer to the final uniform name after return. Use the addUniform Array variant to add |
| 102 an array of uniforms. */ | 113 an array of uniforms. */ |
| 103 GrGLProgramDataManager::UniformHandle addUniform(uint32_t visibility, | 114 GrGLProgramDataManager::UniformHandle addUniform(uint32_t visibility, |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 119 /** | 130 /** |
| 120 * Shortcut for getUniformVariable(u).c_str() | 131 * Shortcut for getUniformVariable(u).c_str() |
| 121 */ | 132 */ |
| 122 const char* getUniformCStr(GrGLProgramDataManager::UniformHandle u) const { | 133 const char* getUniformCStr(GrGLProgramDataManager::UniformHandle u) const { |
| 123 return this->getUniformVariable(u).c_str(); | 134 return this->getUniformVariable(u).c_str(); |
| 124 } | 135 } |
| 125 | 136 |
| 126 const GrGLContextInfo& ctxInfo() const; | 137 const GrGLContextInfo& ctxInfo() const; |
| 127 | 138 |
| 128 GrGLFragmentShaderBuilder* getFragmentShaderBuilder() { return &fFS; } | 139 GrGLFragmentShaderBuilder* getFragmentShaderBuilder() { return &fFS; } |
| 140 GrGpuGL* gpu() const { return fGpu; } | |
| 129 | 141 |
| 130 protected: | 142 protected: |
| 131 typedef GrTAllocator<GrGLShaderVar> VarArray; | 143 typedef GrTAllocator<GrGLShaderVar> VarArray; |
| 132 GrGLProgramBuilder(GrGpuGL*, const GrGLProgramDesc&); | 144 GrGLProgramBuilder(GrGpuGL*, const GrGLProgramDesc&); |
| 133 | 145 |
| 134 GrGpuGL* gpu() const { return fGpu; } | |
| 135 | |
| 136 const GrGLProgramDesc& desc() const { return fDesc; } | 146 const GrGLProgramDesc& desc() const { return fDesc; } |
| 137 | 147 |
| 138 // Helper for emitEffects(). | 148 // Helper for emitEffects(). |
| 139 void createAndEmitEffects(GrGLProgramEffectsBuilder*, | 149 void createAndEmitEffects(GrGLProgramEffectsBuilder*, |
| 140 const GrEffectStage* effectStages[], | 150 const GrEffectStage* effectStages[], |
| 141 int effectCnt, | 151 int effectCnt, |
| 142 const GrGLProgramDesc::EffectKeyProvider&, | 152 const GrGLProgramDesc::EffectKeyProvider&, |
| 143 GrGLSLExpr4* inOutFSColor); | 153 GrGLSLExpr4* inOutFSColor); |
| 144 | 154 |
| 145 // Generates a name for a variable. The generated string will be name prefix ed by the prefix | 155 // Generates a name for a variable. The generated string will be name prefix ed by the prefix |
| 146 // char (unless the prefix is '\0'). It also mangles the name to be stage-sp ecific if we're | 156 // char (unless the prefix is '\0'). It also mangles the name to be stage-sp ecific if we're |
| 147 // generating stage code. | 157 // generating stage code. |
| 148 void nameVariable(SkString* out, char prefix, const char* name); | 158 void nameVariable(SkString* out, char prefix, const char* name); |
| 149 | 159 |
| 150 virtual bool compileAndAttachShaders(GrGLuint programId, SkTDArray<GrGLuint> * shaderIds) const; | 160 virtual bool compileAndAttachShaders(GrGLuint programId, SkTDArray<GrGLuint> * shaderIds) const; |
| 151 | 161 |
| 152 virtual void bindProgramLocations(GrGLuint programId); | 162 virtual void bindProgramLocations(GrGLuint programId); |
| 153 void resolveProgramLocations(GrGLuint programId); | 163 void resolveProgramLocations(GrGLuint programId); |
| 154 | 164 |
| 155 void appendDecls(const VarArray&, SkString*) const; | 165 void appendDecls(const VarArray&, SkString*) const; |
| 156 void appendUniformDecls(ShaderVisibility, SkString*) const; | 166 void appendUniformDecls(ShaderVisibility, SkString*) const; |
| 157 | 167 |
| 158 SkAutoTUnref<GrGLProgramEffects> fColorEffects; | 168 SkAutoTUnref<GrGLProgramEffects> fColorEffects; |
| 159 SkAutoTUnref<GrGLProgramEffects> fCoverageEffects; | 169 SkAutoTUnref<GrGLProgramEffects> fCoverageEffects; |
| 160 BuiltinUniformHandles fUniformHandles; | 170 BuiltinUniformHandles fUniformHandles; |
| 161 bool fFragOnly; | 171 bool fFragOnly; |
| 162 int fTexCoordSetCnt; | 172 int fTexCoordSetCnt; |
| 163 GrGLuint fProgramID; | 173 GrGLuint fProgramID; |
| 164 GrGLFragmentShaderBuilder fFS; | 174 GrGLFragmentShaderBuilder fFS; |
| 175 SeparableVaryingInfoArray fSeparableVaryingInfos; | |
| 165 private: | 176 private: |
| 166 class CodeStage : SkNoncopyable { | 177 class CodeStage : SkNoncopyable { |
| 167 public: | 178 public: |
| 168 CodeStage() : fNextIndex(0), fCurrentIndex(-1), fEffectStage(NULL) {} | 179 CodeStage() : fNextIndex(0), fCurrentIndex(-1), fEffectStage(NULL) {} |
| 169 | 180 |
| 170 bool inStageCode() const { | 181 bool inStageCode() const { |
| 171 this->validate(); | 182 this->validate(); |
| 172 return NULL != fEffectStage; | 183 return NULL != fEffectStage; |
| 173 } | 184 } |
| 174 | 185 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 264 GrGLFullProgramBuilder(GrGpuGL*, const GrGLProgramDesc&); | 275 GrGLFullProgramBuilder(GrGpuGL*, const GrGLProgramDesc&); |
| 265 | 276 |
| 266 /** Add a varying variable to the current program to pass values between vert ex and fragment | 277 /** Add a varying variable to the current program to pass values between vert ex and fragment |
| 267 shaders. If the last two parameters are non-NULL, they are filled in wit h the name | 278 shaders. If the last two parameters are non-NULL, they are filled in wit h the name |
| 268 generated. */ | 279 generated. */ |
| 269 void addVarying(GrSLType type, | 280 void addVarying(GrSLType type, |
| 270 const char* name, | 281 const char* name, |
| 271 const char** vsOutName = NULL, | 282 const char** vsOutName = NULL, |
| 272 const char** fsInName = NULL); | 283 const char** fsInName = NULL); |
| 273 | 284 |
| 285 /** Add a separable varying input variable to the current program. | |
| 286 * A separable varying (fragment shader input) is a varying that can be used also when vertex | |
| 287 * shaders are not used. With a vertex shader, the operation is same as with other | |
| 288 * varyings. Without a vertex shader, such as with NV_path_rendering, GL API s are used to | |
| 289 * populate the variable. The APIs can refer to the variable through the ret urned handle. | |
| 290 */ | |
| 291 VaryingHandle addSeparableVarying(GrSLType type, | |
| 292 const char* name, | |
| 293 const char** vsOutName, | |
| 294 const char** fsInName); | |
| 295 | |
|
joshua.litt
2014/08/25 17:00:05
Since this only requires a fragment shader, does i
Chris Dalton
2014/08/25 18:04:50
It actually does require a vertex shader. Not for
| |
| 274 GrGLVertexShaderBuilder* getVertexShaderBuilder() { return &fVS; } | 296 GrGLVertexShaderBuilder* getVertexShaderBuilder() { return &fVS; } |
| 275 | 297 |
| 276 private: | 298 private: |
| 277 virtual void emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr4* coverage ) SK_OVERRIDE; | 299 virtual void emitCodeBeforeEffects(GrGLSLExpr4* color, GrGLSLExpr4* coverage ) SK_OVERRIDE; |
| 278 | 300 |
| 279 virtual GrGLProgramEffects* createAndEmitEffects(const GrEffectStage* effect Stages[], | 301 virtual GrGLProgramEffects* createAndEmitEffects(const GrEffectStage* effect Stages[], |
| 280 int effectCnt, | 302 int effectCnt, |
| 281 const GrGLProgramDesc::Effe ctKeyProvider&, | 303 const GrGLProgramDesc::Effe ctKeyProvider&, |
| 282 GrGLSLExpr4* inOutFSColor) SK_OVERRIDE; | 304 GrGLSLExpr4* inOutFSColor) SK_OVERRIDE; |
| 283 | 305 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 309 int effectCnt, | 331 int effectCnt, |
| 310 const GrGLProgramDesc::Effe ctKeyProvider&, | 332 const GrGLProgramDesc::Effe ctKeyProvider&, |
| 311 GrGLSLExpr4* inOutFSColor) SK_OVERRIDE; | 333 GrGLSLExpr4* inOutFSColor) SK_OVERRIDE; |
| 312 | 334 |
| 313 virtual void emitCodeAfterEffects() SK_OVERRIDE {} | 335 virtual void emitCodeAfterEffects() SK_OVERRIDE {} |
| 314 | 336 |
| 315 typedef GrGLProgramBuilder INHERITED; | 337 typedef GrGLProgramBuilder INHERITED; |
| 316 }; | 338 }; |
| 317 | 339 |
| 318 #endif | 340 #endif |
| OLD | NEW |