Add layout qualifiers to GrGLShaderBuilder
authorcdalton <cdalton@nvidia.com>
Wed, 6 May 2015 18:48:56 +0000 (11:48 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 6 May 2015 18:48:56 +0000 (11:48 -0700)
BUG=skia:

Review URL: https://codereview.chromium.org/1114813002

src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp
src/gpu/gl/builders/GrGLShaderBuilder.cpp
src/gpu/gl/builders/GrGLShaderBuilder.h
src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp

index daea878..51a0340 100644 (file)
@@ -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());
index c1bc959..e885d36 100644 (file)
@@ -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);
index 3b06c05..0416dbe 100644 (file)
@@ -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;
 
index 20e9f08..f484497 100644 (file)
@@ -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());