| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 /* |  | 
| 2  * Copyright 2012 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 #include "GrGLCoordTransform.h" |  | 
| 9 #include "GrDrawEffect.h" |  | 
| 10 #include "GrTexture.h" |  | 
| 11 #include "GrGLShaderBuilder.h" |  | 
| 12 |  | 
| 13 GrGLCoordTransform::EffectKey GrGLCoordTransform::GenKey(const GrDrawEffect& dra
     wEffect, |  | 
| 14                                                          int transformIdx) { |  | 
| 15     const GrCoordTransform& transform = (*drawEffect.effect())->coordTransform(t
     ransformIdx); |  | 
| 16     EffectKey key = 0; |  | 
| 17     SkMatrix::TypeMask type0 = transform.getMatrix().getType(); |  | 
| 18     SkMatrix::TypeMask type1; |  | 
| 19     if (kLocal_GrCoordSet == transform.sourceCoords()) { |  | 
| 20         type1 = drawEffect.getCoordChangeMatrix().getType(); |  | 
| 21     } else { |  | 
| 22         if (drawEffect.programHasExplicitLocalCoords()) { |  | 
| 23             // We only make the key indicate that device coords are referenced w
     hen the local coords |  | 
| 24             // are not actually determined by positions. Otherwise the local coo
     rds var and position |  | 
| 25             // var are identical. |  | 
| 26             key |= kPositionCoords_Flag; |  | 
| 27         } |  | 
| 28         type1 = SkMatrix::kIdentity_Mask; |  | 
| 29     } |  | 
| 30 |  | 
| 31     int combinedTypes = type0 | type1; |  | 
| 32 |  | 
| 33     bool reverseY = transform.reverseY(); |  | 
| 34 |  | 
| 35     if (SkMatrix::kPerspective_Mask & combinedTypes) { |  | 
| 36         key |= kGeneral_MatrixType; |  | 
| 37     } else if (((SkMatrix::kAffine_Mask | SkMatrix::kScale_Mask) & combinedTypes
     ) || reverseY) { |  | 
| 38         key |= kNoPersp_MatrixType; |  | 
| 39     } else if (SkMatrix::kTranslate_Mask & combinedTypes) { |  | 
| 40         key |= kTrans_MatrixType; |  | 
| 41     } else { |  | 
| 42         key |= kIdentity_MatrixType; |  | 
| 43     } |  | 
| 44     return key; |  | 
| 45 } |  | 
| 46 |  | 
| 47 void GrGLCoordTransform::emitCode(GrGLShaderBuilder* builder, |  | 
| 48                                   EffectKey key, |  | 
| 49                                   TransformedCoords* transformedCoords, |  | 
| 50                                   int suffix) { |  | 
| 51     GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder->getVertexBuilder(
     ); |  | 
| 52     SkASSERT(NULL != vertexBuilder); |  | 
| 53 |  | 
| 54     GrSLType varyingType = kVoid_GrSLType; |  | 
| 55     const char* uniName; |  | 
| 56     switch (key & kMatrixTypeKeyMask) { |  | 
| 57         case kIdentity_MatrixType: |  | 
| 58             fUniType = kVoid_GrSLType; |  | 
| 59             uniName = NULL; |  | 
| 60             varyingType = kVec2f_GrSLType; |  | 
| 61             break; |  | 
| 62         case kTrans_MatrixType: |  | 
| 63             fUniType = kVec2f_GrSLType; |  | 
| 64             uniName = "StageTranslate"; |  | 
| 65             varyingType = kVec2f_GrSLType; |  | 
| 66             break; |  | 
| 67         case kNoPersp_MatrixType: |  | 
| 68             fUniType = kMat33f_GrSLType; |  | 
| 69             uniName = "StageMatrix"; |  | 
| 70             varyingType = kVec2f_GrSLType; |  | 
| 71             break; |  | 
| 72         case kGeneral_MatrixType: |  | 
| 73             fUniType = kMat33f_GrSLType; |  | 
| 74             uniName = "StageMatrix"; |  | 
| 75             varyingType = kVec3f_GrSLType; |  | 
| 76             break; |  | 
| 77         default: |  | 
| 78             GrCrash("Unexpected key."); |  | 
| 79     } |  | 
| 80     SkString suffixedUniName; |  | 
| 81     if (kVoid_GrSLType != fUniType) { |  | 
| 82         if (0 != suffix) { |  | 
| 83             suffixedUniName.append(uniName); |  | 
| 84             suffixedUniName.appendf("_%i", suffix); |  | 
| 85             uniName = suffixedUniName.c_str(); |  | 
| 86         } |  | 
| 87         fUni = builder->addUniform(GrGLShaderBuilder::kVertex_Visibility, |  | 
| 88                                    fUniType, |  | 
| 89                                    uniName, |  | 
| 90                                    &uniName); |  | 
| 91     } |  | 
| 92 |  | 
| 93     const char* varyingName = "MatrixCoord"; |  | 
| 94     SkString suffixedVaryingName; |  | 
| 95     if (0 != suffix) { |  | 
| 96         suffixedVaryingName.append(varyingName); |  | 
| 97         suffixedVaryingName.appendf("_%i", suffix); |  | 
| 98         varyingName = suffixedVaryingName.c_str(); |  | 
| 99     } |  | 
| 100     const char* vsVaryingName; |  | 
| 101     const char* fsVaryingName; |  | 
| 102     vertexBuilder->addVarying(varyingType, varyingName, &vsVaryingName, &fsVaryi
     ngName); |  | 
| 103 |  | 
| 104     const GrGLShaderVar& coords = (kPositionCoords_Flag & key) ? |  | 
| 105                                       vertexBuilder->positionAttribute() : |  | 
| 106                                       vertexBuilder->localCoordsAttribute(); |  | 
| 107     // varying = matrix * coords (logically) |  | 
| 108     switch (fUniType) { |  | 
| 109         case kVoid_GrSLType: |  | 
| 110             SkASSERT(kVec2f_GrSLType == varyingType); |  | 
| 111             vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsVaryingName, coords.c
     _str()); |  | 
| 112             break; |  | 
| 113         case kVec2f_GrSLType: |  | 
| 114             SkASSERT(kVec2f_GrSLType == varyingType); |  | 
| 115             vertexBuilder->vsCodeAppendf("\t%s = %s + %s;\n", |  | 
| 116                                          vsVaryingName, uniName, coords.c_str())
     ; |  | 
| 117             break; |  | 
| 118         case kMat33f_GrSLType: { |  | 
| 119             SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyin
     gType); |  | 
| 120             if (kVec2f_GrSLType == varyingType) { |  | 
| 121                 vertexBuilder->vsCodeAppendf("\t%s = (%s * vec3(%s, 1)).xy;\n", |  | 
| 122                                              vsVaryingName, uniName, coords.c_st
     r()); |  | 
| 123             } else { |  | 
| 124                 vertexBuilder->vsCodeAppendf("\t%s = %s * vec3(%s, 1);\n", |  | 
| 125                                              vsVaryingName, uniName, coords.c_st
     r()); |  | 
| 126             } |  | 
| 127             break; |  | 
| 128         } |  | 
| 129         default: |  | 
| 130             GrCrash("Unexpected uniform type."); |  | 
| 131     } |  | 
| 132     SkASSERT(NULL != transformedCoords); |  | 
| 133     transformedCoords->fName = fsVaryingName; |  | 
| 134     transformedCoords->fType = varyingType; |  | 
| 135     transformedCoords->fVSName = vsVaryingName; |  | 
| 136 } |  | 
| 137 |  | 
| 138 void GrGLCoordTransform::setData(const GrGLUniformManager& uniformManager, |  | 
| 139                                  const GrDrawEffect& drawEffect, |  | 
| 140                                  int transformIdx) { |  | 
| 141     SkASSERT(fUni.isValid() != (kVoid_GrSLType == fUniType)); |  | 
| 142     const GrCoordTransform& transform = (*drawEffect.effect())->coordTransform(t
     ransformIdx); |  | 
| 143     const SkMatrix& matrix = transform.getMatrix(); |  | 
| 144     const SkMatrix& coordChangeMatrix = kLocal_GrCoordSet == transform.sourceCoo
     rds() ? |  | 
| 145                                             drawEffect.getCoordChangeMatrix() : |  | 
| 146                                             SkMatrix::I(); |  | 
| 147     switch (fUniType) { |  | 
| 148         case kVoid_GrSLType: |  | 
| 149             SkASSERT(matrix.isIdentity()); |  | 
| 150             SkASSERT(coordChangeMatrix.isIdentity()); |  | 
| 151             SkASSERT(!transform.reverseY()); |  | 
| 152             return; |  | 
| 153         case kVec2f_GrSLType: { |  | 
| 154             SkASSERT(SkMatrix::kTranslate_Mask == (matrix.getType() | coordChang
     eMatrix.getType())); |  | 
| 155             SkASSERT(!transform.reverseY()); |  | 
| 156             SkScalar tx = matrix[SkMatrix::kMTransX] + (coordChangeMatrix)[SkMat
     rix::kMTransX]; |  | 
| 157             SkScalar ty = matrix[SkMatrix::kMTransY] + (coordChangeMatrix)[SkMat
     rix::kMTransY]; |  | 
| 158             if (fPrevMatrix.get(SkMatrix::kMTransX) != tx || |  | 
| 159                 fPrevMatrix.get(SkMatrix::kMTransY) != ty) { |  | 
| 160                 uniformManager.set2f(fUni, tx, ty); |  | 
| 161                 fPrevMatrix.set(SkMatrix::kMTransX, tx); |  | 
| 162                 fPrevMatrix.set(SkMatrix::kMTransY, ty); |  | 
| 163             } |  | 
| 164             break; |  | 
| 165         } |  | 
| 166         case kMat33f_GrSLType: { |  | 
| 167             SkMatrix combined; |  | 
| 168             combined.setConcat(matrix, coordChangeMatrix); |  | 
| 169             if (transform.reverseY()) { |  | 
| 170                 // combined.postScale(1,-1); |  | 
| 171                 // combined.postTranslate(0,1); |  | 
| 172                 combined.set(SkMatrix::kMSkewY, |  | 
| 173                     combined[SkMatrix::kMPersp0] - combined[SkMatrix::kMSkewY]); |  | 
| 174                 combined.set(SkMatrix::kMScaleY, |  | 
| 175                     combined[SkMatrix::kMPersp1] - combined[SkMatrix::kMScaleY])
     ; |  | 
| 176                 combined.set(SkMatrix::kMTransY, |  | 
| 177                     combined[SkMatrix::kMPersp2] - combined[SkMatrix::kMTransY])
     ; |  | 
| 178             } |  | 
| 179             if (!fPrevMatrix.cheapEqualTo(combined)) { |  | 
| 180                 uniformManager.setSkMatrix(fUni, combined); |  | 
| 181                 fPrevMatrix = combined; |  | 
| 182             } |  | 
| 183             break; |  | 
| 184         } |  | 
| 185         default: |  | 
| 186             GrCrash("Unexpected uniform type."); |  | 
| 187     } |  | 
| 188 } |  | 
| OLD | NEW | 
|---|