diff options
-rw-r--r-- | src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp | 1 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLShaderBuilder.cpp | 26 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLShaderBuilder.h | 19 | ||||
-rw-r--r-- | src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp | 1 |
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()); |