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

Side by Side Diff: src/gpu/GrGeometryProcessor.cpp

Issue 822423004: Move most of the transform logic into the primitive processors (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: tiny update Created 5 years, 11 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
OLDNEW
1 /* 1 /*
2 * Copyright 2014 Google Inc. 2 * Copyright 2014 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 #include "GrGeometryProcessor.h" 8 #include "GrGeometryProcessor.h"
9 9
10 #include "GrCoordTransform.h"
11 #include "GrInvariantOutput.h"
10 #include "gl/GrGLGeometryProcessor.h" 12 #include "gl/GrGLGeometryProcessor.h"
11 #include "GrInvariantOutput.h"
12 13
13 //////////////////////////////////////////////////////////////////////////////// /////////////////// 14 //////////////////////////////////////////////////////////////////////////////// ///////////////////
14 15
16 /**
17 * The key for an individual coord transform is made up of a matrix type, a prec ision, and a bit
18 * that indicates the source of the input coords.
19 */
20 enum {
21 kMatrixTypeKeyBits = 1,
22 kMatrixTypeKeyMask = (1 << kMatrixTypeKeyBits) - 1,
23
24 kPrecisionBits = 2,
25 kPrecisionShift = kMatrixTypeKeyBits,
26
27 kPositionCoords_Flag = (1 << (kPrecisionShift + kPrecisionBits)),
28 kDeviceCoords_Flag = kPositionCoords_Flag + kPositionCoords_Flag,
29
30 kTransformKeyBits = kMatrixTypeKeyBits + kPrecisionBits + 2,
31 };
32
33 GR_STATIC_ASSERT(kHigh_GrSLPrecision < (1 << kPrecisionBits));
34
35 /**
36 * We specialize the vertex code for each of these matrix types.
37 */
38 enum MatrixType {
39 kNoPersp_MatrixType = 0,
40 kGeneral_MatrixType = 1,
41 };
42
43 uint32_t
44 GrPrimitiveProcessor::getTransformKey(const SkTArray<const GrCoordTransform*, tr ue>& coords) const {
45 uint32_t totalKey = 0;
46 for (int t = 0; t < coords.count(); ++t) {
47 uint32_t key = 0;
48 const GrCoordTransform* coordTransform = coords[t];
49 if (coordTransform->getMatrix().hasPerspective()) {
50 key |= kGeneral_MatrixType;
51 } else {
52 key |= kNoPersp_MatrixType;
53 }
54
55 if (kLocal_GrCoordSet == coordTransform->sourceCoords() &&
56 !this->hasExplicitLocalCoords()) {
57 key |= kPositionCoords_Flag;
58 } else if (kDevice_GrCoordSet == coordTransform->sourceCoords()) {
59 key |= kDeviceCoords_Flag;
60 }
61
62 GR_STATIC_ASSERT(kGrSLPrecisionCount <= (1 << kPrecisionBits));
63 key |= (coordTransform->precision() << kPrecisionShift);
64
65 key <<= kTransformKeyBits * t;
66
67 SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to overlap
68 totalKey |= key;
69 }
70 return totalKey;
71 }
72
73 //////////////////////////////////////////////////////////////////////////////// ///////////////////
74
15 void GrGeometryProcessor::getInvariantOutputColor(GrInitInvariantOutput* out) co nst { 75 void GrGeometryProcessor::getInvariantOutputColor(GrInitInvariantOutput* out) co nst {
16 if (fHasVertexColor) { 76 if (fHasVertexColor) {
17 if (fOpaqueVertexColors) { 77 if (fOpaqueVertexColors) {
18 out->setUnknownOpaqueFourComponents(); 78 out->setUnknownOpaqueFourComponents();
19 } else { 79 } else {
20 out->setUnknownFourComponents(); 80 out->setUnknownFourComponents();
21 } 81 }
22 } else { 82 } else {
23 out->setKnownFourComponents(fColor); 83 out->setKnownFourComponents(fColor);
24 } 84 }
25 this->onGetInvariantOutputColor(out); 85 this->onGetInvariantOutputColor(out);
26 } 86 }
27 87
28 void GrGeometryProcessor::getInvariantOutputCoverage(GrInitInvariantOutput* out) const { 88 void GrGeometryProcessor::getInvariantOutputCoverage(GrInitInvariantOutput* out) const {
29 this->onGetInvariantOutputCoverage(out); 89 this->onGetInvariantOutputCoverage(out);
30 } 90 }
31 91
32 //////////////////////////////////////////////////////////////////////////////// /////////////////// 92 //////////////////////////////////////////////////////////////////////////////// ///////////////////
33 93
34 #include "gl/builders/GrGLProgramBuilder.h" 94 #include "gl/builders/GrGLProgramBuilder.h"
35 95
36 void GrGLGeometryProcessor::setupColorPassThrough(GrGLGPBuilder* pb, 96 SkMatrix GrGLPrimitiveProcessor::GetTransformMatrix(const SkMatrix& localMatrix,
37 GrGPInput inputType, 97 const GrCoordTransform& coor dTransform) {
38 const char* outputName, 98 SkMatrix combined;
39 const GrGeometryProcessor::GrA ttribute* colorAttr, 99 // We only apply the localmatrix to localcoords
40 UniformHandle* colorUniform) { 100 if (kLocal_GrCoordSet == coordTransform.sourceCoords()) {
101 combined.setConcat(coordTransform.getMatrix(), localMatrix);
102 } else {
103 combined = coordTransform.getMatrix();
104 }
105 if (coordTransform.reverseY()) {
106 // combined.postScale(1,-1);
107 // combined.postTranslate(0,1);
108 combined.set(SkMatrix::kMSkewY,
109 combined[SkMatrix::kMPersp0] - combined[SkMatrix::kMSkewY]);
110 combined.set(SkMatrix::kMScaleY,
111 combined[SkMatrix::kMPersp1] - combined[SkMatrix::kMScaleY]);
112 combined.set(SkMatrix::kMTransY,
113 combined[SkMatrix::kMPersp2] - combined[SkMatrix::kMTransY]);
114 }
115 return combined;
116 }
117
118 void
119 GrGLPrimitiveProcessor::setupColorPassThrough(GrGLGPBuilder* pb,
120 GrGPInput inputType,
121 const char* outputName,
122 const GrGeometryProcessor::GrAttri bute* colorAttr,
123 UniformHandle* colorUniform) {
41 GrGLGPFragmentBuilder* fs = pb->getFragmentShaderBuilder(); 124 GrGLGPFragmentBuilder* fs = pb->getFragmentShaderBuilder();
42 if (kUniform_GrGPInput == inputType) { 125 if (kUniform_GrGPInput == inputType) {
43 SkASSERT(colorUniform); 126 SkASSERT(colorUniform);
44 const char* stagedLocalVarName; 127 const char* stagedLocalVarName;
45 *colorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, 128 *colorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
46 kVec4f_GrSLType, 129 kVec4f_GrSLType,
47 kDefault_GrSLPrecision, 130 kDefault_GrSLPrecision,
48 "Color", 131 "Color",
49 &stagedLocalVarName); 132 &stagedLocalVarName);
50 fs->codeAppendf("%s = %s;", outputName, stagedLocalVarName); 133 fs->codeAppendf("%s = %s;", outputName, stagedLocalVarName);
51 } else if (kAttribute_GrGPInput == inputType) { 134 } else if (kAttribute_GrGPInput == inputType) {
52 SkASSERT(colorAttr); 135 SkASSERT(colorAttr);
53 pb->addPassThroughAttribute(colorAttr, outputName); 136 pb->addPassThroughAttribute(colorAttr, outputName);
54 } else if (kAllOnes_GrGPInput == inputType) { 137 } else if (kAllOnes_GrGPInput == inputType) {
55 fs->codeAppendf("%s = vec4(1);", outputName); 138 fs->codeAppendf("%s = vec4(1);", outputName);
56 } 139 }
57 } 140 }
58 141
59 void GrGLGeometryProcessor::addUniformViewMatrix(GrGLGPBuilder* pb) { 142 void GrGLPrimitiveProcessor::addUniformViewMatrix(GrGLGPBuilder* pb) {
60 fViewMatrixUniform = pb->addUniform(GrGLProgramBuilder::kVertex_Visibility, 143 fViewMatrixUniform = pb->addUniform(GrGLProgramBuilder::kVertex_Visibility,
61 kMat33f_GrSLType, kDefault_GrSLPrecision , 144 kMat33f_GrSLType, kDefault_GrSLPrecision ,
62 "uViewM", 145 "uViewM",
63 &fViewMatrixName); 146 &fViewMatrixName);
64 } 147 }
65 148
66 void GrGLGeometryProcessor::setUniformViewMatrix(const GrGLProgramDataManager& p dman, 149 void GrGLPrimitiveProcessor::setUniformViewMatrix(const GrGLProgramDataManager& pdman,
67 const SkMatrix& viewMatrix) { 150 const SkMatrix& viewMatrix) {
68 if (!fViewMatrix.cheapEqualTo(viewMatrix)) { 151 if (!fViewMatrix.cheapEqualTo(viewMatrix)) {
69 SkASSERT(fViewMatrixUniform.isValid()); 152 SkASSERT(fViewMatrixUniform.isValid());
70 fViewMatrix = viewMatrix; 153 fViewMatrix = viewMatrix;
71 154
72 GrGLfloat viewMatrix[3 * 3]; 155 GrGLfloat viewMatrix[3 * 3];
73 GrGLGetMatrix<3>(viewMatrix, fViewMatrix); 156 GrGLGetMatrix<3>(viewMatrix, fViewMatrix);
74 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); 157 pdman.setMatrix3f(fViewMatrixUniform, viewMatrix);
75 } 158 }
76 } 159 }
77 160
78 //////////////////////////////////////////////////////////////////////////////// /////////////////// 161 //////////////////////////////////////////////////////////////////////////////// ///////////////////
79 162
163 void GrGLGeometryProcessor::emitTransforms(GrGLGPBuilder* pb,
164 const char* position,
165 const char* localCoords,
166 const SkMatrix& localMatrix,
167 const TransformsIn& tin,
168 TransformsOut* tout) {
169 GrGLVertexBuilder* vb = pb->getVertexShaderBuilder();
170 tout->push_back_n(tin.count());
171 fInstalledTransforms.push_back_n(tin.count());
172 for (int i = 0; i < tin.count(); i++) {
173 const ProcCoords& coordTransforms = tin[i];
174 fInstalledTransforms[i].push_back_n(coordTransforms.count());
175 for (int t = 0; t < coordTransforms.count(); t++) {
176 SkString strUniName("StageMatrix");
177 strUniName.appendf("_%i_%i", i, t);
178 GrSLType varyingType;
179
180 GrCoordSet coordType = coordTransforms[t]->sourceCoords();
181 uint32_t type = coordTransforms[t]->getMatrix().getType();
182 if (kLocal_GrCoordSet == coordType) {
183 type |= localMatrix.getType();
184 }
185 varyingType = SkToBool(SkMatrix::kPerspective_Mask & type) ? kVec3f_ GrSLType :
186 kVec2f_ GrSLType;
187 GrSLPrecision precision = coordTransforms[t]->precision();
188
189 const char* uniName;
190 fInstalledTransforms[i][t].fHandle =
191 pb->addUniform(GrGLProgramBuilder::kVertex_Visibility,
192 kMat33f_GrSLType, precision,
193 strUniName.c_str(),
194 &uniName).toShaderBuilderIndex();
195
196 SkString strVaryingName("MatrixCoord");
197 strVaryingName.appendf("_%i_%i", i, t);
198
199 GrGLVertToFrag v(varyingType);
200 pb->addVarying(strVaryingName.c_str(), &v, precision);
201
202 SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyin gType);
203 SkNEW_APPEND_TO_TARRAY(&(*tout)[i], GrGLProcessor::TransformedCoords ,
204 (SkString(v.fsIn()), varyingType));
205
206 // varying = matrix * coords (logically)
207 if (kDevice_GrCoordSet == coordType) {
208 if (kVec2f_GrSLType == varyingType) {
209 vb->codeAppendf("%s = (%s * %s).xy;", v.vsOut(), uniName, po sition);
210 } else {
211 vb->codeAppendf("%s = %s * %s;", v.vsOut(), uniName, positio n);
212 }
213 } else {
214 if (kVec2f_GrSLType == varyingType) {
215 vb->codeAppendf("%s = (%s * vec3(%s, 1)).xy;", v.vsOut(), un iName, localCoords);
216 } else {
217 vb->codeAppendf("%s = %s * vec3(%s, 1);", v.vsOut(), uniName , localCoords);
218 }
219 }
220 }
221 }
222 }
223
224
225 void
226 GrGLGeometryProcessor::setTransformData(const GrPrimitiveProcessor* primProc,
227 const GrGLProgramDataManager& pdman,
228 int index,
229 const SkTArray<const GrCoordTransform*, true>& transforms) {
230 SkSTArray<2, Transform, true>& procTransforms = fInstalledTransforms[index];
231 int numTransforms = transforms.count();
232 for (int t = 0; t < numTransforms; ++t) {
233 SkASSERT(procTransforms[t].fHandle.isValid());
234 const SkMatrix& transform = GetTransformMatrix(primProc->localMatrix(), *transforms[t]);
235 if (!procTransforms[t].fCurrentValue.cheapEqualTo(transform)) {
236 pdman.setSkMatrix(procTransforms[t].fHandle.convertToUniformHandle() , transform);
237 procTransforms[t].fCurrentValue = transform;
238 }
239 }
240 }
241
242 //////////////////////////////////////////////////////////////////////////////// ///////////////////
243
244 #include "gl/GrGLGpu.h"
245 #include "gl/GrGLPathRendering.h"
246
80 struct PathBatchTracker { 247 struct PathBatchTracker {
81 GrGPInput fInputColorType; 248 GrGPInput fInputColorType;
82 GrGPInput fInputCoverageType; 249 GrGPInput fInputCoverageType;
83 GrColor fColor; 250 GrColor fColor;
84 bool fUsesLocalCoords; 251 bool fUsesLocalCoords;
85 }; 252 };
86 253
87 class GrGLPathProcessor : public GrGLGeometryProcessor { 254 GrGLPathProcessor::GrGLPathProcessor(const GrPathProcessor&, const GrBatchTracke r&)
255 : fColor(GrColor_ILLEGAL) {}
256
257 void GrGLPathProcessor::emitCode(EmitArgs& args) {
258 GrGLGPBuilder* pb = args.fPB;
259 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder();
260 const PathBatchTracker& local = args.fBT.cast<PathBatchTracker>();
261
262 // emit transforms
263 this->emitTransforms(args.fPB, args.fTransformsIn, args.fTransformsOut);
264
265 // Setup uniform color
266 if (kUniform_GrGPInput == local.fInputColorType) {
267 const char* stagedLocalVarName;
268 fColorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility,
269 kVec4f_GrSLType,
270 kDefault_GrSLPrecision,
271 "Color",
272 &stagedLocalVarName);
273 fs->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalVarName);
274 }
275
276 // setup constant solid coverage
277 if (kAllOnes_GrGPInput == local.fInputCoverageType) {
278 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage);
279 }
280 }
281
282 void GrGLPathProcessor::GenKey(const GrPathProcessor&,
283 const GrBatchTracker& bt,
284 const GrGLCaps&,
285 GrProcessorKeyBuilder* b) {
286 const PathBatchTracker& local = bt.cast<PathBatchTracker>();
287 b->add32(local.fInputColorType | local.fInputCoverageType << 16);
288 }
289
290 void GrGLPathProcessor::setData(const GrGLProgramDataManager& pdman,
291 const GrPrimitiveProcessor& primProc,
292 const GrBatchTracker& bt) {
293 const PathBatchTracker& local = bt.cast<PathBatchTracker>();
294 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) {
295 GrGLfloat c[4];
296 GrColorToRGBAFloat(local.fColor, c);
297 pdman.set4fv(fColorUniform, 1, c);
298 fColor = local.fColor;
299 }
300 }
301
302 class GrGLLegacyPathProcessor : public GrGLPathProcessor {
88 public: 303 public:
89 GrGLPathProcessor(const GrPathProcessor&, const GrBatchTracker&) 304 GrGLLegacyPathProcessor(const GrPathProcessor& pathProc, const GrBatchTracke r& bt,
90 : fColor(GrColor_ILLEGAL) {} 305 int maxTexCoords)
91 306 : INHERITED(pathProc, bt)
92 void emitCode(const EmitArgs& args) SK_OVERRIDE { 307 , fMaxTexCoords(maxTexCoords)
93 GrGLGPBuilder* pb = args.fPB; 308 , fTexCoordSetCnt(0) {}
94 GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); 309
95 const PathBatchTracker& local = args.fBT.cast<PathBatchTracker>(); 310 int addTexCoordSets(int count) {
96 311 int firstFreeCoordSet = fTexCoordSetCnt;
97 // Setup uniform color 312 fTexCoordSetCnt += count;
98 if (kUniform_GrGPInput == local.fInputColorType) { 313 SkASSERT(fMaxTexCoords >= fTexCoordSetCnt);
99 const char* stagedLocalVarName; 314 return firstFreeCoordSet;
100 fColorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibil ity, 315 }
101 kVec4f_GrSLType, 316
102 kDefault_GrSLPrecision, 317 void emitTransforms(GrGLGPBuilder*, const TransformsIn& tin, TransformsOut* tout) SK_OVERRIDE {
103 "Color", 318 tout->push_back_n(tin.count());
104 &stagedLocalVarName); 319 fInstalledTransforms.push_back_n(tin.count());
105 fs->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalVarName); 320 for (int i = 0; i < tin.count(); i++) {
106 } 321 const ProcCoords& coordTransforms = tin[i];
107 322 int texCoordIndex = this->addTexCoordSets(coordTransforms.count());
108 // setup constant solid coverage 323
109 if (kAllOnes_GrGPInput == local.fInputCoverageType) { 324 // Use the first uniform location as the texcoord index.
110 fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); 325 fInstalledTransforms[i].push_back_n(1);
111 } 326 fInstalledTransforms[i][0].fHandle = ShaderVarHandle(texCoordIndex);
112 } 327
113 328 SkString name;
114 static inline void GenKey(const GrPathProcessor&, 329 for (int t = 0; t < coordTransforms.count(); ++t) {
115 const GrBatchTracker& bt, 330 GrSLType type = coordTransforms[t]->getMatrix().hasPerspective() ? kVec3f_GrSLType :
116 const GrGLCaps&, 331 kVec2f_GrSLType;
117 GrProcessorKeyBuilder* b) { 332
118 const PathBatchTracker& local = bt.cast<PathBatchTracker>(); 333 name.printf("%s(gl_TexCoord[%i])", GrGLSLTypeString(type), texCo ordIndex++);
119 b->add32(local.fInputColorType | local.fInputCoverageType << 16); 334 SkNEW_APPEND_TO_TARRAY(&(*tout)[i], GrGLProcessor::TransformedCo ords, (name, type));
120 } 335 }
121 336 }
122 void setData(const GrGLProgramDataManager& pdman, 337 }
123 const GrPrimitiveProcessor& primProc, 338
124 const GrBatchTracker& bt) SK_OVERRIDE { 339 void setTransformData(const GrPrimitiveProcessor* primProc,
125 const PathBatchTracker& local = bt.cast<PathBatchTracker>(); 340 int index,
126 if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColo r) { 341 const SkTArray<const GrCoordTransform*, true>& transfo rms,
127 GrGLfloat c[4]; 342 GrGLPathRendering* glpr,
128 GrColorToRGBAFloat(local.fColor, c); 343 GrGLuint) SK_OVERRIDE {
129 pdman.set4fv(fColorUniform, 1, c); 344 // We've hidden the texcoord index in the first entry of the transforms array for each
130 fColor = local.fColor; 345 // effect
131 } 346 int texCoordIndex = fInstalledTransforms[index][0].fHandle.handle();
347 for (int t = 0; t < transforms.count(); ++t) {
348 const SkMatrix& transform = GetTransformMatrix(primProc->localMatrix (), *transforms[t]);
349 GrGLPathRendering::PathTexGenComponents components =
350 GrGLPathRendering::kST_PathTexGenComponents;
351 if (transform.hasPerspective()) {
352 components = GrGLPathRendering::kSTR_PathTexGenComponents;
353 }
354 glpr->enablePathTexGen(texCoordIndex++, components, transform);
355 }
356 }
357
358 void didSetData(GrGLPathRendering* glpr) SK_OVERRIDE {
359 glpr->flushPathTexGenSettings(fTexCoordSetCnt);
132 } 360 }
133 361
134 private: 362 private:
135 UniformHandle fColorUniform; 363 int fMaxTexCoords;
136 GrColor fColor; 364 int fTexCoordSetCnt;
137 365
138 typedef GrGLGeometryProcessor INHERITED; 366 typedef GrGLPathProcessor INHERITED;
139 }; 367 };
140 368
369 class GrGLNormalPathProcessor : public GrGLPathProcessor {
370 public:
371 GrGLNormalPathProcessor(const GrPathProcessor& pathProc, const GrBatchTracke r& bt)
372 : INHERITED(pathProc, bt) {}
373
374 void emitTransforms(GrGLGPBuilder* pb, const TransformsIn& tin,
375 TransformsOut* tout) SK_OVERRIDE {
376 tout->push_back_n(tin.count());
377 fInstalledTransforms.push_back_n(tin.count());
378 for (int i = 0; i < tin.count(); i++) {
379 const ProcCoords& coordTransforms = tin[i];
380 fInstalledTransforms[i].push_back_n(coordTransforms.count());
381 for (int t = 0; t < coordTransforms.count(); t++) {
382 GrSLType varyingType =
383 coordTransforms[t]->getMatrix().hasPerspective() ? kVec3 f_GrSLType :
384 kVec2 f_GrSLType;
385
386 const char* varyingName = "MatrixCoord";
387 SkString suffixedVaryingName;
388 if (0 != t) {
389 suffixedVaryingName.append(varyingName);
390 suffixedVaryingName.appendf("_%i", t);
391 varyingName = suffixedVaryingName.c_str();
392 }
393 GrGLVertToFrag v(varyingType);
394 pb->addVarying(varyingName, &v);
395 SeparableVaryingInfo& varyingInfo = fSeparableVaryingInfos.push_ back();
396 varyingInfo.fVariable = pb->getFragmentShaderBuilder()->fInputs. back();
397 varyingInfo.fLocation = fSeparableVaryingInfos.count() - 1;
398 varyingInfo.fType = varyingType;
399 fInstalledTransforms[i][t].fHandle = ShaderVarHandle(varyingInfo .fLocation);
400 fInstalledTransforms[i][t].fType = varyingType;
401
402 SkNEW_APPEND_TO_TARRAY(&(*tout)[i], GrGLProcessor::TransformedCo ords,
403 (SkString(v.fsIn()), varyingType));
404 }
405 }
406 }
407
408 void resolveSeparableVaryings(GrGLGpu* gpu, GrGLuint programId) {
409 int count = fSeparableVaryingInfos.count();
410 for (int i = 0; i < count; ++i) {
411 GrGLint location;
412 GR_GL_CALL_RET(gpu->glInterface(),
413 location,
414 GetProgramResourceLocation(programId,
415 GR_GL_FRAGMENT_INPUT,
416 fSeparableVaryingInfos[i]. fVariable.c_str()));
417 fSeparableVaryingInfos[i].fLocation = location;
418 }
419 }
420
421 void setTransformData(const GrPrimitiveProcessor* primProc,
422 int index,
423 const SkTArray<const GrCoordTransform*, true>& coordTr ansforms,
424 GrGLPathRendering* glpr,
425 GrGLuint programID) SK_OVERRIDE {
426 SkSTArray<2, Transform, true>& transforms = fInstalledTransforms[index];
427 int numTransforms = transforms.count();
428 for (int t = 0; t < numTransforms; ++t) {
429 SkASSERT(transforms[t].fHandle.isValid());
430 const SkMatrix& transform = GetTransformMatrix(primProc->localMatrix (),
431 *coordTransforms[t]);
432 if (transforms[t].fCurrentValue.cheapEqualTo(transform)) {
433 continue;
434 }
435 transforms[t].fCurrentValue = transform;
436 const SeparableVaryingInfo& fragmentInput =
437 fSeparableVaryingInfos[transforms[t].fHandle.handle()];
438 SkASSERT(transforms[t].fType == kVec2f_GrSLType ||
439 transforms[t].fType == kVec3f_GrSLType);
440 unsigned components = transforms[t].fType == kVec2f_GrSLType ? 2 : 3 ;
441 glpr->setProgramPathFragmentInputTransform(programID,
442 fragmentInput.fLocation,
443 GR_GL_OBJECT_LINEAR,
444 components,
445 transform);
446 }
447 }
448
449 private:
450 struct SeparableVaryingInfo {
451 GrSLType fType;
452 GrGLShaderVar fVariable;
453 GrGLint fLocation;
454 };
455
456
457 typedef SkSTArray<8, SeparableVaryingInfo, true> SeparableVaryingInfoArray;
458
459 SeparableVaryingInfoArray fSeparableVaryingInfos;
460
461 typedef GrGLPathProcessor INHERITED;
462 };
463
141 GrPathProcessor::GrPathProcessor(GrColor color, 464 GrPathProcessor::GrPathProcessor(GrColor color,
142 const SkMatrix& viewMatrix, 465 const SkMatrix& viewMatrix,
143 const SkMatrix& localMatrix) 466 const SkMatrix& localMatrix)
144 : INHERITED(viewMatrix, localMatrix) 467 : INHERITED(viewMatrix, localMatrix)
145 , fColor(color) { 468 , fColor(color) {
146 this->initClassID<GrPathProcessor>(); 469 this->initClassID<GrPathProcessor>();
147 } 470 }
148 471
149 void GrPathProcessor::getInvariantOutputColor(GrInitInvariantOutput* out) const { 472 void GrPathProcessor::getInvariantOutputColor(GrInitInvariantOutput* out) const {
150 out->setKnownFourComponents(fColor); 473 out->setKnownFourComponents(fColor);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 CanCombineOutput(mine.fInputCoverageType, 0xff, 512 CanCombineOutput(mine.fInputCoverageType, 0xff,
190 theirs.fInputCoverageType, 0xff); 513 theirs.fInputCoverageType, 0xff);
191 } 514 }
192 515
193 void GrPathProcessor::getGLProcessorKey(const GrBatchTracker& bt, 516 void GrPathProcessor::getGLProcessorKey(const GrBatchTracker& bt,
194 const GrGLCaps& caps, 517 const GrGLCaps& caps,
195 GrProcessorKeyBuilder* b) const { 518 GrProcessorKeyBuilder* b) const {
196 GrGLPathProcessor::GenKey(*this, bt, caps, b); 519 GrGLPathProcessor::GenKey(*this, bt, caps, b);
197 } 520 }
198 521
199 GrGLGeometryProcessor* GrPathProcessor::createGLInstance(const GrBatchTracker& b t) const { 522 GrGLPrimitiveProcessor* GrPathProcessor::createGLInstance(const GrBatchTracker& bt,
200 return SkNEW_ARGS(GrGLPathProcessor, (*this, bt)); 523 const GrGLCaps& caps) const {
524 SkASSERT(caps.nvprSupport() != GrGLCaps::kNone_NvprSupport);
525 if (caps.nvprSupport() == GrGLCaps::kLegacy_NvprSupport) {
526 return SkNEW_ARGS(GrGLLegacyPathProcessor, (*this, bt,
527 caps.maxFixedFunctionTexture Coords()));
528 } else {
529 return SkNEW_ARGS(GrGLNormalPathProcessor, (*this, bt));
530 }
201 } 531 }
532
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698