Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(410)

Side by Side Diff: src/gpu/gl/GrGLCoordTransform.cpp

Issue 25605008: Repurpose GrGLCoordTransform as GrGLEffectArray (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/gpu/gl/GrGLCoordTransform.h ('k') | src/gpu/gl/GrGLEffect.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLCoordTransform.h ('k') | src/gpu/gl/GrGLEffect.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698