| Index: src/gpu/gl/GrGLShaderBuilder.h
|
| diff --git a/src/gpu/gl/GrGLShaderBuilder.h b/src/gpu/gl/GrGLShaderBuilder.h
|
| index 9b74b471ec56d48c13191578a0c31aa1e7467f41..2a14a1f6251912fb05aee2dab36637034e71170a 100644
|
| --- a/src/gpu/gl/GrGLShaderBuilder.h
|
| +++ b/src/gpu/gl/GrGLShaderBuilder.h
|
| @@ -33,7 +33,6 @@ public:
|
| typedef GrTAllocator<GrGLShaderVar> VarArray;
|
| typedef GrGLProgramEffects::TextureSampler TextureSampler;
|
| typedef GrGLProgramEffects::TransformedCoordsArray TransformedCoordsArray;
|
| - typedef GrGLProgramDataManager::BuilderUniform BuilderUniform;
|
|
|
| enum ShaderVisibility {
|
| kVertex_Visibility = 0x1,
|
| @@ -44,7 +43,7 @@ public:
|
| typedef GrGLProgramDataManager::UniformHandle UniformHandle;
|
|
|
| // Handles for program uniforms (other than per-effect uniforms)
|
| - struct UniformHandles {
|
| + struct BuiltinUniformHandles {
|
| UniformHandle fViewMatrixUni;
|
| UniformHandle fRTAdjustmentUni;
|
| UniformHandle fColorUni;
|
| @@ -60,42 +59,39 @@ public:
|
| UniformHandle fDstCopySamplerUni;
|
| };
|
|
|
| - struct GenProgramOutput {
|
| - GenProgramOutput()
|
| - : fColorEffects(NULL)
|
| - , fCoverageEffects(NULL)
|
| - , fHasVertexShader(false)
|
| - , fTexCoordSetCnt(0)
|
| - , fProgramID(0) {}
|
| + struct UniformInfo {
|
| + GrGLShaderVar fVariable;
|
| + uint32_t fVisibility;
|
| + GrGLint fLocation;
|
| + };
|
|
|
| - GenProgramOutput(const GenProgramOutput& other) {
|
| - *this = other;
|
| - }
|
| + // This uses an allocator rather than array so that the GrGLShaderVars don't move in memory
|
| + // after they are inserted. Users of GrGLShaderBuilder get refs to the vars and ptrs to their
|
| + // name strings. Otherwise, we'd have to hand out copies.
|
| + typedef GrTAllocator<UniformInfo> UniformInfoArray;
|
|
|
| - GenProgramOutput& operator=(const GenProgramOutput& other) {
|
| - fColorEffects.reset(SkRef(other.fColorEffects.get()));
|
| - fCoverageEffects.reset(SkRef(other.fCoverageEffects.get()));
|
| - fUniformHandles = other.fUniformHandles;
|
| - fHasVertexShader = other.fHasVertexShader;
|
| - fTexCoordSetCnt = other.fTexCoordSetCnt;
|
| - fProgramID = other.fProgramID;
|
| - return *this;
|
| - }
|
| + /** Generates a shader program.
|
| + *
|
| + * The program implements what is specified in the stages given as input.
|
| + * After successful generation, the builder result objects are available
|
| + * to be used.
|
| + * @return true if generation was successful.
|
| + */
|
| + bool genProgram(const GrEffectStage* inColorStages[],
|
| + const GrEffectStage* inCoverageStages[]);
|
|
|
| - SkAutoTUnref<GrGLProgramEffects> fColorEffects;
|
| - SkAutoTUnref<GrGLProgramEffects> fCoverageEffects;
|
| - UniformHandles fUniformHandles;
|
| - bool fHasVertexShader;
|
| - int fTexCoordSetCnt;
|
| - GrGLuint fProgramID;
|
| - };
|
| + // Below are the results of the shader generation.
|
|
|
| - static bool GenProgram(GrGpuGL* gpu,
|
| - GrGLProgramDataManager* pdman,
|
| - const GrGLProgramDesc& desc,
|
| - const GrEffectStage* inColorStages[],
|
| - const GrEffectStage* inCoverageStages[],
|
| - GenProgramOutput* output);
|
| + GrGLProgramEffects* getColorEffects() const { SkASSERT(fProgramID); return fColorEffects.get(); }
|
| + GrGLProgramEffects* getCoverageEffects() const { SkASSERT(fProgramID); return fCoverageEffects.get(); }
|
| + const BuiltinUniformHandles& getBuiltinUniformHandles() const {
|
| + SkASSERT(fProgramID);
|
| + return fUniformHandles;
|
| + }
|
| + GrGLuint getProgramID() const { SkASSERT(fProgramID); return fProgramID; }
|
| + bool hasVertexShader() const { SkASSERT(fProgramID); return fHasVertexShader; }
|
| + int getTexCoordSetCount() const { SkASSERT(fProgramID); return fTexCoordSetCnt; }
|
| + const UniformInfoArray& getUniformInfos() const { return fUniforms; }
|
|
|
| virtual ~GrGLShaderBuilder() {}
|
|
|
| @@ -194,7 +190,7 @@ public:
|
| const char** outName = NULL);
|
|
|
| const GrGLShaderVar& getUniformVariable(GrGLProgramDataManager::UniformHandle u) const {
|
| - return fProgramDataManager->getBuilderUniform(fUniforms, u).fVariable;
|
| + return fUniforms[u.toShaderBuilderIndex()].fVariable;
|
| }
|
|
|
| /**
|
| @@ -241,7 +237,7 @@ public:
|
| };
|
|
|
| protected:
|
| - GrGLShaderBuilder(GrGpuGL*, GrGLProgramDataManager*, const GrGLProgramDesc&);
|
| + GrGLShaderBuilder(GrGpuGL*, const GrGLProgramDesc&);
|
|
|
| GrGpuGL* gpu() const { return fGpu; }
|
|
|
| @@ -264,15 +260,18 @@ protected:
|
|
|
| virtual bool compileAndAttachShaders(GrGLuint programId, SkTDArray<GrGLuint>* shaderIds) const;
|
|
|
| - virtual void bindProgramLocations(GrGLuint programId) const;
|
| + virtual void bindProgramLocations(GrGLuint programId);
|
| + void resolveProgramLocations(GrGLuint programId);
|
|
|
| void appendDecls(const VarArray&, SkString*) const;
|
| void appendUniformDecls(ShaderVisibility, SkString*) const;
|
|
|
| - const GenProgramOutput& getOutput() const { return fOutput; }
|
| -
|
| - GenProgramOutput fOutput;
|
| -
|
| + SkAutoTUnref<GrGLProgramEffects> fColorEffects;
|
| + SkAutoTUnref<GrGLProgramEffects> fCoverageEffects;
|
| + BuiltinUniformHandles fUniformHandles;
|
| + bool fHasVertexShader;
|
| + int fTexCoordSetCnt;
|
| + GrGLuint fProgramID;
|
| private:
|
| class CodeStage : SkNoncopyable {
|
| public:
|
| @@ -325,8 +324,6 @@ private:
|
| const GrEffectStage* fEffectStage;
|
| } fCodeStage;
|
|
|
| - bool genProgram(const GrEffectStage* colorStages[], const GrEffectStage* coverageStages[]);
|
| -
|
| /**
|
| * The base class will emit the fragment code that precedes the per-effect code and then call
|
| * this function. The subclass can use it to insert additional fragment code that should
|
| @@ -395,13 +392,12 @@ private:
|
|
|
| const GrGLProgramDesc& fDesc;
|
| GrGpuGL* fGpu;
|
| - SkAutoTUnref<GrGLProgramDataManager> fProgramDataManager;
|
| uint32_t fFSFeaturesAddedMask;
|
| SkString fFSFunctions;
|
| SkString fFSExtensions;
|
| VarArray fFSInputs;
|
| VarArray fFSOutputs;
|
| - GrGLProgramDataManager::BuilderUniformArray fUniforms;
|
| + UniformInfoArray fUniforms;
|
|
|
| SkString fFSCode;
|
|
|
| @@ -416,7 +412,7 @@ private:
|
|
|
| class GrGLFullShaderBuilder : public GrGLShaderBuilder {
|
| public:
|
| - GrGLFullShaderBuilder(GrGpuGL*, GrGLProgramDataManager*, const GrGLProgramDesc&);
|
| + GrGLFullShaderBuilder(GrGpuGL*, const GrGLProgramDesc&);
|
|
|
| /**
|
| * Called by GrGLEffects to add code to one of the shaders.
|
| @@ -473,7 +469,7 @@ private:
|
| virtual bool compileAndAttachShaders(GrGLuint programId,
|
| SkTDArray<GrGLuint>* shaderIds) const SK_OVERRIDE;
|
|
|
| - virtual void bindProgramLocations(GrGLuint programId) const SK_OVERRIDE;
|
| + virtual void bindProgramLocations(GrGLuint programId) SK_OVERRIDE;
|
|
|
| VarArray fVSAttrs;
|
| VarArray fVSOutputs;
|
| @@ -501,7 +497,7 @@ private:
|
|
|
| class GrGLFragmentOnlyShaderBuilder : public GrGLShaderBuilder {
|
| public:
|
| - GrGLFragmentOnlyShaderBuilder(GrGpuGL*, GrGLProgramDataManager*, const GrGLProgramDesc&);
|
| + GrGLFragmentOnlyShaderBuilder(GrGpuGL*, const GrGLProgramDesc&);
|
|
|
| int addTexCoordSets(int count);
|
|
|
|
|