Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(357)

Unified Diff: src/gpu/gl/GrGLShaderBuilder.h

Issue 23533066: Move the GL shader compilation step into GrGLShaderBuilder (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gpu/gl/GrGLSL.cpp ('k') | src/gpu/gl/GrGLShaderBuilder.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « src/gpu/gl/GrGLSL.cpp ('k') | src/gpu/gl/GrGLShaderBuilder.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698