aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/gl/builders
diff options
context:
space:
mode:
authorGravatar cdalton <cdalton@nvidia.com>2015-05-06 11:48:56 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2015-05-06 11:48:56 -0700
commite4017d8ca709bc0b4fc0f95c26eb592a8d5c597b (patch)
treee11df5411dc833aabdfb4e63730f774feda57573 /src/gpu/gl/builders
parent6fbf4b3a7f0a3304649c482ab0a911dc147a6825 (diff)
Add layout qualifiers to GrGLShaderBuilder
Diffstat (limited to 'src/gpu/gl/builders')
-rw-r--r--src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp1
-rw-r--r--src/gpu/gl/builders/GrGLShaderBuilder.cpp26
-rw-r--r--src/gpu/gl/builders/GrGLShaderBuilder.h19
-rw-r--r--src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp1
4 files changed, 47 insertions, 0 deletions
diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
index daea878b26..51a0340ea9 100644
--- a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
@@ -215,6 +215,7 @@ bool GrGLFragmentShaderBuilder::compileAndAttachShaders(GrGLuint programId,
append_default_precision_qualifier(kDefault_GrSLPrecision,
gpu->glStandard(),
&this->precisionQualifier());
+ this->compileAndAppendLayoutQualifiers();
fProgramBuilder->appendUniformDecls(GrGLProgramBuilder::kFragment_Visibility,
&this->uniforms());
this->appendDecls(fInputs, &this->inputs());
diff --git a/src/gpu/gl/builders/GrGLShaderBuilder.cpp b/src/gpu/gl/builders/GrGLShaderBuilder.cpp
index c1bc959709..e885d36a43 100644
--- a/src/gpu/gl/builders/GrGLShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLShaderBuilder.cpp
@@ -172,6 +172,32 @@ void GrGLShaderBuilder::appendTextureLookup(const char* samplerName,
kVec2f_GrSLType);
}
+void GrGLShaderBuilder::addLayoutQualifier(const char* param, InterfaceQualifier interface) {
+ SkASSERT(fProgramBuilder->gpu()->glslGeneration() >= k330_GrGLSLGeneration);
+ fLayoutParams[interface].push_back() = param;
+}
+
+void GrGLShaderBuilder::compileAndAppendLayoutQualifiers() {
+ static const char* interfaceQualifierNames[] = {
+ "out"
+ };
+
+ for (int interface = 0; interface <= kLastInterfaceQualifier; ++interface) {
+ const SkTArray<SkString>& params = fLayoutParams[interface];
+ if (params.empty()) {
+ continue;
+ }
+ this->layoutQualifiers().appendf("layout(%s", params[0].c_str());
+ for (int i = 1; i < params.count(); ++i) {
+ this->layoutQualifiers().appendf(", %s", params[i].c_str());
+ }
+ this->layoutQualifiers().appendf(") %s;\n", interfaceQualifierNames[interface]);
+ }
+
+ GR_STATIC_ASSERT(0 == GrGLShaderBuilder::kOut_InterfaceQualifier);
+ GR_STATIC_ASSERT(SK_ARRAY_COUNT(interfaceQualifierNames) == kLastInterfaceQualifier + 1);
+}
+
bool
GrGLShaderBuilder::finalize(GrGLuint programId, GrGLenum type, SkTDArray<GrGLuint>* shaderIds) {
SkASSERT(!fFinalized);
diff --git a/src/gpu/gl/builders/GrGLShaderBuilder.h b/src/gpu/gl/builders/GrGLShaderBuilder.h
index 3b06c05a00..0416dbeab6 100644
--- a/src/gpu/gl/builders/GrGLShaderBuilder.h
+++ b/src/gpu/gl/builders/GrGLShaderBuilder.h
@@ -139,6 +139,22 @@ protected:
*/
void addFeature(uint32_t featureBit, const char* extensionName);
+ enum InterfaceQualifier {
+ kOut_InterfaceQualifier,
+ kLastInterfaceQualifier = kOut_InterfaceQualifier
+ };
+
+ /*
+ * A low level function to build default layout qualifiers.
+ *
+ * e.g. layout(param1, param2, ...) out;
+ *
+ * GLSL allows default layout qualifiers for in, out, and uniform.
+ */
+ void addLayoutQualifier(const char* param, InterfaceQualifier);
+
+ void compileAndAppendLayoutQualifiers();
+
void nextStage() {
fShaderStrings.push_back();
fCompilerStrings.push_back(this->code().c_str());
@@ -149,6 +165,7 @@ protected:
SkString& versionDecl() { return fShaderStrings[kVersionDecl]; }
SkString& extensions() { return fShaderStrings[kExtensions]; }
SkString& precisionQualifier() { return fShaderStrings[kPrecisionQualifier]; }
+ SkString& layoutQualifiers() { return fShaderStrings[kLayoutQualifiers]; }
SkString& uniforms() { return fShaderStrings[kUniforms]; }
SkString& inputs() { return fShaderStrings[kInputs]; }
SkString& outputs() { return fShaderStrings[kOutputs]; }
@@ -161,6 +178,7 @@ protected:
kVersionDecl,
kExtensions,
kPrecisionQualifier,
+ kLayoutQualifiers,
kUniforms,
kInputs,
kOutputs,
@@ -180,6 +198,7 @@ protected:
VarArray fInputs;
VarArray fOutputs;
uint32_t fFeaturesAddedMask;
+ SkSTArray<1, SkString> fLayoutParams[kLastInterfaceQualifier + 1];
int fCodeIndex;
bool fFinalized;
diff --git a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
index 20e9f0861a..f484497954 100644
--- a/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
+++ b/src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp
@@ -81,6 +81,7 @@ void GrGLVertexBuilder::bindVertexAttributes(GrGLuint programID) {
bool
GrGLVertexBuilder::compileAndAttachShaders(GrGLuint programId, SkTDArray<GrGLuint>* shaderIds) {
this->versionDecl() = GrGetGLSLVersionDecl(fProgramBuilder->ctxInfo());
+ this->compileAndAppendLayoutQualifiers();
fProgramBuilder->appendUniformDecls(GrGLProgramBuilder::kVertex_Visibility, &this->uniforms());
this->appendDecls(fInputs, &this->inputs());
this->appendDecls(fOutputs, &this->outputs());