aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/gl/GrGLShaderBuilder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/gl/GrGLShaderBuilder.cpp')
-rw-r--r--src/gpu/gl/GrGLShaderBuilder.cpp80
1 files changed, 80 insertions, 0 deletions
diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp
new file mode 100644
index 0000000000..77ae42536c
--- /dev/null
+++ b/src/gpu/gl/GrGLShaderBuilder.cpp
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2012 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "gl/GrGLShaderBuilder.h"
+
+namespace {
+
+// number of each input/output type in a single allocation block
+static const int sVarsPerBlock = 8;
+
+// except FS outputs where we expect 2 at most.
+static const int sMaxFSOutputs = 2;
+
+}
+
+GrGLShaderBuilder::GrGLShaderBuilder()
+ : fVSUnis(sVarsPerBlock)
+ , fVSAttrs(sVarsPerBlock)
+ , fVSOutputs(sVarsPerBlock)
+ , fGSInputs(sVarsPerBlock)
+ , fGSOutputs(sVarsPerBlock)
+ , fFSInputs(sVarsPerBlock)
+ , fFSUnis(sVarsPerBlock)
+ , fFSOutputs(sMaxFSOutputs)
+ , fUsesGS(false) {
+
+}
+
+void GrGLShaderBuilder::appendVarying(GrSLType type,
+ const char* name,
+ const char** vsOutName,
+ const char** fsInName) {
+ fVSOutputs.push_back();
+ fVSOutputs.back().setType(type);
+ fVSOutputs.back().setTypeModifier(GrGLShaderVar::kOut_TypeModifier);
+ fVSOutputs.back().accessName()->printf("v%s", name);
+ if (vsOutName) {
+ *vsOutName = fVSOutputs.back().getName().c_str();
+ }
+ // input to FS comes either from VS or GS
+ const GrStringBuilder* fsName;
+ if (fUsesGS) {
+ // if we have a GS take each varying in as an array
+ // and output as non-array.
+ fGSInputs.push_back();
+ fGSInputs.back().setType(type);
+ fGSInputs.back().setTypeModifier(GrGLShaderVar::kIn_TypeModifier);
+ fGSInputs.back().setUnsizedArray();
+ *fGSInputs.back().accessName() = fVSOutputs.back().getName();
+ fGSOutputs.push_back();
+ fGSOutputs.back().setType(type);
+ fGSOutputs.back().setTypeModifier(GrGLShaderVar::kOut_TypeModifier);
+ fGSOutputs.back().accessName()->printf("g%s", name);
+ fsName = fGSOutputs.back().accessName();
+ } else {
+ fsName = fVSOutputs.back().accessName();
+ }
+ fFSInputs.push_back();
+ fFSInputs.back().setType(type);
+ fFSInputs.back().setTypeModifier(GrGLShaderVar::kIn_TypeModifier);
+ fFSInputs.back().setName(*fsName);
+ if (fsInName) {
+ *fsInName = fsName->c_str();
+ }
+}
+
+
+void GrGLShaderBuilder::appendVarying(GrSLType type,
+ const char* name,
+ int stageNum,
+ const char** vsOutName,
+ const char** fsInName) {
+ GrStringBuilder nameWithStage(name);
+ nameWithStage.appendS32(stageNum);
+ this->appendVarying(type, nameWithStage.c_str(), vsOutName, fsInName);
+}