| Index: src/gpu/gl/GrGLShaderBuilder.cpp
|
| diff --git a/src/gpu/gl/GrGLShaderBuilder.cpp b/src/gpu/gl/GrGLShaderBuilder.cpp
|
| index 9ac4645ee0896e857567912693be49876c8be2b8..2554142583986fda859531fbf73f493bc5e92b3b 100644
|
| --- a/src/gpu/gl/GrGLShaderBuilder.cpp
|
| +++ b/src/gpu/gl/GrGLShaderBuilder.cpp
|
| @@ -138,11 +138,11 @@ GrGLShaderBuilder::GrGLShaderBuilder(const GrGLContextInfo& ctxInfo,
|
| }
|
| fDstCopySampler.init(this, configMask, "rgba", 0);
|
|
|
| - fDstCopyTopLeftUniform = this->addUniform(kFragment_ShaderType,
|
| + fDstCopyTopLeftUniform = this->addUniform(kFragment_Visibility,
|
| kVec2f_GrSLType,
|
| "DstCopyUpperLeft",
|
| &dstCopyTopLeftName);
|
| - fDstCopyScaleUniform = this->addUniform(kFragment_ShaderType,
|
| + fDstCopyScaleUniform = this->addUniform(kFragment_Visibility,
|
| kVec2f_GrSLType,
|
| "DstCopyCoordScale",
|
| &dstCopyCoordScaleName);
|
| @@ -154,7 +154,7 @@ GrGLShaderBuilder::GrGLShaderBuilder(const GrGLContextInfo& ctxInfo,
|
| this->fsCodeAppend("\t_dstTexCoord.y = 1.0 - _dstTexCoord.y;\n");
|
| }
|
| this->fsCodeAppendf("\tvec4 %s = ", kDstCopyColorName);
|
| - this->appendTextureLookup(kFragment_ShaderType, fDstCopySampler, "_dstTexCoord");
|
| + this->fsAppendTextureLookup(fDstCopySampler, "_dstTexCoord");
|
| this->fsCodeAppend(";\n\n");
|
| }
|
| }
|
| @@ -253,42 +253,6 @@ const char* GrGLShaderBuilder::dstColor() {
|
| }
|
| }
|
|
|
| -void GrGLShaderBuilder::codeAppendf(ShaderType type, const char format[], va_list args) {
|
| - SkString* string = NULL;
|
| - switch (type) {
|
| - case kVertex_ShaderType:
|
| - string = &fVSCode;
|
| - break;
|
| - case kGeometry_ShaderType:
|
| - string = &fGSCode;
|
| - break;
|
| - case kFragment_ShaderType:
|
| - string = &fFSCode;
|
| - break;
|
| - default:
|
| - GrCrash("Invalid shader type");
|
| - }
|
| - string->appendf(format, args);
|
| -}
|
| -
|
| -void GrGLShaderBuilder::codeAppend(ShaderType type, const char* str) {
|
| - SkString* string = NULL;
|
| - switch (type) {
|
| - case kVertex_ShaderType:
|
| - string = &fVSCode;
|
| - break;
|
| - case kGeometry_ShaderType:
|
| - string = &fGSCode;
|
| - break;
|
| - case kFragment_ShaderType:
|
| - string = &fFSCode;
|
| - break;
|
| - default:
|
| - GrCrash("Invalid shader type");
|
| - }
|
| - string->append(str);
|
| -}
|
| -
|
| void GrGLShaderBuilder::appendTextureLookup(SkString* out,
|
| const GrGLShaderBuilder::TextureSampler& sampler,
|
| const char* coordName,
|
| @@ -302,21 +266,17 @@ void GrGLShaderBuilder::appendTextureLookup(SkString* out,
|
| append_swizzle(out, sampler, *fCtxInfo.caps());
|
| }
|
|
|
| -void GrGLShaderBuilder::appendTextureLookup(ShaderType type,
|
| - const GrGLShaderBuilder::TextureSampler& sampler,
|
| - const char* coordName,
|
| - GrSLType varyingType) {
|
| - SkASSERT(kFragment_ShaderType == type);
|
| +void GrGLShaderBuilder::fsAppendTextureLookup(const GrGLShaderBuilder::TextureSampler& sampler,
|
| + const char* coordName,
|
| + GrSLType varyingType) {
|
| this->appendTextureLookup(&fFSCode, sampler, coordName, varyingType);
|
| }
|
|
|
| -void GrGLShaderBuilder::appendTextureLookupAndModulate(
|
| - ShaderType type,
|
| +void GrGLShaderBuilder::fsAppendTextureLookupAndModulate(
|
| const char* modulation,
|
| const GrGLShaderBuilder::TextureSampler& sampler,
|
| const char* coordName,
|
| GrSLType varyingType) {
|
| - SkASSERT(kFragment_ShaderType == type);
|
| SkString lookup;
|
| this->appendTextureLookup(&lookup, sampler, coordName, varyingType);
|
| GrGLSLModulatef<4>(&fFSCode, modulation, lookup.c_str());
|
| @@ -383,7 +343,7 @@ GrGLUniformManager::UniformHandle GrGLShaderBuilder::addUniformArray(uint32_t vi
|
| int count,
|
| const char** outName) {
|
| SkASSERT(name && strlen(name));
|
| - SkDEBUGCODE(static const uint32_t kVisibilityMask = kVertex_ShaderType | kFragment_ShaderType);
|
| + SkDEBUGCODE(static const uint32_t kVisibilityMask = kVertex_Visibility | kFragment_Visibility);
|
| SkASSERT(0 == (~kVisibilityMask & visibility));
|
| SkASSERT(0 != visibility);
|
|
|
| @@ -403,7 +363,7 @@ GrGLUniformManager::UniformHandle GrGLShaderBuilder::addUniformArray(uint32_t vi
|
| // If it is visible in both the VS and FS, the precision must match.
|
| // We declare a default FS precision, but not a default VS. So set the var
|
| // to use the default FS precision.
|
| - if ((kVertex_ShaderType | kFragment_ShaderType) == visibility) {
|
| + if ((kVertex_Visibility | kFragment_Visibility) == visibility) {
|
| // the fragment and vertex precisions must match
|
| uni.fVariable.setPrecision(kDefaultFragmentPrecision);
|
| }
|
| @@ -508,7 +468,7 @@ const char* GrGLShaderBuilder::fragmentPosition() {
|
| SkASSERT(!fRTHeightUniform.isValid());
|
| const char* rtHeightName;
|
|
|
| - fRTHeightUniform = this->addUniform(kFragment_ShaderType,
|
| + fRTHeightUniform = this->addUniform(kFragment_Visibility,
|
| kFloat_GrSLType,
|
| "RTHeight",
|
| &rtHeightName);
|
| @@ -523,14 +483,12 @@ const char* GrGLShaderBuilder::fragmentPosition() {
|
| }
|
|
|
|
|
| -void GrGLShaderBuilder::emitFunction(ShaderType shader,
|
| - GrSLType returnType,
|
| - const char* name,
|
| - int argCnt,
|
| - const GrGLShaderVar* args,
|
| - const char* body,
|
| - SkString* outName) {
|
| - SkASSERT(kFragment_ShaderType == shader);
|
| +void GrGLShaderBuilder::fsEmitFunction(GrSLType returnType,
|
| + const char* name,
|
| + int argCnt,
|
| + const GrGLShaderVar* args,
|
| + const char* body,
|
| + SkString* outName) {
|
| fFSFunctions.append(GrGLSLTypeString(returnType));
|
| this->nameVariable(outName, '\0', name);
|
| fFSFunctions.appendf(" %s", outName->c_str());
|
| @@ -579,59 +537,57 @@ void GrGLShaderBuilder::appendDecls(const VarArray& vars, SkString* out) const {
|
| }
|
| }
|
|
|
| -void GrGLShaderBuilder::appendUniformDecls(ShaderType stype, SkString* out) const {
|
| +void GrGLShaderBuilder::appendUniformDecls(ShaderVisibility visibility,
|
| + SkString* out) const {
|
| for (int i = 0; i < fUniforms.count(); ++i) {
|
| - if (fUniforms[i].fVisibility & stype) {
|
| + if (fUniforms[i].fVisibility & visibility) {
|
| fUniforms[i].fVariable.appendDecl(fCtxInfo, out);
|
| out->append(";\n");
|
| }
|
| }
|
| }
|
|
|
| -void GrGLShaderBuilder::getShader(ShaderType type, SkString* shaderStr) const {
|
| - const char* version = GrGetGLSLVersionDecl(fCtxInfo);
|
| -
|
| - switch (type) {
|
| - case kVertex_ShaderType:
|
| - *shaderStr = version;
|
| - this->appendUniformDecls(kVertex_ShaderType, shaderStr);
|
| - this->appendDecls(fVSAttrs, shaderStr);
|
| - this->appendDecls(fVSOutputs, shaderStr);
|
| - shaderStr->append("void main() {\n");
|
| - shaderStr->append(fVSCode);
|
| - shaderStr->append("}\n");
|
| - break;
|
| - case kGeometry_ShaderType:
|
| - if (fUsesGS) {
|
| - *shaderStr = version;
|
| - shaderStr->append(fGSHeader);
|
| - this->appendDecls(fGSInputs, shaderStr);
|
| - this->appendDecls(fGSOutputs, shaderStr);
|
| - shaderStr->append("void main() {\n");
|
| - shaderStr->append(fGSCode);
|
| - shaderStr->append("}\n");
|
| - } else {
|
| - shaderStr->reset();
|
| - }
|
| - break;
|
| - case kFragment_ShaderType:
|
| - *shaderStr = version;
|
| - shaderStr->append(fFSExtensions);
|
| - append_default_precision_qualifier(kDefaultFragmentPrecision,
|
| - fCtxInfo.binding(),
|
| - shaderStr);
|
| - this->appendUniformDecls(kFragment_ShaderType, shaderStr);
|
| - this->appendDecls(fFSInputs, shaderStr);
|
| - // We shouldn't have declared outputs on 1.10
|
| - SkASSERT(k110_GrGLSLGeneration != fCtxInfo.glslGeneration() || fFSOutputs.empty());
|
| - this->appendDecls(fFSOutputs, shaderStr);
|
| - shaderStr->append(fFSFunctions);
|
| - shaderStr->append("void main() {\n");
|
| - shaderStr->append(fFSCode);
|
| - shaderStr->append("}\n");
|
| - break;
|
| - }
|
| - }
|
| +void GrGLShaderBuilder::vsGetShader(SkString* shaderStr) const {
|
| + *shaderStr = GrGetGLSLVersionDecl(fCtxInfo);
|
| + this->appendUniformDecls(kVertex_Visibility, shaderStr);
|
| + this->appendDecls(fVSAttrs, shaderStr);
|
| + this->appendDecls(fVSOutputs, shaderStr);
|
| + shaderStr->append("void main() {\n");
|
| + shaderStr->append(fVSCode);
|
| + shaderStr->append("}\n");
|
| +}
|
| +
|
| +void GrGLShaderBuilder::gsGetShader(SkString* shaderStr) const {
|
| + if (!fUsesGS) {
|
| + shaderStr->reset();
|
| + return;
|
| + }
|
| +
|
| + *shaderStr = GrGetGLSLVersionDecl(fCtxInfo);
|
| + shaderStr->append(fGSHeader);
|
| + this->appendDecls(fGSInputs, shaderStr);
|
| + this->appendDecls(fGSOutputs, shaderStr);
|
| + shaderStr->append("void main() {\n");
|
| + shaderStr->append(fGSCode);
|
| + shaderStr->append("}\n");
|
| +}
|
| +
|
| +void GrGLShaderBuilder::fsGetShader(SkString* shaderStr) const {
|
| + *shaderStr = GrGetGLSLVersionDecl(fCtxInfo);
|
| + shaderStr->append(fFSExtensions);
|
| + append_default_precision_qualifier(kDefaultFragmentPrecision,
|
| + fCtxInfo.binding(),
|
| + shaderStr);
|
| + this->appendUniformDecls(kFragment_Visibility, shaderStr);
|
| + this->appendDecls(fFSInputs, shaderStr);
|
| + // We shouldn't have declared outputs on 1.10
|
| + SkASSERT(k110_GrGLSLGeneration != fCtxInfo.glslGeneration() || fFSOutputs.empty());
|
| + this->appendDecls(fFSOutputs, shaderStr);
|
| + shaderStr->append(fFSFunctions);
|
| + shaderStr->append("void main() {\n");
|
| + shaderStr->append(fFSCode);
|
| + shaderStr->append("}\n");
|
| +}
|
|
|
| void GrGLShaderBuilder::finished(GrGLuint programID) {
|
| fUniformManager.getUniformLocations(programID, fUniforms);
|
|
|