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 #include "GrGLProgramEffects.h" | 8 #include "GrGLProgramEffects.h" |
9 #include "GrDrawEffect.h" | 9 #include "GrDrawEffect.h" |
10 #include "gl/GrGLEffect.h" | 10 #include "gl/GrGLEffect.h" |
11 #include "gl/GrGLShaderBuilder.h" | 11 #include "gl/GrGLShaderBuilder.h" |
12 #include "gl/GrGLVertexEffect.h" | 12 #include "gl/GrGLVertexEffect.h" |
13 #include "gl/GrGpuGL.h" | 13 #include "gl/GrGpuGL.h" |
14 | 14 |
15 typedef GrGLProgramEffects::EffectKey EffectKey; | |
16 typedef GrGLProgramEffects::TransformedCoords TransformedCoords; | 15 typedef GrGLProgramEffects::TransformedCoords TransformedCoords; |
17 typedef GrGLProgramEffects::TransformedCoordsArray TransformedCoordsArray; | 16 typedef GrGLProgramEffects::TransformedCoordsArray TransformedCoordsArray; |
18 typedef GrGLProgramEffects::TextureSampler TextureSampler; | 17 typedef GrGLProgramEffects::TextureSampler TextureSampler; |
19 typedef GrGLProgramEffects::TextureSamplerArray TextureSamplerArray; | 18 typedef GrGLProgramEffects::TextureSamplerArray TextureSamplerArray; |
20 | 19 |
21 /** | 20 /** |
22 * We specialize the vertex code for each of these matrix types. | 21 * We specialize the vertex code for each of these matrix types. |
23 */ | 22 */ |
24 enum MatrixType { | 23 enum MatrixType { |
25 kNoPersp_MatrixType = 0, | 24 kNoPersp_MatrixType = 0, |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 // alpha-only textures smear alpha across all four channels when rea
d. | 61 // alpha-only textures smear alpha across all four channels when rea
d. |
63 return true; | 62 return true; |
64 } | 63 } |
65 } | 64 } |
66 return false; | 65 return false; |
67 } | 66 } |
68 | 67 |
69 /** | 68 /** |
70 * Retrieves the matrix type from transformKey for the transform at transformIdx
. | 69 * Retrieves the matrix type from transformKey for the transform at transformIdx
. |
71 */ | 70 */ |
72 MatrixType get_matrix_type(EffectKey transformKey, int transformIdx) { | 71 MatrixType get_matrix_type(uint32_t transformKey, int transformIdx) { |
73 return static_cast<MatrixType>( | 72 return static_cast<MatrixType>( |
74 (transformKey >> (kTransformKeyBits * transformIdx)) & kMatrixTyp
eKeyMask); | 73 (transformKey >> (kTransformKeyBits * transformIdx)) & kMatrixTyp
eKeyMask); |
75 } | 74 } |
76 | 75 |
77 /** | 76 /** |
78 * Retrieves the source coords from transformKey for the transform at transformI
dx. It may not be | 77 * Retrieves the source coords from transformKey for the transform at transformI
dx. It may not be |
79 * the same coordinate set as the original GrCoordTransform if the position and
local coords are | 78 * the same coordinate set as the original GrCoordTransform if the position and
local coords are |
80 * identical for this program. | 79 * identical for this program. |
81 */ | 80 */ |
82 GrCoordSet get_source_coords(EffectKey transformKey, int transformIdx) { | 81 GrCoordSet get_source_coords(uint32_t transformKey, int transformIdx) { |
83 return (transformKey >> (kTransformKeyBits * transformIdx)) & kPositionCoord
s_Flag ? | 82 return (transformKey >> (kTransformKeyBits * transformIdx)) & kPositionCoord
s_Flag ? |
84 kPosition_GrCoordSet : | 83 kPosition_GrCoordSet : |
85 kLocal_GrCoordSet; | 84 kLocal_GrCoordSet; |
86 } | 85 } |
87 | 86 |
88 /** | 87 /** |
89 * Retrieves the final matrix that a transform needs to apply to its source coor
ds. | 88 * Retrieves the final matrix that a transform needs to apply to its source coor
ds. |
90 */ | 89 */ |
91 SkMatrix get_transform_matrix(const GrDrawEffect& drawEffect, int transformIdx)
{ | 90 SkMatrix get_transform_matrix(const GrDrawEffect& drawEffect, int transformIdx)
{ |
92 const GrCoordTransform& coordTransform = drawEffect.effect()->coordTransform
(transformIdx); | 91 const GrCoordTransform& coordTransform = drawEffect.effect()->coordTransform
(transformIdx); |
(...skipping 17 matching lines...) Expand all Loading... |
110 return combined; | 109 return combined; |
111 } | 110 } |
112 | 111 |
113 } | 112 } |
114 | 113 |
115 //////////////////////////////////////////////////////////////////////////////// | 114 //////////////////////////////////////////////////////////////////////////////// |
116 | 115 |
117 bool GrGLProgramEffects::GenEffectMetaKey(const GrDrawEffect& drawEffect, const
GrGLCaps& caps, | 116 bool GrGLProgramEffects::GenEffectMetaKey(const GrDrawEffect& drawEffect, const
GrGLCaps& caps, |
118 GrEffectKeyBuilder* b) { | 117 GrEffectKeyBuilder* b) { |
119 | 118 |
120 EffectKey textureKey = GrGLProgramEffects::GenTextureKey(drawEffect, caps); | 119 uint32_t textureKey = GrGLProgramEffects::GenTextureKey(drawEffect, caps); |
121 EffectKey transformKey = GrGLProgramEffects::GenTransformKey(drawEffect); | 120 uint32_t transformKey = GrGLProgramEffects::GenTransformKey(drawEffect); |
122 EffectKey attribKey = GrGLProgramEffects::GenAttribKey(drawEffect); | 121 uint32_t attribKey = GrGLProgramEffects::GenAttribKey(drawEffect); |
123 uint32_t classID = drawEffect.effect()->getFactory().effectClassID(); | 122 uint32_t classID = drawEffect.effect()->getFactory().effectClassID(); |
124 | 123 |
125 // Currently we allow 16 bits for each of the above portions of the meta-key
. Fail if they | 124 // Currently we allow 16 bits for each of the above portions of the meta-key
. Fail if they |
126 // don't fit. | 125 // don't fit. |
127 static const uint32_t kMetaKeyInvalidMask = ~((uint32_t) SK_MaxU16); | 126 static const uint32_t kMetaKeyInvalidMask = ~((uint32_t) SK_MaxU16); |
128 if ((textureKey | transformKey | attribKey | classID) & kMetaKeyInvalidMask)
{ | 127 if ((textureKey | transformKey | attribKey | classID) & kMetaKeyInvalidMask)
{ |
129 return false; | 128 return false; |
130 } | 129 } |
131 | 130 |
132 uint32_t* key = b->add32n(2); | 131 uint32_t* key = b->add32n(2); |
133 key[0] = (textureKey << 16 | transformKey); | 132 key[0] = (textureKey << 16 | transformKey); |
134 key[1] = (classID << 16 | attribKey); | 133 key[1] = (classID << 16 | attribKey); |
135 return true; | 134 return true; |
136 } | 135 } |
137 | 136 |
138 EffectKey GrGLProgramEffects::GenAttribKey(const GrDrawEffect& drawEffect) { | 137 uint32_t GrGLProgramEffects::GenAttribKey(const GrDrawEffect& drawEffect) { |
139 EffectKey key = 0; | 138 uint32_t key = 0; |
140 int numAttributes = drawEffect.getVertexAttribIndexCount(); | 139 int numAttributes = drawEffect.getVertexAttribIndexCount(); |
141 SkASSERT(numAttributes <= 2); | 140 SkASSERT(numAttributes <= 2); |
142 const int* attributeIndices = drawEffect.getVertexAttribIndices(); | 141 const int* attributeIndices = drawEffect.getVertexAttribIndices(); |
143 for (int a = 0; a < numAttributes; ++a) { | 142 for (int a = 0; a < numAttributes; ++a) { |
144 EffectKey value = attributeIndices[a] << 3 * a; | 143 uint32_t value = attributeIndices[a] << 3 * a; |
145 SkASSERT(0 == (value & key)); // keys for each attribute ought not to ov
erlap | 144 SkASSERT(0 == (value & key)); // keys for each attribute ought not to ov
erlap |
146 key |= value; | 145 key |= value; |
147 } | 146 } |
148 return key; | 147 return key; |
149 } | 148 } |
150 | 149 |
151 EffectKey GrGLProgramEffects::GenTransformKey(const GrDrawEffect& drawEffect) { | 150 uint32_t GrGLProgramEffects::GenTransformKey(const GrDrawEffect& drawEffect) { |
152 EffectKey totalKey = 0; | 151 uint32_t totalKey = 0; |
153 int numTransforms = drawEffect.effect()->numTransforms(); | 152 int numTransforms = drawEffect.effect()->numTransforms(); |
154 for (int t = 0; t < numTransforms; ++t) { | 153 for (int t = 0; t < numTransforms; ++t) { |
155 EffectKey key = 0; | 154 uint32_t key = 0; |
156 const GrCoordTransform& coordTransform = drawEffect.effect()->coordTrans
form(t); | 155 const GrCoordTransform& coordTransform = drawEffect.effect()->coordTrans
form(t); |
157 SkMatrix::TypeMask type0 = coordTransform.getMatrix().getType(); | 156 SkMatrix::TypeMask type0 = coordTransform.getMatrix().getType(); |
158 SkMatrix::TypeMask type1; | 157 SkMatrix::TypeMask type1; |
159 if (kLocal_GrCoordSet == coordTransform.sourceCoords()) { | 158 if (kLocal_GrCoordSet == coordTransform.sourceCoords()) { |
160 type1 = drawEffect.getCoordChangeMatrix().getType(); | 159 type1 = drawEffect.getCoordChangeMatrix().getType(); |
161 } else { | 160 } else { |
162 if (drawEffect.programHasExplicitLocalCoords()) { | 161 if (drawEffect.programHasExplicitLocalCoords()) { |
163 // We only make the key indicate that device coords are referenc
ed when the local coords | 162 // We only make the key indicate that device coords are referenc
ed when the local coords |
164 // are not actually determined by positions. Otherwise the local
coords var and position | 163 // are not actually determined by positions. Otherwise the local
coords var and position |
165 // var are identical. | 164 // var are identical. |
166 key |= kPositionCoords_Flag; | 165 key |= kPositionCoords_Flag; |
167 } | 166 } |
168 type1 = SkMatrix::kIdentity_Mask; | 167 type1 = SkMatrix::kIdentity_Mask; |
169 } | 168 } |
170 | 169 |
171 int combinedTypes = type0 | type1; | 170 int combinedTypes = type0 | type1; |
172 | 171 |
173 if (SkMatrix::kPerspective_Mask & combinedTypes) { | 172 if (SkMatrix::kPerspective_Mask & combinedTypes) { |
174 key |= kGeneral_MatrixType; | 173 key |= kGeneral_MatrixType; |
175 } else { | 174 } else { |
176 key |= kNoPersp_MatrixType; | 175 key |= kNoPersp_MatrixType; |
177 } | 176 } |
178 key <<= kTransformKeyBits * t; | 177 key <<= kTransformKeyBits * t; |
179 SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to
overlap | 178 SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to
overlap |
180 totalKey |= key; | 179 totalKey |= key; |
181 } | 180 } |
182 return totalKey; | 181 return totalKey; |
183 } | 182 } |
184 | 183 |
185 EffectKey GrGLProgramEffects::GenTextureKey(const GrDrawEffect& drawEffect, cons
t GrGLCaps& caps) { | 184 uint32_t GrGLProgramEffects::GenTextureKey(const GrDrawEffect& drawEffect, const
GrGLCaps& caps) { |
186 EffectKey key = 0; | 185 uint32_t key = 0; |
187 int numTextures = drawEffect.effect()->numTextures(); | 186 int numTextures = drawEffect.effect()->numTextures(); |
188 for (int t = 0; t < numTextures; ++t) { | 187 for (int t = 0; t < numTextures; ++t) { |
189 const GrTextureAccess& access = drawEffect.effect()->textureAccess(t); | 188 const GrTextureAccess& access = drawEffect.effect()->textureAccess(t); |
190 uint32_t configComponentMask = GrPixelConfigComponentMask(access.getText
ure()->config()); | 189 uint32_t configComponentMask = GrPixelConfigComponentMask(access.getText
ure()->config()); |
191 if (swizzle_requires_alpha_remapping(caps, configComponentMask, access.s
wizzleMask())) { | 190 if (swizzle_requires_alpha_remapping(caps, configComponentMask, access.s
wizzleMask())) { |
192 key |= 1 << t; | 191 key |= 1 << t; |
193 } | 192 } |
194 } | 193 } |
195 return key; | 194 return key; |
196 } | 195 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 gpu->bindTexture(samplers[s].fTextureUnit, | 242 gpu->bindTexture(samplers[s].fTextureUnit, |
244 textureAccess.getParams(), | 243 textureAccess.getParams(), |
245 static_cast<GrGLTexture*>(textureAccess.getTexture())); | 244 static_cast<GrGLTexture*>(textureAccess.getTexture())); |
246 } | 245 } |
247 } | 246 } |
248 | 247 |
249 //////////////////////////////////////////////////////////////////////////////// | 248 //////////////////////////////////////////////////////////////////////////////// |
250 | 249 |
251 void GrGLVertexProgramEffects::emitEffect(GrGLFullShaderBuilder* builder, | 250 void GrGLVertexProgramEffects::emitEffect(GrGLFullShaderBuilder* builder, |
252 const GrEffectStage& stage, | 251 const GrEffectStage& stage, |
253 EffectKey key, | 252 const GrEffectKey& key, |
254 const char* outColor, | 253 const char* outColor, |
255 const char* inColor, | 254 const char* inColor, |
256 int stageIndex) { | 255 int stageIndex) { |
257 GrDrawEffect drawEffect(stage, fHasExplicitLocalCoords); | 256 GrDrawEffect drawEffect(stage, fHasExplicitLocalCoords); |
258 const GrEffect* effect = stage.getEffect(); | 257 const GrEffect* effect = stage.getEffect(); |
259 SkSTArray<2, TransformedCoords> coords(effect->numTransforms()); | 258 SkSTArray<2, TransformedCoords> coords(effect->numTransforms()); |
260 SkSTArray<4, TextureSampler> samplers(effect->numTextures()); | 259 SkSTArray<4, TextureSampler> samplers(effect->numTextures()); |
261 | 260 |
262 this->emitAttributes(builder, stage); | 261 this->emitAttributes(builder, stage); |
263 this->emitTransforms(builder, drawEffect, &coords); | 262 this->emitTransforms(builder, drawEffect, &coords); |
(...skipping 30 matching lines...) Expand all Loading... |
294 builder->addEffectAttribute(attributeIndices[a], | 293 builder->addEffectAttribute(attributeIndices[a], |
295 stage.getEffect()->vertexAttribType(a), | 294 stage.getEffect()->vertexAttribType(a), |
296 attributeName); | 295 attributeName); |
297 } | 296 } |
298 } | 297 } |
299 | 298 |
300 void GrGLVertexProgramEffects::emitTransforms(GrGLFullShaderBuilder* builder, | 299 void GrGLVertexProgramEffects::emitTransforms(GrGLFullShaderBuilder* builder, |
301 const GrDrawEffect& drawEffect, | 300 const GrDrawEffect& drawEffect, |
302 TransformedCoordsArray* outCoords)
{ | 301 TransformedCoordsArray* outCoords)
{ |
303 SkTArray<Transform, true>& transforms = fTransforms.push_back(); | 302 SkTArray<Transform, true>& transforms = fTransforms.push_back(); |
304 EffectKey totalKey = GenTransformKey(drawEffect); | 303 uint32_t totalKey = GenTransformKey(drawEffect); |
305 int numTransforms = drawEffect.effect()->numTransforms(); | 304 int numTransforms = drawEffect.effect()->numTransforms(); |
306 transforms.push_back_n(numTransforms); | 305 transforms.push_back_n(numTransforms); |
307 for (int t = 0; t < numTransforms; t++) { | 306 for (int t = 0; t < numTransforms; t++) { |
308 GrSLType varyingType = kVoid_GrSLType; | 307 GrSLType varyingType = kVoid_GrSLType; |
309 const char* uniName; | 308 const char* uniName; |
310 switch (get_matrix_type(totalKey, t)) { | 309 switch (get_matrix_type(totalKey, t)) { |
311 case kNoPersp_MatrixType: | 310 case kNoPersp_MatrixType: |
312 uniName = "StageMatrix"; | 311 uniName = "StageMatrix"; |
313 varyingType = kVec2f_GrSLType; | 312 varyingType = kVec2f_GrSLType; |
314 break; | 313 break; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 } | 388 } |
390 | 389 |
391 GrGLVertexProgramEffectsBuilder::GrGLVertexProgramEffectsBuilder(GrGLFullShaderB
uilder* builder, | 390 GrGLVertexProgramEffectsBuilder::GrGLVertexProgramEffectsBuilder(GrGLFullShaderB
uilder* builder, |
392 int reserveCoun
t) | 391 int reserveCoun
t) |
393 : fBuilder(builder) | 392 : fBuilder(builder) |
394 , fProgramEffects(SkNEW_ARGS(GrGLVertexProgramEffects, | 393 , fProgramEffects(SkNEW_ARGS(GrGLVertexProgramEffects, |
395 (reserveCount, fBuilder->hasExplicitLocalCoords
()))) { | 394 (reserveCount, fBuilder->hasExplicitLocalCoords
()))) { |
396 } | 395 } |
397 | 396 |
398 void GrGLVertexProgramEffectsBuilder::emitEffect(const GrEffectStage& stage, | 397 void GrGLVertexProgramEffectsBuilder::emitEffect(const GrEffectStage& stage, |
399 GrGLProgramEffects::EffectKey k
ey, | 398 const GrEffectKey& key, |
400 const char* outColor, | 399 const char* outColor, |
401 const char* inColor, | 400 const char* inColor, |
402 int stageIndex) { | 401 int stageIndex) { |
403 SkASSERT(NULL != fProgramEffects.get()); | 402 SkASSERT(NULL != fProgramEffects.get()); |
404 fProgramEffects->emitEffect(fBuilder, stage, key, outColor, inColor, stageIn
dex); | 403 fProgramEffects->emitEffect(fBuilder, stage, key, outColor, inColor, stageIn
dex); |
405 } | 404 } |
406 | 405 |
407 //////////////////////////////////////////////////////////////////////////////// | 406 //////////////////////////////////////////////////////////////////////////////// |
408 | 407 |
409 void GrGLPathTexGenProgramEffects::emitEffect(GrGLFragmentOnlyShaderBuilder* bui
lder, | 408 void GrGLPathTexGenProgramEffects::emitEffect(GrGLFragmentOnlyShaderBuilder* bui
lder, |
410 const GrEffectStage& stage, | 409 const GrEffectStage& stage, |
411 EffectKey key, | 410 const GrEffectKey& key, |
412 const char* outColor, | 411 const char* outColor, |
413 const char* inColor, | 412 const char* inColor, |
414 int stageIndex) { | 413 int stageIndex) { |
415 GrDrawEffect drawEffect(stage, false); | 414 GrDrawEffect drawEffect(stage, false); |
416 const GrEffect* effect = stage.getEffect(); | 415 const GrEffect* effect = stage.getEffect(); |
417 SkSTArray<2, TransformedCoords> coords(effect->numTransforms()); | 416 SkSTArray<2, TransformedCoords> coords(effect->numTransforms()); |
418 SkSTArray<4, TextureSampler> samplers(effect->numTextures()); | 417 SkSTArray<4, TextureSampler> samplers(effect->numTextures()); |
419 | 418 |
420 SkASSERT(0 == stage.getVertexAttribIndexCount()); | 419 SkASSERT(0 == stage.getVertexAttribIndexCount()); |
421 this->setupPathTexGen(builder, drawEffect, &coords); | 420 this->setupPathTexGen(builder, drawEffect, &coords); |
(...skipping 10 matching lines...) Expand all Loading... |
432 SkASSERT(!glEffect->isVertexEffect()); | 431 SkASSERT(!glEffect->isVertexEffect()); |
433 glEffect->emitCode(builder, drawEffect, key, outColor, inColor, coords, samp
lers); | 432 glEffect->emitCode(builder, drawEffect, key, outColor, inColor, coords, samp
lers); |
434 | 433 |
435 builder->fsCodeAppend("\t}\n"); | 434 builder->fsCodeAppend("\t}\n"); |
436 } | 435 } |
437 | 436 |
438 void GrGLPathTexGenProgramEffects::setupPathTexGen(GrGLFragmentOnlyShaderBuilder
* builder, | 437 void GrGLPathTexGenProgramEffects::setupPathTexGen(GrGLFragmentOnlyShaderBuilder
* builder, |
439 const GrDrawEffect& drawEffect, | 438 const GrDrawEffect& drawEffect, |
440 TransformedCoordsArray* outCoords) { | 439 TransformedCoordsArray* outCoords) { |
441 int numTransforms = drawEffect.effect()->numTransforms(); | 440 int numTransforms = drawEffect.effect()->numTransforms(); |
442 EffectKey totalKey = GenTransformKey(drawEffect); | 441 uint32_t totalKey = GenTransformKey(drawEffect); |
443 int texCoordIndex = builder->addTexCoordSets(numTransforms); | 442 int texCoordIndex = builder->addTexCoordSets(numTransforms); |
444 SkNEW_APPEND_TO_TARRAY(&fTransforms, Transforms, (totalKey, texCoordIndex)); | 443 SkNEW_APPEND_TO_TARRAY(&fTransforms, Transforms, (totalKey, texCoordIndex)); |
445 SkString name; | 444 SkString name; |
446 for (int t = 0; t < numTransforms; ++t) { | 445 for (int t = 0; t < numTransforms; ++t) { |
447 GrSLType type = kGeneral_MatrixType == get_matrix_type(totalKey, t) ? | 446 GrSLType type = kGeneral_MatrixType == get_matrix_type(totalKey, t) ? |
448 kVec3f_GrSLType : | 447 kVec3f_GrSLType : |
449 kVec2f_GrSLType; | 448 kVec2f_GrSLType; |
450 name.printf("%s(gl_TexCoord[%i])", GrGLSLTypeString(type), texCoordIndex
++); | 449 name.printf("%s(gl_TexCoord[%i])", GrGLSLTypeString(type), texCoordIndex
++); |
451 SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords, (name, type)); | 450 SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords, (name, type)); |
452 } | 451 } |
453 } | 452 } |
454 | 453 |
455 void GrGLPathTexGenProgramEffects::setData(GrGpuGL* gpu, | 454 void GrGLPathTexGenProgramEffects::setData(GrGpuGL* gpu, |
456 const GrGLUniformManager& uniformManager, | 455 const GrGLUniformManager& uniformManager, |
457 const GrEffectStage* effectStages[]) { | 456 const GrEffectStage* effectStages[]) { |
458 int numEffects = fGLEffects.count(); | 457 int numEffects = fGLEffects.count(); |
459 SkASSERT(numEffects == fTransforms.count()); | 458 SkASSERT(numEffects == fTransforms.count()); |
460 SkASSERT(numEffects == fSamplers.count()); | 459 SkASSERT(numEffects == fSamplers.count()); |
461 for (int e = 0; e < numEffects; ++e) { | 460 for (int e = 0; e < numEffects; ++e) { |
462 GrDrawEffect drawEffect(*effectStages[e], false); | 461 GrDrawEffect drawEffect(*effectStages[e], false); |
463 fGLEffects[e]->setData(uniformManager, drawEffect); | 462 fGLEffects[e]->setData(uniformManager, drawEffect); |
464 this->setPathTexGenState(gpu, drawEffect, e); | 463 this->setPathTexGenState(gpu, drawEffect, e); |
465 this->bindTextures(gpu, drawEffect.effect(), e); | 464 this->bindTextures(gpu, drawEffect.effect(), e); |
466 } | 465 } |
467 } | 466 } |
468 | 467 |
469 void GrGLPathTexGenProgramEffects::setPathTexGenState(GrGpuGL* gpu, | 468 void GrGLPathTexGenProgramEffects::setPathTexGenState(GrGpuGL* gpu, |
470 const GrDrawEffect& drawEffect, | 469 const GrDrawEffect& drawEffect, |
471 int effectIdx) { | 470 int effectIdx) { |
472 EffectKey totalKey = fTransforms[effectIdx].fTransformKey; | 471 uint32_t totalKey = fTransforms[effectIdx].fTransformKey; |
473 int texCoordIndex = fTransforms[effectIdx].fTexCoordIndex; | 472 int texCoordIndex = fTransforms[effectIdx].fTexCoordIndex; |
474 int numTransforms = drawEffect.effect()->numTransforms(); | 473 int numTransforms = drawEffect.effect()->numTransforms(); |
475 for (int t = 0; t < numTransforms; ++t) { | 474 for (int t = 0; t < numTransforms; ++t) { |
476 switch (get_matrix_type(totalKey, t)) { | 475 switch (get_matrix_type(totalKey, t)) { |
477 case kNoPersp_MatrixType: { | 476 case kNoPersp_MatrixType: { |
478 const SkMatrix& transform = get_transform_matrix(drawEffect, t); | 477 const SkMatrix& transform = get_transform_matrix(drawEffect, t); |
479 gpu->enablePathTexGen(texCoordIndex++, | 478 gpu->enablePathTexGen(texCoordIndex++, |
480 GrGpuGL::kST_PathTexGenComponents, | 479 GrGpuGL::kST_PathTexGenComponents, |
481 transform); | 480 transform); |
482 break; | 481 break; |
(...skipping 12 matching lines...) Expand all Loading... |
495 } | 494 } |
496 | 495 |
497 GrGLPathTexGenProgramEffectsBuilder::GrGLPathTexGenProgramEffectsBuilder( | 496 GrGLPathTexGenProgramEffectsBuilder::GrGLPathTexGenProgramEffectsBuilder( |
498 GrGLFragmentOnlyShaderBuilder* builder, | 497 GrGLFragmentOnlyShaderBuilder* builder, |
499 int reserveCount) | 498 int reserveCount) |
500 : fBuilder(builder) | 499 : fBuilder(builder) |
501 , fProgramEffects(SkNEW_ARGS(GrGLPathTexGenProgramEffects, (reserveCount)))
{ | 500 , fProgramEffects(SkNEW_ARGS(GrGLPathTexGenProgramEffects, (reserveCount)))
{ |
502 } | 501 } |
503 | 502 |
504 void GrGLPathTexGenProgramEffectsBuilder::emitEffect(const GrEffectStage& stage, | 503 void GrGLPathTexGenProgramEffectsBuilder::emitEffect(const GrEffectStage& stage, |
505 GrGLProgramEffects::EffectK
ey key, | 504 const GrEffectKey& key, |
506 const char* outColor, | 505 const char* outColor, |
507 const char* inColor, | 506 const char* inColor, |
508 int stageIndex) { | 507 int stageIndex) { |
509 SkASSERT(NULL != fProgramEffects.get()); | 508 SkASSERT(NULL != fProgramEffects.get()); |
510 fProgramEffects->emitEffect(fBuilder, stage, key, outColor, inColor, stageIn
dex); | 509 fProgramEffects->emitEffect(fBuilder, stage, key, outColor, inColor, stageIn
dex); |
511 } | 510 } |
OLD | NEW |