Make GrGLShaderBuilder produce the shader strings
Review URL: http://codereview.appspot.com/6356089/
git-svn-id: http://skia.googlecode.com/svn/trunk@4544 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp
index 220aed7..d24f2f8 100644
--- a/src/gpu/gl/GrGLShaderBuilder.cpp
+++ b/src/gpu/gl/GrGLShaderBuilder.cpp
@@ -19,7 +19,7 @@
// varying by stage, if we use 1D textures for gradients!
//const int GrGLShaderBuilder::fCoordDims = 2;
-GrGLShaderBuilder::GrGLShaderBuilder()
+GrGLShaderBuilder::GrGLShaderBuilder(const GrGLContextInfo& ctx)
: fVSUnis(kVarsPerBlock)
, fVSAttrs(kVarsPerBlock)
, fVSOutputs(kVarsPerBlock)
@@ -30,7 +30,8 @@
, fFSOutputs(kMaxFSOutputs)
, fUsesGS(false)
, fVaryingDims(0)
- , fComplexCoord(false) {
+ , fComplexCoord(false)
+ , fContext(ctx) {
}
@@ -196,3 +197,47 @@
this->addVarying(type, nameWithStage.c_str(), vsOutName, fsInName);
}
+namespace {
+void append_decls(const GrGLShaderBuilder::VarArray& vars,
+ const GrGLContextInfo& ctx,
+ SkString* string) {
+ for (int i = 0; i < vars.count(); ++i) {
+ vars[i].appendDecl(ctx, string);
+ }
+}
+}
+
+void GrGLShaderBuilder::getShader(ShaderType type, SkString* shaderStr) const {
+ switch (type) {
+ case kVertex_ShaderType:
+ *shaderStr = fHeader;
+ append_decls(fVSUnis, fContext, shaderStr);
+ append_decls(fVSAttrs, fContext, shaderStr);
+ append_decls(fVSOutputs, fContext, shaderStr);
+ shaderStr->append(fVSCode);
+ break;
+ case kGeometry_ShaderType:
+ if (fUsesGS) {
+ *shaderStr = fHeader;
+ shaderStr->append(fGSHeader);
+ append_decls(fGSInputs, fContext, shaderStr);
+ append_decls(fGSOutputs, fContext, shaderStr);
+ shaderStr->append(fGSCode);
+ } else {
+ shaderStr->reset();
+ }
+ break;
+ case kFragment_ShaderType:
+ *shaderStr = fHeader;
+ shaderStr->append(GrGetGLSLShaderPrecisionDecl(fContext.binding()));
+ append_decls(fFSUnis, fContext, shaderStr);
+ append_decls(fFSInputs, fContext, shaderStr);
+ // We shouldn't have declared outputs on 1.10
+ GrAssert(k110_GrGLSLGeneration != fContext.glslGeneration() || fFSOutputs.empty());
+ append_decls(fFSOutputs, fContext, shaderStr);
+ shaderStr->append(fFSFunctions);
+ shaderStr->append(fFSCode);
+ break;
+ }
+
+ }