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