| Index: src/gpu/gl/GrGLProgramEffects.cpp
|
| diff --git a/src/gpu/gl/GrGLProgramEffects.cpp b/src/gpu/gl/GrGLProgramEffects.cpp
|
| index 04cebf851961d36989501e5f660a3f5a33c908b4..ee8bf60955515a5b0ae5b6441e95ee58b58231c8 100644
|
| --- a/src/gpu/gl/GrGLProgramEffects.cpp
|
| +++ b/src/gpu/gl/GrGLProgramEffects.cpp
|
| @@ -22,10 +22,8 @@ typedef GrGLProgramEffects::TextureSamplerArray TextureSamplerArray;
|
| * We specialize the vertex code for each of these matrix types.
|
| */
|
| enum MatrixType {
|
| - kIdentity_MatrixType = 0,
|
| - kTrans_MatrixType = 1,
|
| - kNoPersp_MatrixType = 2,
|
| - kGeneral_MatrixType = 3,
|
| + kNoPersp_MatrixType = 0,
|
| + kGeneral_MatrixType = 1,
|
| };
|
|
|
| /**
|
| @@ -33,7 +31,7 @@ enum MatrixType {
|
| * indicates the source of the input coords.
|
| */
|
| enum {
|
| - kMatrixTypeKeyBits = 2,
|
| + kMatrixTypeKeyBits = 1,
|
| kMatrixTypeKeyMask = (1 << kMatrixTypeKeyBits) - 1,
|
| kPositionCoords_Flag = (1 << kMatrixTypeKeyBits),
|
| kTransformKeyBits = kMatrixTypeKeyBits + 1,
|
| @@ -88,30 +86,6 @@ GrCoordSet get_source_coords(EffectKey transformKey, int transformIdx) {
|
| }
|
|
|
| /**
|
| - * Retrieves the final translation that a transform needs to apply to its source coords (and
|
| - * verifies that a translation is all it needs).
|
| - */
|
| -void get_transform_translation(const GrDrawEffect& drawEffect,
|
| - int transformIdx,
|
| - GrGLfloat* tx,
|
| - GrGLfloat* ty) {
|
| - const GrCoordTransform& coordTransform = (*drawEffect.effect())->coordTransform(transformIdx);
|
| - SkASSERT(!coordTransform.reverseY());
|
| - const SkMatrix& matrix = coordTransform.getMatrix();
|
| - if (kLocal_GrCoordSet == coordTransform.sourceCoords() &&
|
| - !drawEffect.programHasExplicitLocalCoords()) {
|
| - const SkMatrix& coordChangeMatrix = drawEffect.getCoordChangeMatrix();
|
| - SkASSERT(SkMatrix::kTranslate_Mask == (matrix.getType() | coordChangeMatrix.getType()));
|
| - *tx = SkScalarToFloat(matrix[SkMatrix::kMTransX] + coordChangeMatrix[SkMatrix::kMTransX]);
|
| - *ty = SkScalarToFloat(matrix[SkMatrix::kMTransY] + coordChangeMatrix[SkMatrix::kMTransY]);
|
| - } else {
|
| - SkASSERT(SkMatrix::kTranslate_Mask == matrix.getType());
|
| - *tx = SkScalarToFloat(matrix[SkMatrix::kMTransX]);
|
| - *ty = SkScalarToFloat(matrix[SkMatrix::kMTransY]);
|
| - }
|
| -}
|
| -
|
| -/**
|
| * Retrieves the final matrix that a transform needs to apply to its source coords.
|
| */
|
| SkMatrix get_transform_matrix(const GrDrawEffect& drawEffect, int transformIdx) {
|
| @@ -175,16 +149,10 @@ EffectKey GrGLProgramEffects::GenTransformKey(const GrDrawEffect& drawEffect) {
|
|
|
| int combinedTypes = type0 | type1;
|
|
|
| - bool reverseY = coordTransform.reverseY();
|
| -
|
| if (SkMatrix::kPerspective_Mask & combinedTypes) {
|
| key |= kGeneral_MatrixType;
|
| - } else if (((SkMatrix::kAffine_Mask | SkMatrix::kScale_Mask) & combinedTypes) || reverseY) {
|
| - key |= kNoPersp_MatrixType;
|
| - } else if (SkMatrix::kTranslate_Mask & combinedTypes) {
|
| - key |= kTrans_MatrixType;
|
| } else {
|
| - key |= kIdentity_MatrixType;
|
| + key |= kNoPersp_MatrixType;
|
| }
|
| key <<= kTransformKeyBits * t;
|
| SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to overlap
|
| @@ -320,23 +288,11 @@ void GrGLVertexProgramEffects::emitTransforms(GrGLFullShaderBuilder* builder,
|
| GrSLType varyingType = kVoid_GrSLType;
|
| const char* uniName;
|
| switch (get_matrix_type(totalKey, t)) {
|
| - case kIdentity_MatrixType:
|
| - transforms[t].fType = kVoid_GrSLType;
|
| - uniName = NULL;
|
| - varyingType = kVec2f_GrSLType;
|
| - break;
|
| - case kTrans_MatrixType:
|
| - transforms[t].fType = kVec2f_GrSLType;
|
| - uniName = "StageTranslate";
|
| - varyingType = kVec2f_GrSLType;
|
| - break;
|
| case kNoPersp_MatrixType:
|
| - transforms[t].fType = kMat33f_GrSLType;
|
| uniName = "StageMatrix";
|
| varyingType = kVec2f_GrSLType;
|
| break;
|
| case kGeneral_MatrixType:
|
| - transforms[t].fType = kMat33f_GrSLType;
|
| uniName = "StageMatrix";
|
| varyingType = kVec3f_GrSLType;
|
| break;
|
| @@ -344,17 +300,15 @@ void GrGLVertexProgramEffects::emitTransforms(GrGLFullShaderBuilder* builder,
|
| SkFAIL("Unexpected key.");
|
| }
|
| SkString suffixedUniName;
|
| - if (kVoid_GrSLType != transforms[t].fType) {
|
| - if (0 != t) {
|
| - suffixedUniName.append(uniName);
|
| - suffixedUniName.appendf("_%i", t);
|
| - uniName = suffixedUniName.c_str();
|
| - }
|
| - transforms[t].fHandle = builder->addUniform(GrGLShaderBuilder::kVertex_Visibility,
|
| - transforms[t].fType,
|
| - uniName,
|
| - &uniName);
|
| + if (0 != t) {
|
| + suffixedUniName.append(uniName);
|
| + suffixedUniName.appendf("_%i", t);
|
| + uniName = suffixedUniName.c_str();
|
| }
|
| + transforms[t].fHandle = builder->addUniform(GrGLShaderBuilder::kVertex_Visibility,
|
| + kMat33f_GrSLType,
|
| + uniName,
|
| + &uniName);
|
|
|
| const char* varyingName = "MatrixCoord";
|
| SkString suffixedVaryingName;
|
| @@ -371,29 +325,13 @@ void GrGLVertexProgramEffects::emitTransforms(GrGLFullShaderBuilder* builder,
|
| builder->positionAttribute() :
|
| builder->localCoordsAttribute();
|
| // varying = matrix * coords (logically)
|
| - switch (transforms[t].fType) {
|
| - case kVoid_GrSLType:
|
| - SkASSERT(kVec2f_GrSLType == varyingType);
|
| - builder->vsCodeAppendf("\t%s = %s;\n", vsVaryingName, coords.c_str());
|
| - break;
|
| - case kVec2f_GrSLType:
|
| - SkASSERT(kVec2f_GrSLType == varyingType);
|
| - builder->vsCodeAppendf("\t%s = %s + %s;\n",
|
| - vsVaryingName, uniName, coords.c_str());
|
| - break;
|
| - case kMat33f_GrSLType: {
|
| - SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyingType);
|
| - if (kVec2f_GrSLType == varyingType) {
|
| - builder->vsCodeAppendf("\t%s = (%s * vec3(%s, 1)).xy;\n",
|
| - vsVaryingName, uniName, coords.c_str());
|
| - } else {
|
| - builder->vsCodeAppendf("\t%s = %s * vec3(%s, 1);\n",
|
| - vsVaryingName, uniName, coords.c_str());
|
| - }
|
| - break;
|
| - }
|
| - default:
|
| - SkFAIL("Unexpected uniform type.");
|
| + SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyingType);
|
| + if (kVec2f_GrSLType == varyingType) {
|
| + builder->vsCodeAppendf("\t%s = (%s * vec3(%s, 1)).xy;\n",
|
| + vsVaryingName, uniName, coords.c_str());
|
| + } else {
|
| + builder->vsCodeAppendf("\t%s = %s * vec3(%s, 1);\n",
|
| + vsVaryingName, uniName, coords.c_str());
|
| }
|
| SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords,
|
| (SkString(fsVaryingName), varyingType));
|
| @@ -421,32 +359,11 @@ void GrGLVertexProgramEffects::setTransformData(const GrGLUniformManager& unifor
|
| int numTransforms = transforms.count();
|
| SkASSERT(numTransforms == (*drawEffect.effect())->numTransforms());
|
| for (int t = 0; t < numTransforms; ++t) {
|
| - SkASSERT(transforms[t].fHandle.isValid() != (kVoid_GrSLType == transforms[t].fType));
|
| - switch (transforms[t].fType) {
|
| - case kVoid_GrSLType:
|
| - SkASSERT(get_transform_matrix(drawEffect, t).isIdentity());
|
| - break;
|
| - case kVec2f_GrSLType: {
|
| - GrGLfloat tx, ty;
|
| - get_transform_translation(drawEffect, t, &tx, &ty);
|
| - if (transforms[t].fCurrentValue.get(SkMatrix::kMTransX) != tx ||
|
| - transforms[t].fCurrentValue.get(SkMatrix::kMTransY) != ty) {
|
| - uniformManager.set2f(transforms[t].fHandle, tx, ty);
|
| - transforms[t].fCurrentValue.set(SkMatrix::kMTransX, tx);
|
| - transforms[t].fCurrentValue.set(SkMatrix::kMTransY, ty);
|
| - }
|
| - break;
|
| - }
|
| - case kMat33f_GrSLType: {
|
| - const SkMatrix& matrix = get_transform_matrix(drawEffect, t);
|
| - if (!transforms[t].fCurrentValue.cheapEqualTo(matrix)) {
|
| - uniformManager.setSkMatrix(transforms[t].fHandle, matrix);
|
| - transforms[t].fCurrentValue = matrix;
|
| - }
|
| - break;
|
| - }
|
| - default:
|
| - SkFAIL("Unexpected uniform type.");
|
| + SkASSERT(transforms[t].fHandle.isValid());
|
| + const SkMatrix& matrix = get_transform_matrix(drawEffect, t);
|
| + if (!transforms[t].fCurrentValue.cheapEqualTo(matrix)) {
|
| + uniformManager.setSkMatrix(transforms[t].fHandle, matrix);
|
| + transforms[t].fCurrentValue = matrix;
|
| }
|
| }
|
| }
|
| @@ -538,25 +455,6 @@ void GrGLPathTexGenProgramEffects::setPathTexGenState(GrGpuGL* gpu,
|
| int numTransforms = (*drawEffect.effect())->numTransforms();
|
| for (int t = 0; t < numTransforms; ++t) {
|
| switch (get_matrix_type(totalKey, t)) {
|
| - case kIdentity_MatrixType: {
|
| - SkASSERT(get_transform_matrix(drawEffect, t).isIdentity());
|
| - GrGLfloat identity[] = {1, 0, 0,
|
| - 0, 1, 0};
|
| - gpu->enablePathTexGen(texCoordIndex++,
|
| - GrGpuGL::kST_PathTexGenComponents,
|
| - identity);
|
| - break;
|
| - }
|
| - case kTrans_MatrixType: {
|
| - GrGLfloat tx, ty;
|
| - get_transform_translation(drawEffect, t, &tx, &ty);
|
| - GrGLfloat translate[] = {1, 0, tx,
|
| - 0, 1, ty};
|
| - gpu->enablePathTexGen(texCoordIndex++,
|
| - GrGpuGL::kST_PathTexGenComponents,
|
| - translate);
|
| - break;
|
| - }
|
| case kNoPersp_MatrixType: {
|
| const SkMatrix& transform = get_transform_matrix(drawEffect, t);
|
| gpu->enablePathTexGen(texCoordIndex++,
|
|
|