| Index: src/gpu/gl/GrGLShaderBuilder.h
|
| diff --git a/src/gpu/gl/GrGLShaderBuilder.h b/src/gpu/gl/GrGLShaderBuilder.h
|
| index ad0d87ef31bffd8c5e3cc45a1ec491f313c75412..28f1b3822aeaff279efae2777325bb132ff45d88 100644
|
| --- a/src/gpu/gl/GrGLShaderBuilder.h
|
| +++ b/src/gpu/gl/GrGLShaderBuilder.h
|
| @@ -96,6 +96,7 @@ public:
|
| };
|
|
|
| typedef SkTArray<TextureSampler> TextureSamplerArray;
|
| + typedef GrTAllocator<GrGLShaderVar> VarArray;
|
|
|
| enum ShaderVisibility {
|
| kVertex_Visibility = 0x1,
|
| @@ -103,7 +104,10 @@ public:
|
| kFragment_Visibility = 0x4,
|
| };
|
|
|
| - GrGLShaderBuilder(const GrGLContextInfo&, GrGLUniformManager&, const GrGLProgramDesc&);
|
| + GrGLShaderBuilder(const GrGLContextInfo&,
|
| + GrGLUniformManager&,
|
| + const GrGLProgramDesc&,
|
| + bool needsVertexShader);
|
|
|
| /**
|
| * Use of these features may require a GLSL extension to be enabled. Shaders may not compile
|
| @@ -122,22 +126,8 @@ public:
|
| bool enableFeature(GLSLFeature);
|
|
|
| /**
|
| - * Called by GrGLEffects to add code to one of the shaders.
|
| + * Called by GrGLEffects to add code the fragment shader.
|
| */
|
| - void vsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) {
|
| - va_list args;
|
| - va_start(args, format);
|
| - fVSCode.appendf(format, args);
|
| - 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 fsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) {
|
| va_list args;
|
| va_start(args, format);
|
| @@ -145,8 +135,6 @@ public:
|
| va_end(args);
|
| }
|
|
|
| - void vsCodeAppend(const char* str) { fVSCode.append(str); }
|
| - void gsCodeAppend(const char* str) { fGSCode.append(str); }
|
| void fsCodeAppend(const char* str) { fFSCode.append(str); }
|
|
|
| /** Appends a 2D texture sample with projection if necessary. coordType must either be Vec2f or
|
| @@ -180,6 +168,12 @@ public:
|
| const char* body,
|
| SkString* outName);
|
|
|
| + /** 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
|
| have multiple representations, based on the type/format of textures used. */
|
| @@ -233,50 +227,22 @@ public:
|
| return this->getUniformVariable(u).c_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. */
|
| - bool addAttribute(GrSLType type, const char* name);
|
| -
|
| - /** Add a varying variable to the current program to pass values between vertex and fragment
|
| - shaders. If the last two parameters are non-NULL, they are filled in with the name
|
| - generated. */
|
| - void addVarying(GrSLType type,
|
| - const char* name,
|
| - const char** vsOutName = NULL,
|
| - const char** fsInName = NULL);
|
| -
|
| /** Returns a variable name that represents the position of the fragment in the FS. The position
|
| is in device space (e.g. 0,0 is the top left and pixel centers are at half-integers). */
|
| const char* fragmentPosition();
|
|
|
| - /** Returns a vertex attribute that represents the vertex position in the VS. This is the
|
| - pre-matrix position and is commonly used by effects to compute texture coords via a matrix.
|
| - */
|
| - const GrGLShaderVar& positionAttribute() const { return *fPositionVar; }
|
| -
|
| - /** Returns a vertex attribute that represents the local coords in the VS. This may be the same
|
| - as positionAttribute() or it may not be. It depends upon whether the rendering code
|
| - specified explicit local coords or not in the GrDrawState. */
|
| - const GrGLShaderVar& localCoordsAttribute() const { return *fLocalCoordsVar; }
|
| -
|
| /** Returns the color of the destination pixel. This may be NULL if no effect advertised
|
| that it will read the destination. */
|
| const char* dstColor();
|
|
|
| /**
|
| - * Are explicit local coordinates provided as input to the vertex shader.
|
| - */
|
| - bool hasExplicitLocalCoords() const { return (fLocalCoordsVar != fPositionVar); }
|
| -
|
| - /**
|
| * 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.
|
| */
|
|
|
| - /** Called after building is complete to get the final shader string. */
|
| - void vsGetShader(SkString*) const;
|
| - void gsGetShader(SkString*) const;
|
| + /** 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;
|
|
|
| /**
|
| @@ -309,17 +275,103 @@ public:
|
| return fDstCopySampler.fSamplerUniform;
|
| }
|
|
|
| - struct AttributePair {
|
| - void set(int index, const SkString& name) {
|
| - fIndex = index; fName = name;
|
| + /** Helper class used to build the vertex and geometry shaders. This functionality
|
| + is kept separate from the rest of GrGLShaderBuilder to allow for shaders programs
|
| + that only use the fragment shader. */
|
| + class VertexBuilder {
|
| + public:
|
| + VertexBuilder(GrGLShaderBuilder* parent, const GrGLProgramDesc&);
|
| +
|
| + /**
|
| + * Called by GrGLEffects to add code to one of the shaders.
|
| + */
|
| + void vsCodeAppendf(const char format[], ...) SK_PRINTF_LIKE(2, 3) {
|
| + va_list args;
|
| + va_start(args, format);
|
| + fVSCode.appendf(format, args);
|
| + 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. */
|
| + bool addAttribute(GrSLType type, const char* name);
|
| +
|
| + /** Add a varying variable to the current program to pass values between vertex and fragment
|
| + shaders. If the last two parameters are non-NULL, they are filled in with the name
|
| + generated. */
|
| + void addVarying(GrSLType type,
|
| + const char* name,
|
| + const char** vsOutName = NULL,
|
| + const char** fsInName = NULL);
|
| +
|
| + /** Returns a vertex attribute that represents the vertex position in the VS. This is the
|
| + pre-matrix position and is commonly used by effects to compute texture coords via a matrix.
|
| + */
|
| + const GrGLShaderVar& positionAttribute() const { return *fPositionVar; }
|
| +
|
| + /** Returns a vertex attribute that represents the local coords in the VS. This may be the same
|
| + as positionAttribute() or it may not be. It depends upon whether the rendering code
|
| + specified explicit local coords or not in the GrDrawState. */
|
| + const GrGLShaderVar& localCoordsAttribute() const { return *fLocalCoordsVar; }
|
| +
|
| + /**
|
| + * Are explicit local coordinates provided as input to the vertex shader.
|
| + */
|
| + 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;
|
| }
|
| - int fIndex;
|
| - SkString fName;
|
| + bool addEffectAttribute(int attributeIndex, GrSLType type, const SkString& name);
|
| + const SkString* getEffectAttributeName(int attributeIndex) const;
|
| +
|
| + // TODO: Everything below here private.
|
| + public:
|
| +
|
| + VarArray fVSAttrs;
|
| + VarArray fVSOutputs;
|
| + VarArray fGSInputs;
|
| + VarArray fGSOutputs;
|
| + SkString fGSHeader; // layout qualifiers specific to GS
|
| +
|
| + private:
|
| + GrGLShaderBuilder* fParent;
|
| +
|
| + bool fUsesGS;
|
| +
|
| + SkString fVSCode;
|
| + SkString fGSCode;
|
| +
|
| + SkSTArray<10, AttributePair, true> fEffectAttributes;
|
| +
|
| + GrGLShaderVar* fPositionVar;
|
| + GrGLShaderVar* fLocalCoordsVar;
|
| };
|
| - const SkTArray<AttributePair, true>& getEffectAttributes() const {
|
| - return fEffectAttributes;
|
| - }
|
| - const SkString* getEffectAttributeName(int attributeIndex) const;
|
| +
|
| + /** Gets the vertex builder that is used to construct the vertex and geometry shaders.
|
| + 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);
|
| @@ -327,25 +379,12 @@ public:
|
| const GrGLContextInfo& ctxInfo() const { return fCtxInfo; }
|
|
|
| private:
|
| - typedef GrTAllocator<GrGLShaderVar> VarArray;
|
| -
|
| void appendDecls(const VarArray&, SkString*) const;
|
| void appendUniformDecls(ShaderVisibility, SkString*) const;
|
|
|
| typedef GrGLUniformManager::BuilderUniform BuilderUniform;
|
| GrGLUniformManager::BuilderUniformArray fUniforms;
|
|
|
| - // TODO: Everything below here private.
|
| -public:
|
| -
|
| - VarArray fVSAttrs;
|
| - VarArray fVSOutputs;
|
| - VarArray fGSInputs;
|
| - VarArray fGSOutputs;
|
| - VarArray fFSInputs;
|
| - SkString fGSHeader; // layout qualifiers specific to GS
|
| - VarArray fFSOutputs;
|
| -
|
| private:
|
| class CodeStage : GrNoncopyable {
|
| public:
|
| @@ -436,12 +475,10 @@ private:
|
| uint32_t fFSFeaturesAddedMask;
|
| SkString fFSFunctions;
|
| SkString fFSExtensions;
|
| -
|
| - bool fUsesGS;
|
| + VarArray fFSInputs;
|
| + VarArray fFSOutputs;
|
|
|
| SkString fFSCode;
|
| - SkString fVSCode;
|
| - SkString fGSCode;
|
|
|
| bool fSetupFragPosition;
|
| TextureSampler fDstCopySampler;
|
| @@ -452,11 +489,7 @@ private:
|
|
|
| bool fTopLeftFragPosRead;
|
|
|
| - SkSTArray<10, AttributePair, true> fEffectAttributes;
|
| -
|
| - GrGLShaderVar* fPositionVar;
|
| - GrGLShaderVar* fLocalCoordsVar;
|
| -
|
| + SkAutoTDelete<VertexBuilder> fVertexBuilder;
|
| };
|
|
|
| #endif
|
|
|