| Index: src/gpu/gl/GrGLShaderBuilder.h
|
| diff --git a/src/gpu/gl/GrGLShaderBuilder.h b/src/gpu/gl/GrGLShaderBuilder.h
|
| index 3c3275ce369246e7c5f701597adc90bb267ab777..d73a731a7cd9aaf52d7518d5dfb66413553740b8 100644
|
| --- a/src/gpu/gl/GrGLShaderBuilder.h
|
| +++ b/src/gpu/gl/GrGLShaderBuilder.h
|
| @@ -105,7 +105,7 @@ public:
|
| kFragment_Visibility = 0x4,
|
| };
|
|
|
| - GrGLShaderBuilder(const GrGLContextInfo&,
|
| + GrGLShaderBuilder(GrGpuGL*,
|
| GrGLUniformManager&,
|
| const GrGLProgramDesc&,
|
| bool needsVertexShader);
|
| @@ -171,9 +171,6 @@ public:
|
|
|
| /** Add input/output variable declarations (i.e. 'varying') to the fragment shader. */
|
| GrGLShaderVar& fsInputAppend() { return fFSInputs.push_back(); }
|
| - GrGLShaderVar& fsOutputAppend() { return fFSOutputs.push_back(); }
|
| - GrGLShaderVar& fsInputAppend(const GrGLShaderVar& var) { return fFSInputs.push_back(var); }
|
| - GrGLShaderVar& fsOutputAppend(const GrGLShaderVar& var) { return fFSOutputs.push_back(var); }
|
|
|
| /** Generates a EffectKey for the shader code based on the texture access parameters and the
|
| capabilities of the GL context. This is useful for keying the shader programs that may
|
| @@ -238,13 +235,13 @@ public:
|
|
|
| /**
|
| * Interfaces used by GrGLProgram.
|
| - * TODO: Hide these from the GrEffects using friend or splitting this into two related classes.
|
| - * Also, GrGLProgram's shader string construction should be moved to this class.
|
| + * TODO: These are used by GrGLProgram to insert a mode color filter. Remove these when the
|
| + * color filter is expressed as a GrEffect.
|
| */
|
| -
|
| - /** Called after building is complete to get the final shader string. To acces the vertex
|
| - and geometry shaders, use the VertexBuilder. */
|
| - void fsGetShader(SkString*) const;
|
| + const SkString& getInputColor() const { return fInputColor; }
|
| + GrSLConstantVec getKnownColorValue() const { return fKnownColorValue; }
|
| + const SkString& getInputCoverage() const { return fInputCoverage; }
|
| + GrSLConstantVec getKnownCoverageValue() const { return fKnownCoverageValue; }
|
|
|
| /**
|
| * Adds code for effects. effectStages contains the effects to add. effectKeys[i] is the key
|
| @@ -265,6 +262,9 @@ public:
|
| SkTArray<GrGLUniformManager::UniformHandle, true>* effectSamplerHandles[],
|
| GrGLEffect* glEffects[]);
|
|
|
| + const char* getColorOutputName() const;
|
| + const char* enableSecondaryOutput();
|
| +
|
| GrGLUniformManager::UniformHandle getRTHeightUniform() const { return fRTHeightUniform; }
|
| GrGLUniformManager::UniformHandle getDstCopyTopLeftUniform() const {
|
| return fDstCopyTopLeftUniform;
|
| @@ -272,6 +272,8 @@ public:
|
| GrGLUniformManager::UniformHandle getDstCopyScaleUniform() const {
|
| return fDstCopyScaleUniform;
|
| }
|
| + GrGLUniformManager::UniformHandle getColorUniform() const { return fColorUniform; }
|
| + GrGLUniformManager::UniformHandle getCoverageUniform() const { return fCoverageUniform; }
|
| GrGLUniformManager::UniformHandle getDstCopySamplerUniform() const {
|
| return fDstCopySampler.fSamplerUniform;
|
| }
|
| @@ -281,7 +283,7 @@ public:
|
| that only use the fragment shader. */
|
| class VertexBuilder {
|
| public:
|
| - VertexBuilder(GrGLShaderBuilder* parent, const GrGLProgramDesc&);
|
| + VertexBuilder(GrGLShaderBuilder* parent, GrGpuGL* gpu, const GrGLProgramDesc&);
|
|
|
| /**
|
| * Called by GrGLEffects to add code to one of the shaders.
|
| @@ -293,15 +295,7 @@ public:
|
| va_end(args);
|
| }
|
|
|
| - void gsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) {
|
| - va_list args;
|
| - va_start(args, format);
|
| - fGSCode.appendf(format, args);
|
| - va_end(args);
|
| - }
|
| -
|
| void vsCodeAppend(const char* str) { fVSCode.append(str); }
|
| - void gsCodeAppend(const char* str) { fGSCode.append(str); }
|
|
|
| /** Add a vertex attribute to the current program that is passed in from the vertex data.
|
| Returns false if the attribute was already there, true otherwise. */
|
| @@ -330,42 +324,38 @@ public:
|
| */
|
| bool hasExplicitLocalCoords() const { return (fLocalCoordsVar != fPositionVar); }
|
|
|
| - /** Called after building is complete to get the final shader string. */
|
| - void vsGetShader(SkString*) const;
|
| - void gsGetShader(SkString*) const;
|
| -
|
| - struct AttributePair {
|
| - void set(int index, const SkString& name) {
|
| - fIndex = index; fName = name;
|
| - }
|
| - int fIndex;
|
| - SkString fName;
|
| - };
|
| - const SkTArray<AttributePair, true>& getEffectAttributes() const {
|
| - return fEffectAttributes;
|
| - }
|
| bool addEffectAttribute(int attributeIndex, GrSLType type, const SkString& name);
|
| const SkString* getEffectAttributeName(int attributeIndex) const;
|
|
|
| - // TODO: Everything below here private.
|
| - public:
|
| + GrGLUniformManager::UniformHandle getViewMatrixUniform() const {
|
| + return fViewMatrixUniform;
|
| + }
|
|
|
| - VarArray fVSAttrs;
|
| - VarArray fVSOutputs;
|
| - VarArray fGSInputs;
|
| - VarArray fGSOutputs;
|
| - SkString fGSHeader; // layout qualifiers specific to GS
|
| + bool compileAndAttachShaders(GrGLuint programId) const;
|
| + void bindProgramLocations(GrGLuint programId) const;
|
|
|
| private:
|
| GrGLShaderBuilder* fParent;
|
| -
|
| - bool fUsesGS;
|
| + GrGpuGL* fGpu;
|
| + const GrGLProgramDesc& fDesc;
|
| + VarArray fVSAttrs;
|
| + VarArray fVSOutputs;
|
| + VarArray fGSInputs;
|
| + VarArray fGSOutputs;
|
|
|
| SkString fVSCode;
|
| - SkString fGSCode;
|
|
|
| + struct AttributePair {
|
| + void set(int index, const SkString& name) {
|
| + fIndex = index; fName = name;
|
| + }
|
| + int fIndex;
|
| + SkString fName;
|
| + };
|
| SkSTArray<10, AttributePair, true> fEffectAttributes;
|
|
|
| + GrGLUniformManager::UniformHandle fViewMatrixUniform;
|
| +
|
| GrGLShaderVar* fPositionVar;
|
| GrGLShaderVar* fLocalCoordsVar;
|
| };
|
| @@ -374,15 +364,17 @@ public:
|
| It may be NULL if this shader program is only meant to have a fragment shader. */
|
| VertexBuilder* getVertexBuilder() const { return fVertexBuilder.get(); }
|
|
|
| - // TODO: Make this do all the compiling, linking, etc.
|
| - void finished(GrGLuint programID);
|
| + bool finish(GrGLuint* outProgramId);
|
|
|
| - const GrGLContextInfo& ctxInfo() const { return fCtxInfo; }
|
| + const GrGLContextInfo& ctxInfo() const;
|
|
|
| private:
|
| void appendDecls(const VarArray&, SkString*) const;
|
| void appendUniformDecls(ShaderVisibility, SkString*) const;
|
|
|
| + bool compileAndAttachShaders(GrGLuint programId) const;
|
| + void bindProgramLocations(GrGLuint programId) const;
|
| +
|
| typedef GrGLUniformManager::BuilderUniform BuilderUniform;
|
| GrGLUniformManager::BuilderUniformArray fUniforms;
|
|
|
| @@ -471,7 +463,7 @@ private:
|
| kBottomLeftFragPosRead_FragPosKey = 0x2,// Read frag pos relative to bottom-left.
|
| };
|
|
|
| - const GrGLContextInfo& fCtxInfo;
|
| + GrGpuGL* fGpu;
|
| GrGLUniformManager& fUniformManager;
|
| uint32_t fFSFeaturesAddedMask;
|
| SkString fFSFunctions;
|
| @@ -484,13 +476,23 @@ private:
|
| bool fSetupFragPosition;
|
| TextureSampler fDstCopySampler;
|
|
|
| + SkString fInputColor;
|
| + GrSLConstantVec fKnownColorValue;
|
| + SkString fInputCoverage;
|
| + GrSLConstantVec fKnownCoverageValue;
|
| +
|
| + bool fHasCustomColorOutput;
|
| + bool fHasSecondaryOutput;
|
| +
|
| GrGLUniformManager::UniformHandle fRTHeightUniform;
|
| GrGLUniformManager::UniformHandle fDstCopyTopLeftUniform;
|
| GrGLUniformManager::UniformHandle fDstCopyScaleUniform;
|
| + GrGLUniformManager::UniformHandle fColorUniform;
|
| + GrGLUniformManager::UniformHandle fCoverageUniform;
|
|
|
| bool fTopLeftFragPosRead;
|
|
|
| - SkAutoTDelete<VertexBuilder> fVertexBuilder;
|
| + SkAutoTDelete<VertexBuilder> fVertexBuilder;
|
| };
|
|
|
| #endif
|
|
|