From e4017d8ca709bc0b4fc0f95c26eb592a8d5c597b Mon Sep 17 00:00:00 2001 From: cdalton Date: Wed, 6 May 2015 11:48:56 -0700 Subject: [PATCH] Add layout qualifiers to GrGLShaderBuilder BUG=skia: Review URL: https://codereview.chromium.org/1114813002 --- src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp | 1 + src/gpu/gl/builders/GrGLShaderBuilder.cpp | 26 +++++++++++++++++++++++ src/gpu/gl/builders/GrGLShaderBuilder.h | 19 +++++++++++++++++ src/gpu/gl/builders/GrGLVertexShaderBuilder.cpp | 1 + 4 files changed, 47 insertions(+) diff --git a/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp b/src/gpu/gl/builders/GrGLFragmentShaderBuilder.cpp index daea878..51a0340 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 c1bc959..e885d36 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& 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* shaderIds) { SkASSERT(!fFinalized); diff --git a/src/gpu/gl/builders/GrGLShaderBuilder.h b/src/gpu/gl/builders/GrGLShaderBuilder.h index 3b06c05..0416dbe 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 20e9f08..f484497 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* 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()); -- 2.7.4