GrGLSL.cpp revision 868a8e7fc83e9ac6ee1418e75b84a0595605626c
1086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com/* 2086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com * Copyright 2011 Google Inc. 3086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com * 4086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com * Use of this source code is governed by a BSD-style license that can be 5086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com * found in the LICENSE file. 6086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com */ 7086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com 8086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com#include "GrGLSL.h" 9e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com#include "GrGLShaderVar.h" 104af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com#include "SkString.h" 11086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com 12e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.comGrGLSLGeneration GrGetGLSLGeneration(GrGLBinding binding, 13086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com const GrGLInterface* gl) { 14086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com GrGLSLVersion ver = GrGLGetGLSLVersion(gl); 15086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com switch (binding) { 16086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com case kDesktop_GrGLBinding: 17086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com GrAssert(ver >= GR_GLSL_VER(1,10)); 18086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com if (ver >= GR_GLSL_VER(1,50)) { 19e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return k150_GrGLSLGeneration; 20086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com } else if (ver >= GR_GLSL_VER(1,30)) { 21e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return k130_GrGLSLGeneration; 22086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com } else { 23e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return k110_GrGLSLGeneration; 24086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com } 25086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com case kES2_GrGLBinding: 26086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com // version 1.00 of ES GLSL based on ver 1.20 of desktop GLSL 27086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com GrAssert(ver >= GR_GL_VER(1,00)); 28e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return k110_GrGLSLGeneration; 29086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com default: 30086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com GrCrash("Unknown GL Binding"); 31e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return k110_GrGLSLGeneration; // suppress warning 32086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com } 33086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com} 34086e5354fe7ae60e69c42bdfbc3d03bd8559b44ftomhudson@google.com 35e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.comconst char* GrGetGLSLVersionDecl(GrGLBinding binding, 36e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com GrGLSLGeneration gen) { 37e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com switch (gen) { 38e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com case k110_GrGLSLGeneration: 39e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com if (kES2_GrGLBinding == binding) { 40e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com // ES2s shader language is based on version 1.20 but is version 41e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com // 1.00 of the ES language. 42e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return "#version 100\n"; 43e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com } else { 44e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com GrAssert(kDesktop_GrGLBinding == binding); 45e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return "#version 110\n"; 46e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com } 47e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com case k130_GrGLSLGeneration: 48e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com GrAssert(kDesktop_GrGLBinding == binding); 49e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return "#version 130\n"; 50e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com case k150_GrGLSLGeneration: 51e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com GrAssert(kDesktop_GrGLBinding == binding); 52e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return "#version 150\n"; 53e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com default: 54e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com GrCrash("Unknown GL version."); 55e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return ""; // suppress warning 56e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com } 57e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com} 58e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com 59e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.combool GrGLSLSetupFSColorOuput(GrGLSLGeneration gen, 60e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com const char* nameIfDeclared, 61e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com GrGLShaderVar* var) { 62e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com bool declaredOutput = k110_GrGLSLGeneration != gen; 63168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com var->set(kVec4f_GrSLType, 64e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com GrGLShaderVar::kOut_TypeModifier, 65e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com declaredOutput ? nameIfDeclared : "gl_FragColor"); 66e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com return declaredOutput; 67e55fd0f188a2b0b137ddfd9728da58481e2309efbsalomon@google.com} 68168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com 69168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.comGrSLType GrSLFloatVectorType (int count) { 70a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com GR_STATIC_ASSERT(kFloat_GrSLType == 1); 71a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com GR_STATIC_ASSERT(kVec2f_GrSLType == 2); 72a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com GR_STATIC_ASSERT(kVec3f_GrSLType == 3); 73a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com GR_STATIC_ASSERT(kVec4f_GrSLType == 4); 74168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com GrAssert(count > 0 && count <= 4); 75a1bf0fffff821d9c11809c89bd98d4ced480421absalomon@google.com return (GrSLType)(count); 76168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com} 77168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com 78168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.comconst char* GrGLSLVectorHomogCoord(int count) { 79168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com static const char* HOMOGS[] = {"ERROR", "", ".y", ".z", ".w"}; 80168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com GrAssert(count >= 1 && count < (int)GR_ARRAY_COUNT(HOMOGS)); 81168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com return HOMOGS[count]; 82168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com} 83168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com 8434bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.comconst char* GrGLSLVectorHomogCoord(GrSLType type) { 8534bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.com return GrGLSLVectorHomogCoord(GrSLTypeToVecLength(type)); 8634bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.com} 8734bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.com 88168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.comconst char* GrGLSLVectorNonhomogCoords(int count) { 89168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com static const char* NONHOMOGS[] = {"ERROR", "", ".x", ".xy", ".xyz"}; 90168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com GrAssert(count >= 1 && count < (int)GR_ARRAY_COUNT(NONHOMOGS)); 91168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com return NONHOMOGS[count]; 92168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com} 93168e63418cadba4018aadf95c091d40d9deb13b9tomhudson@google.com 9434bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.comconst char* GrGLSLVectorNonhomogCoord(GrSLType type) { 9534bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.com return GrGLSLVectorNonhomogCoords(GrSLTypeToVecLength(type)); 9634bcb9f80336fe0dc56ad5f67aeb0859bf84d92ebsalomon@google.com} 974af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com 984af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.comGrSLConstantVec GrGLSLModulate4f(SkString* outAppend, 994af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com const char* in0, 1004af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com const char* in1, 1014af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrSLConstantVec default0, 1024af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrSLConstantVec default1) { 1034af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(NULL != outAppend); 1044af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com 1054af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com bool has0 = NULL != in0 && '\0' != *in0; 1064af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com bool has1 = NULL != in1 && '\0' != *in1; 1074af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com 1084af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(has0 || kNone_GrSLConstantVec != default0); 1094af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(has1 || kNone_GrSLConstantVec != default1); 1104af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com 1114af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com if (!has0 && !has1) { 1124af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(kZeros_GrSLConstantVec == default0 || kOnes_GrSLConstantVec == default0); 1134af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(kZeros_GrSLConstantVec == default1 || kOnes_GrSLConstantVec == default1); 1144af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com if (kZeros_GrSLConstantVec == default0 || kZeros_GrSLConstantVec == default1) { 1154af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com outAppend->append(GrGLSLZerosVecf(4)); 1164af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kZeros_GrSLConstantVec; 1174af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } else { 118868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com // both inputs are ones vectors 119d9e0181405c9853ffd20502555200205a5ab09b1bsalomon@google.com outAppend->append(GrGLSLOnesVecf(4)); 1204af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kOnes_GrSLConstantVec; 1214af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } 1224af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } else if (!has0) { 1234af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(kZeros_GrSLConstantVec == default0 || kOnes_GrSLConstantVec == default0); 1244af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com if (kZeros_GrSLConstantVec == default0) { 1254af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com outAppend->append(GrGLSLZerosVecf(4)); 1264af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kZeros_GrSLConstantVec; 1274af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } else { 1284af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com outAppend->appendf("vec4(%s)", in1); 1294af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kNone_GrSLConstantVec; 1304af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } 1314af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } else if (!has1) { 1324af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(kZeros_GrSLConstantVec == default1 || kOnes_GrSLConstantVec == default1); 1334af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com if (kZeros_GrSLConstantVec == default1) { 1344af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com outAppend->append(GrGLSLZerosVecf(4)); 1354af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kZeros_GrSLConstantVec; 1364af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } else { 1374af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com outAppend->appendf("vec4(%s)", in0); 1384af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kNone_GrSLConstantVec; 1394af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } 1404af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } else { 1414af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com outAppend->appendf("vec4(%s * %s)", in0, in1); 1424af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kNone_GrSLConstantVec; 1434af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } 1444af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com} 1454af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com 146868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.comnamespace { 147868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.comvoid append_tabs(SkString* outAppend, int tabCnt) { 148868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com static const char kTabs[] = "\t\t\t\t\t\t\t\t"; 149868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com while (tabCnt) { 150868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com int cnt = GrMin((int)GR_ARRAY_COUNT(kTabs), tabCnt); 151868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com outAppend->append(kTabs, cnt); 152868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com tabCnt -= cnt; 153868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com } 154868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com} 155868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com} 156868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com 157868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.comGrSLConstantVec GrGLSLMulVarBy4f(SkString* outAppend, 158868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com int tabCnt, 159868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com const char* vec4VarName, 160868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com const char* mulFactor, 161868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com GrSLConstantVec mulFactorDefault) { 162868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com bool haveFactor = NULL != mulFactor && '\0' != *mulFactor; 163868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com 164868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com GrAssert(NULL != outAppend); 165868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com GrAssert(NULL != vec4VarName); 166868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com GrAssert(kNone_GrSLConstantVec != mulFactorDefault || haveFactor); 167868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com 168868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com if (!haveFactor) { 169868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com if (kOnes_GrSLConstantVec == mulFactorDefault) { 170868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com return kNone_GrSLConstantVec; 171868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com } else { 172868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com GrAssert(kZeros_GrSLConstantVec == mulFactorDefault); 173868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com append_tabs(outAppend, tabCnt); 174868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com outAppend->appendf("%s = vec4(0, 0, 0, 0);\n", vec4VarName); 175868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com return kZeros_GrSLConstantVec; 176868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com } 177868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com } 178868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com append_tabs(outAppend, tabCnt); 179868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com outAppend->appendf("%s *= %s;\n", vec4VarName, mulFactor); 180868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com return kNone_GrSLConstantVec; 181868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com} 182868a8e7fc83e9ac6ee1418e75b84a0595605626cbsalomon@google.com 1834af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.comGrSLConstantVec GrGLSLAdd4f(SkString* outAppend, 1844af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com const char* in0, 1854af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com const char* in1, 1864af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrSLConstantVec default0, 1874af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrSLConstantVec default1) { 1884af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(NULL != outAppend); 1894af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com 1904af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com bool has0 = NULL != in0 && '\0' != *in0; 1914af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com bool has1 = NULL != in1 && '\0' != *in1; 1924af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com 1934af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com if (!has0 && !has1) { 1944af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(kZeros_GrSLConstantVec == default0); 1954af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(kZeros_GrSLConstantVec == default1); 1964af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com outAppend->append(GrGLSLZerosVecf(4)); 1974af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kZeros_GrSLConstantVec; 1984af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } else if (!has0) { 1994af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(kZeros_GrSLConstantVec == default0); 2004af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com outAppend->appendf("vec4(%s)", in1); 2014af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kNone_GrSLConstantVec; 2024af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } else if (!has1) { 2034af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com GrAssert(kZeros_GrSLConstantVec == default1); 2044af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com outAppend->appendf("vec4(%s)", in0); 2054af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kNone_GrSLConstantVec; 2064af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } else { 2074af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com outAppend->appendf("(vec4(%s) + vec4(%s))", in0, in1); 2084af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com return kNone_GrSLConstantVec; 2094af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com } 2104af0af612f8cfb6951feb10ffe3091821866bd44bsalomon@google.com} 211