Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright 2013 Google Inc. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license that can be | |
| 5 * found in the LICENSE file. | |
| 6 */ | |
| 7 | |
| 8 #ifndef GrGLSL_impl_DEFINED | |
| 9 #define GrGLSL_impl_DEFINED | |
| 10 | |
| 11 #include "SkString.h" | |
| 12 | |
| 13 namespace { | |
| 14 template<int N> | |
| 15 GrSLConstantVec return_const_vecf(GrSLConstantVec constVec, SkString* outAppend, bool omitAppend) { | |
| 16 GrAssert(kNone_GrSLConstantVec != constVec); | |
| 17 if (!omitAppend) { | |
| 18 if (kZeros_GrSLConstantVec == constVec) { | |
| 19 outAppend->append(GrGLSLZerosVecf(N)); | |
| 20 } else { | |
| 21 outAppend->append(GrGLSLOnesVecf(N)); | |
| 22 } | |
| 23 } | |
| 24 return constVec; | |
| 25 } | |
| 26 } | |
| 27 | |
| 28 template <int N> | |
| 29 GrSLConstantVec GrGLSLModulatef(SkString* outAppend, | |
| 30 const char* in0, | |
| 31 const char* in1, | |
| 32 GrSLConstantVec default0, | |
| 33 GrSLConstantVec default1, | |
| 34 bool omitIfConstVec) { | |
| 35 GrAssert(N > 0 && N <= 4); | |
| 36 GrAssert(NULL != outAppend); | |
| 37 | |
| 38 bool has0 = NULL != in0 && '\0' != *in0; | |
| 39 bool has1 = NULL != in1 && '\0' != *in1; | |
| 40 | |
| 41 GrAssert(has0 || kNone_GrSLConstantVec != default0); | |
| 42 GrAssert(has1 || kNone_GrSLConstantVec != default1); | |
| 43 | |
| 44 if (!has0 && !has1) { | |
| 45 GrAssert(kZeros_GrSLConstantVec == default0 || kOnes_GrSLConstantVec == default0); | |
| 46 GrAssert(kZeros_GrSLConstantVec == default1 || kOnes_GrSLConstantVec == default1); | |
| 47 if (kZeros_GrSLConstantVec == default0 || kZeros_GrSLConstantVec == defa ult1) { | |
| 48 return return_const_vecf<N>(kZeros_GrSLConstantVec, outAppend, omitI fConstVec); | |
| 49 } else { | |
| 50 // both inputs are ones vectors | |
| 51 return return_const_vecf<N>(kOnes_GrSLConstantVec, outAppend, omitIf ConstVec); | |
| 52 } | |
| 53 } else if (!has0) { | |
| 54 GrAssert(kZeros_GrSLConstantVec == default0 || kOnes_GrSLConstantVec == default0); | |
| 55 if (kZeros_GrSLConstantVec == default0) { | |
| 56 return return_const_vecf<N>(kZeros_GrSLConstantVec, outAppend, omitI fConstVec); | |
| 57 } else { | |
| 58 outAppend->appendf("%s(%s)", GrGLSLFloatVectorTypeString(N), in1); | |
| 59 return kNone_GrSLConstantVec; | |
| 60 } | |
| 61 } else if (!has1) { | |
| 62 GrAssert(kZeros_GrSLConstantVec == default1 || kOnes_GrSLConstantVec == default1); | |
| 63 if (kZeros_GrSLConstantVec == default1) { | |
| 64 return return_const_vecf<N>(kZeros_GrSLConstantVec, outAppend, omitI fConstVec); | |
| 65 } else { | |
| 66 outAppend->appendf("%s(%s)", GrGLSLFloatVectorTypeString(N), in0); | |
| 67 return kNone_GrSLConstantVec; | |
| 68 } | |
| 69 } else { | |
| 70 outAppend->appendf("%s((%s) * (%s))", GrGLSLFloatVectorTypeString(N), in 0, in1); | |
| 71 return kNone_GrSLConstantVec; | |
| 72 } | |
| 73 } | |
| 74 | |
| 75 template <int N> | |
| 76 GrSLConstantVec GrGLSLAddf(SkString* outAppend, | |
| 77 const char* in0, | |
| 78 const char* in1, | |
| 79 GrSLConstantVec default0, | |
| 80 GrSLConstantVec default1, | |
| 81 bool omitIfConstVec) { | |
| 82 GrAssert(N > 0 && N <= 4); | |
| 83 GrAssert(NULL != outAppend); | |
| 84 | |
| 85 bool has0 = NULL != in0 && '\0' != *in0; | |
| 86 bool has1 = NULL != in1 && '\0' != *in1; | |
| 87 | |
| 88 if (!has0 && !has1) { | |
| 89 GrAssert(kNone_GrSLConstantVec != default0); | |
| 90 GrAssert(kNone_GrSLConstantVec != default1); | |
|
robertphillips
2013/04/18 19:12:24
n -> numConstOnesVecs? -> resultOfSum?
bsalomon
2013/04/18 19:36:37
"sum"
| |
| 91 int n = (kOnes_GrSLConstantVec == default0) + (kOnes_GrSLConstantVec == default1); | |
| 92 if (0 == n) { | |
| 93 return return_const_vecf<N>(kZeros_GrSLConstantVec, outAppend, omitI fConstVec); | |
| 94 } else if (1 == n) { | |
| 95 outAppend->append(GrGLSLOnesVecf(N)); | |
| 96 return return_const_vecf<N>(kOnes_GrSLConstantVec, outAppend, omitIf ConstVec); | |
| 97 } else { | |
| 98 GrAssert(2 == n); | |
| 99 outAppend->appendf("%s(2)", GrGLSLFloatVectorTypeString(N)); | |
| 100 return kNone_GrSLConstantVec; | |
| 101 } | |
| 102 } else if (!has0) { | |
| 103 GrAssert(kNone_GrSLConstantVec != default0); | |
| 104 if (kZeros_GrSLConstantVec == default0) { | |
| 105 outAppend->appendf("%s(%s)", GrGLSLFloatVectorTypeString(N), in1); | |
| 106 } else { | |
| 107 outAppend->appendf("%s(%s) + %s", | |
| 108 GrGLSLFloatVectorTypeString(N), | |
| 109 in1, | |
| 110 GrGLSLOnesVecf(N)); | |
| 111 } | |
| 112 return kNone_GrSLConstantVec; | |
| 113 } else if (!has1) { | |
| 114 GrAssert(kNone_GrSLConstantVec != default1); | |
| 115 if (kZeros_GrSLConstantVec == default1) { | |
| 116 outAppend->appendf("%s(%s)", GrGLSLFloatVectorTypeString(N), in0); | |
| 117 } else { | |
| 118 outAppend->appendf("%s(%s) + %s", | |
| 119 GrGLSLFloatVectorTypeString(N), | |
| 120 in0, | |
| 121 GrGLSLOnesVecf(N)); | |
| 122 } | |
| 123 return kNone_GrSLConstantVec; | |
| 124 } else { | |
| 125 outAppend->appendf("(%s(%s) + %s(%s))", | |
| 126 GrGLSLFloatVectorTypeString(N), | |
| 127 in0, | |
| 128 GrGLSLFloatVectorTypeString(N), | |
| 129 in1); | |
| 130 return kNone_GrSLConstantVec; | |
| 131 } | |
| 132 } | |
| 133 | |
| 134 template <int N> | |
| 135 GrSLConstantVec GrGLSLSubtractf(SkString* outAppend, | |
| 136 const char* in0, | |
| 137 const char* in1, | |
| 138 GrSLConstantVec default0, | |
| 139 GrSLConstantVec default1, | |
| 140 bool omitIfConstVec) { | |
| 141 GrAssert(N > 0 && N <= 4); | |
| 142 GrAssert(NULL != outAppend); | |
| 143 | |
| 144 bool has0 = NULL != in0 && '\0' != *in0; | |
| 145 bool has1 = NULL != in1 && '\0' != *in1; | |
| 146 | |
| 147 if (!has0 && !has1) { | |
| 148 GrAssert(kNone_GrSLConstantVec != default0); | |
| 149 GrAssert(kNone_GrSLConstantVec != default1); | |
|
robertphillips
2013/04/18 19:12:24
n -> resultOfDifference?
bsalomon
2013/04/18 19:36:37
"diff"
| |
| 150 int n = (kOnes_GrSLConstantVec == default0) - (kOnes_GrSLConstantVec == default1); | |
| 151 if (-1 == n) { | |
| 152 outAppend->appendf("%s(-1)", GrGLSLFloatVectorTypeString(N)); | |
| 153 return kNone_GrSLConstantVec; | |
| 154 } else if (0 == n) { | |
| 155 return return_const_vecf<N>(kZeros_GrSLConstantVec, outAppend, omitI fConstVec); | |
| 156 } else { | |
| 157 GrAssert(1 == n); | |
| 158 return return_const_vecf<N>(kOnes_GrSLConstantVec, outAppend, omitIf ConstVec); | |
| 159 } | |
| 160 } else if (!has0) { | |
| 161 GrAssert(kNone_GrSLConstantVec != default0); | |
| 162 if (kZeros_GrSLConstantVec == default0) { | |
| 163 outAppend->appendf("-%s(%s)", GrGLSLFloatVectorTypeString(N), in1); | |
| 164 } else { | |
| 165 outAppend->appendf("%s - %s(%s)", | |
| 166 GrGLSLOnesVecf(N), | |
| 167 GrGLSLFloatVectorTypeString(N), | |
| 168 in1); | |
| 169 } | |
| 170 return kNone_GrSLConstantVec; | |
| 171 } else if (!has1) { | |
| 172 GrAssert(kNone_GrSLConstantVec != default1); | |
| 173 if (kZeros_GrSLConstantVec == default1) { | |
| 174 outAppend->appendf("%s(%s)", GrGLSLFloatVectorTypeString(N), in0); | |
| 175 } else { | |
| 176 outAppend->appendf("%s(%s) - %s", | |
| 177 GrGLSLFloatVectorTypeString(N), | |
| 178 in0, | |
| 179 GrGLSLOnesVecf(N)); | |
| 180 } | |
| 181 return kNone_GrSLConstantVec; | |
| 182 } else { | |
| 183 outAppend->appendf("(%s(%s) - %s(%s))", | |
| 184 GrGLSLFloatVectorTypeString(N), | |
| 185 in0, | |
| 186 GrGLSLFloatVectorTypeString(N), | |
| 187 in1); | |
| 188 return kNone_GrSLConstantVec; | |
| 189 } | |
| 190 } | |
| 191 | |
| 192 | |
| 193 #endif | |
| OLD | NEW |