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