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

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

Issue 25474006: Move VertexBuilder to a GrGLFullShaderBuilder subclass (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
OLDNEW
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 "GrGLEffectArray.h" 8 #include "GrGLEffectArray.h"
9 #include "GrDrawEffect.h" 9 #include "GrDrawEffect.h"
10 #include "gl/GrGLEffect.h" 10 #include "gl/GrGLEffect.h"
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 SkTArray<Sampler, true>& samplers = fSamplers[e]; 143 SkTArray<Sampler, true>& samplers = fSamplers[e];
144 int numSamplers = samplers.count(); 144 int numSamplers = samplers.count();
145 for (int s = 0; s < numSamplers; ++s) { 145 for (int s = 0; s < numSamplers; ++s) {
146 SkASSERT(samplers[s].fUniform.isValid()); 146 SkASSERT(samplers[s].fUniform.isValid());
147 uniformManager.setSampler(samplers[s].fUniform, *texUnitIdx); 147 uniformManager.setSampler(samplers[s].fUniform, *texUnitIdx);
148 samplers[s].fTextureUnit = (*texUnitIdx)++; 148 samplers[s].fTextureUnit = (*texUnitIdx)++;
149 } 149 }
150 } 150 }
151 } 151 }
152 152
153 void GrGLEffectArray::setData(GrGpuGL* gpu, 153 void GrGLVertexEffectArray::setData(GrGpuGL* gpu,
154 const GrGLUniformManager& uniformManager, 154 const GrGLUniformManager& uniformManager,
155 const GrEffectStage* effectStages[]) { 155 const GrEffectStage* effectStages[]) {
156 int numEffects = fGLEffects.count(); 156 int numEffects = fGLEffects.count();
157 SkASSERT(numEffects == fTransforms.count()); 157 SkASSERT(numEffects == fTransforms.count());
158 SkASSERT(numEffects == fSamplers.count()); 158 SkASSERT(numEffects == fSamplers.count());
159 for (int e = 0; e < numEffects; ++e) { 159 for (int e = 0; e < numEffects; ++e) {
160 GrDrawEffect drawEffect(*effectStages[e], fHasExplicitLocalCoords); 160 GrDrawEffect drawEffect(*effectStages[e], fHasExplicitLocalCoords);
161 fGLEffects[e]->setData(uniformManager, drawEffect); 161 fGLEffects[e]->setData(uniformManager, drawEffect);
162 this->setTransformData(uniformManager, drawEffect, e); 162 this->setTransformData(uniformManager, drawEffect, e);
163 this->bindTextures(gpu, *drawEffect.effect(), e); 163 this->bindTextures(gpu, *drawEffect.effect(), e);
164 } 164 }
165 } 165 }
166 166
167 void GrGLEffectArray::setTransformData(const GrGLUniformManager& uniformManager, 167 void GrGLVertexEffectArray::setTransformData(const GrGLUniformManager& uniformMa nager,
168 const GrDrawEffect& drawEffect, 168 const GrDrawEffect& drawEffect,
169 int effectIdx) { 169 int effectIdx) {
170 SkTArray<Transform, true>& transforms = fTransforms[effectIdx]; 170 SkTArray<Transform, true>& transforms = fTransforms[effectIdx];
171 int numTransforms = transforms.count(); 171 int numTransforms = transforms.count();
172 SkASSERT(numTransforms == (*drawEffect.effect())->numTransforms()); 172 SkASSERT(numTransforms == (*drawEffect.effect())->numTransforms());
173 for (int t = 0; t < numTransforms; ++t) { 173 for (int t = 0; t < numTransforms; ++t) {
174 const GrCoordTransform& coordTransform = (*drawEffect.effect())->coordTr ansform(t); 174 const GrCoordTransform& coordTransform = (*drawEffect.effect())->coordTr ansform(t);
175 const SkMatrix& matrix = coordTransform.getMatrix(); 175 const SkMatrix& matrix = coordTransform.getMatrix();
176 const SkMatrix& coordChangeMatrix = kLocal_GrCoordSet == coordTransform. sourceCoords() ? 176 const SkMatrix& coordChangeMatrix = kLocal_GrCoordSet == coordTransform. sourceCoords() ?
177 drawEffect.getCoordChangeMatrix( ) : 177 drawEffect.getCoordChangeMatrix( ) :
178 SkMatrix::I(); 178 SkMatrix::I();
179 SkASSERT(transforms[t].fHandle.isValid() != (kVoid_GrSLType == transform s[t].fType)); 179 SkASSERT(transforms[t].fHandle.isValid() != (kVoid_GrSLType == transform s[t].fType));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
229 SkASSERT(samplers[s].fTextureUnit >= 0); 229 SkASSERT(samplers[s].fTextureUnit >= 0);
230 const GrTextureAccess& textureAccess = effect->textureAccess(s); 230 const GrTextureAccess& textureAccess = effect->textureAccess(s);
231 gpu->bindTexture(samplers[s].fTextureUnit, 231 gpu->bindTexture(samplers[s].fTextureUnit,
232 textureAccess.getParams(), 232 textureAccess.getParams(),
233 static_cast<GrGLTexture*>(textureAccess.getTexture())); 233 static_cast<GrGLTexture*>(textureAccess.getTexture()));
234 } 234 }
235 } 235 }
236 236
237 //////////////////////////////////////////////////////////////////////////////// 237 ////////////////////////////////////////////////////////////////////////////////
238 238
239 GrGLEffectArrayBuilder::GrGLEffectArrayBuilder(GrGLShaderBuilder* builder, int r eserveCount) 239 GrGLVertexEffectArrayBuilder::GrGLVertexEffectArrayBuilder(GrGLFullShaderBuilder * builder,
240 : fBuilder(builder) { 240 int reserveCount)
241 GrGLShaderBuilder::VertexBuilder* vertexBuilder = fBuilder->getVertexBuilder (); 241 : fBuilder(builder)
242 SkASSERT(NULL != vertexBuilder); 242 , fEffectArray(SkNEW_ARGS(GrGLVertexEffectArray,
243 fEffectArray.reset(SkNEW_ARGS(GrGLEffectArray, 243 (reserveCount, fBuilder->hasExplicitLocalCoords()) )) {
244 (reserveCount, vertexBuilder->hasExplicitLocal Coords())));
245 } 244 }
246 245
247 void GrGLEffectArrayBuilder::emitEffect(const GrEffectStage& stage, 246 void GrGLVertexEffectArrayBuilder::emitEffect(const GrEffectStage& stage,
248 EffectKey key, 247 EffectKey key,
249 const char* outColor, 248 const char* outColor,
250 const char* inColor, 249 const char* inColor,
251 int stageIndex) { 250 int stageIndex) {
252 GrGLShaderBuilder::VertexBuilder* vertexBuilder = fBuilder->getVertexBuilder ();
253 SkASSERT(NULL != vertexBuilder);
254 SkASSERT(NULL != fEffectArray.get()); 251 SkASSERT(NULL != fEffectArray.get());
255 252
256 GrDrawEffect drawEffect(stage, fEffectArray->fHasExplicitLocalCoords); 253 GrDrawEffect drawEffect(stage, fEffectArray->fHasExplicitLocalCoords);
257 const GrEffectRef& effect = *stage.getEffect(); 254 const GrEffectRef& effect = *stage.getEffect();
258 SkSTArray<2, TransformedCoords> coords(effect->numTransforms()); 255 SkSTArray<2, TransformedCoords> coords(effect->numTransforms());
259 SkSTArray<4, TextureSampler> samplers(effect->numTextures()); 256 SkSTArray<4, TextureSampler> samplers(effect->numTextures());
260 257
261 this->emitAttributes(stage); 258 this->emitAttributes(stage);
262 this->emitTransforms(effect, key, &coords); 259 this->emitTransforms(effect, key, &coords);
263 this->emitSamplers(effect, &samplers); 260 INHERITED::emitSamplers(fBuilder, fEffectArray.get(), effect, &samplers);
264 261
265 GrGLEffect* glEffect = effect->getFactory().createGLInstance(drawEffect); 262 GrGLEffect* glEffect = effect->getFactory().createGLInstance(drawEffect);
266 *fEffectArray->fGLEffects.append() = glEffect; 263 *fEffectArray->fGLEffects.append() = glEffect;
267 264
268 // Enclose custom code in a block to avoid namespace conflicts 265 // Enclose custom code in a block to avoid namespace conflicts
269 SkString openBrace; 266 SkString openBrace;
270 openBrace.printf("\t{ // Stage %d: %s\n", stageIndex, glEffect->name()); 267 openBrace.printf("\t{ // Stage %d: %s\n", stageIndex, glEffect->name());
271 vertexBuilder->vsCodeAppend(openBrace.c_str()); 268 fBuilder->vsCodeAppend(openBrace.c_str());
272 fBuilder->fsCodeAppend(openBrace.c_str()); 269 fBuilder->fsCodeAppend(openBrace.c_str());
273 270
274 glEffect->emitCode(fBuilder, drawEffect, key, outColor, inColor, coords, sam plers); 271 glEffect->emitCode(fBuilder, drawEffect, key, outColor, inColor, coords, sam plers);
275 272
276 vertexBuilder->vsCodeAppend("\t}\n"); 273 fBuilder->vsCodeAppend("\t}\n");
277 fBuilder->fsCodeAppend("\t}\n"); 274 fBuilder->fsCodeAppend("\t}\n");
278 } 275 }
279 276
280 void GrGLEffectArrayBuilder::emitAttributes(const GrEffectStage& stage) { 277 void GrGLVertexEffectArrayBuilder::emitAttributes(const GrEffectStage& stage) {
281 GrGLShaderBuilder::VertexBuilder* vertexBuilder = fBuilder->getVertexBuilder ();
282 SkASSERT(NULL != vertexBuilder);
283
284 int numAttributes = stage.getVertexAttribIndexCount(); 278 int numAttributes = stage.getVertexAttribIndexCount();
285 const int* attributeIndices = stage.getVertexAttribIndices(); 279 const int* attributeIndices = stage.getVertexAttribIndices();
286 for (int a = 0; a < numAttributes; ++a) { 280 for (int a = 0; a < numAttributes; ++a) {
287 // TODO: Make addAttribute mangle the name. 281 // TODO: Make addAttribute mangle the name.
288 SkString attributeName("aAttr"); 282 SkString attributeName("aAttr");
289 attributeName.appendS32(attributeIndices[a]); 283 attributeName.appendS32(attributeIndices[a]);
290 vertexBuilder->addEffectAttribute(attributeIndices[a], 284 fBuilder->addEffectAttribute(attributeIndices[a],
291 (*stage.getEffect())->vertexAttribType (a), 285 (*stage.getEffect())->vertexAttribType(a),
292 attributeName); 286 attributeName);
293 } 287 }
294 } 288 }
295 289
296 void GrGLEffectArrayBuilder::emitTransforms(const GrEffectRef& effect, 290 void GrGLVertexEffectArrayBuilder::emitTransforms(const GrEffectRef& effect,
297 EffectKey effectKey, 291 EffectKey effectKey,
298 TransformedCoordsArray* outCoords) { 292 TransformedCoordsArray* outCoo rds) {
299 GrGLShaderBuilder::VertexBuilder* vertexBuilder = fBuilder->getVertexBuilder (); 293 typedef GrGLVertexEffectArray::Transform Transform;
300 SkASSERT(NULL != vertexBuilder);
301
302 typedef GrGLEffectArray::Transform Transform;
303 SkTArray<Transform, true>& transforms = fEffectArray->fTransforms.push_back( ); 294 SkTArray<Transform, true>& transforms = fEffectArray->fTransforms.push_back( );
304 EffectKey totalKey = GrBackendEffectFactory::GetTransformKey(effectKey); 295 EffectKey totalKey = GrBackendEffectFactory::GetTransformKey(effectKey);
305 int numTransforms = effect->numTransforms(); 296 int numTransforms = effect->numTransforms();
306 transforms.push_back_n(numTransforms); 297 transforms.push_back_n(numTransforms);
307 for (int t = 0; t < numTransforms; t++) { 298 for (int t = 0; t < numTransforms; t++) {
308 EffectKey key = (totalKey >> (kTransformKeyBits * t)) & kTransformKeyMas k; 299 EffectKey key = (totalKey >> (kTransformKeyBits * t)) & kTransformKeyMas k;
309 GrSLType varyingType = kVoid_GrSLType; 300 GrSLType varyingType = kVoid_GrSLType;
310 const char* uniName; 301 const char* uniName;
311 switch (key & kMatrixTypeKeyMask) { 302 switch (key & kMatrixTypeKeyMask) {
312 case kIdentity_MatrixType: 303 case kIdentity_MatrixType:
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 338
348 const char* varyingName = "MatrixCoord"; 339 const char* varyingName = "MatrixCoord";
349 SkString suffixedVaryingName; 340 SkString suffixedVaryingName;
350 if (0 != t) { 341 if (0 != t) {
351 suffixedVaryingName.append(varyingName); 342 suffixedVaryingName.append(varyingName);
352 suffixedVaryingName.appendf("_%i", t); 343 suffixedVaryingName.appendf("_%i", t);
353 varyingName = suffixedVaryingName.c_str(); 344 varyingName = suffixedVaryingName.c_str();
354 } 345 }
355 const char* vsVaryingName; 346 const char* vsVaryingName;
356 const char* fsVaryingName; 347 const char* fsVaryingName;
357 vertexBuilder->addVarying(varyingType, varyingName, &vsVaryingName, &fsV aryingName); 348 fBuilder->addVarying(varyingType, varyingName, &vsVaryingName, &fsVaryin gName);
358 349
359 const GrGLShaderVar& coords = (kPositionCoords_Flag & key) ? 350 const GrGLShaderVar& coords = (kPositionCoords_Flag & key) ?
360 vertexBuilder->positionAttribute() : 351 fBuilder->positionAttribute() :
361 vertexBuilder->localCoordsAttribute(); 352 fBuilder->localCoordsAttribute();
362 // varying = matrix * coords (logically) 353 // varying = matrix * coords (logically)
363 switch (transforms[t].fType) { 354 switch (transforms[t].fType) {
364 case kVoid_GrSLType: 355 case kVoid_GrSLType:
365 SkASSERT(kVec2f_GrSLType == varyingType); 356 SkASSERT(kVec2f_GrSLType == varyingType);
366 vertexBuilder->vsCodeAppendf("\t%s = %s;\n", vsVaryingName, coor ds.c_str()); 357 fBuilder->vsCodeAppendf("\t%s = %s;\n", vsVaryingName, coords.c_ str());
367 break; 358 break;
368 case kVec2f_GrSLType: 359 case kVec2f_GrSLType:
369 SkASSERT(kVec2f_GrSLType == varyingType); 360 SkASSERT(kVec2f_GrSLType == varyingType);
370 vertexBuilder->vsCodeAppendf("\t%s = %s + %s;\n", 361 fBuilder->vsCodeAppendf("\t%s = %s + %s;\n",
371 vsVaryingName, uniName, coords.c_st r()); 362 vsVaryingName, uniName, coords.c_str());
372 break; 363 break;
373 case kMat33f_GrSLType: { 364 case kMat33f_GrSLType: {
374 SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == va ryingType); 365 SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == va ryingType);
375 if (kVec2f_GrSLType == varyingType) { 366 if (kVec2f_GrSLType == varyingType) {
376 vertexBuilder->vsCodeAppendf("\t%s = (%s * vec3(%s, 1)).xy;\ n", 367 fBuilder->vsCodeAppendf("\t%s = (%s * vec3(%s, 1)).xy;\n",
377 vsVaryingName, uniName, coords. c_str()); 368 vsVaryingName, uniName, coords.c_str ());
378 } else { 369 } else {
379 vertexBuilder->vsCodeAppendf("\t%s = %s * vec3(%s, 1);\n", 370 fBuilder->vsCodeAppendf("\t%s = %s * vec3(%s, 1);\n",
380 vsVaryingName, uniName, coords. c_str()); 371 vsVaryingName, uniName, coords.c_str ());
381 } 372 }
382 break; 373 break;
383 } 374 }
384 default: 375 default:
385 GrCrash("Unexpected uniform type."); 376 GrCrash("Unexpected uniform type.");
386 } 377 }
387 SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords, 378 SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords,
388 (fsVaryingName, varyingType, vsVaryingName)); 379 (fsVaryingName, varyingType, vsVaryingName));
389 } 380 }
390 } 381 }
391 382
392 void GrGLEffectArrayBuilder::emitSamplers(const GrEffectRef& effect, 383 void GrGLEffectArrayBuilder::emitSamplers(GrGLShaderBuilder* builder,
384 GrGLEffectArray* effectArray,
385 const GrEffectRef& effect,
393 TextureSamplerArray* outSamplers) { 386 TextureSamplerArray* outSamplers) {
394 typedef GrGLEffectArray::Sampler Sampler; 387 typedef GrGLEffectArray::Sampler Sampler;
395 SkTArray<Sampler, true>& samplers = fEffectArray->fSamplers.push_back(); 388 SkTArray<Sampler, true>& samplers = effectArray->fSamplers.push_back();
396 int numTextures = effect->numTextures(); 389 int numTextures = effect->numTextures();
397 samplers.push_back_n(numTextures); 390 samplers.push_back_n(numTextures);
398 SkString name; 391 SkString name;
399 for (int t = 0; t < numTextures; ++t) { 392 for (int t = 0; t < numTextures; ++t) {
400 name.printf("Sampler%d", t); 393 name.printf("Sampler%d", t);
401 samplers[t].fUniform = fBuilder->addUniform(GrGLShaderBuilder::kFragment _Visibility, 394 samplers[t].fUniform = builder->addUniform(GrGLShaderBuilder::kFragment_ Visibility,
402 kSampler2D_GrSLType, 395 kSampler2D_GrSLType,
403 name.c_str()); 396 name.c_str());
404 SkNEW_APPEND_TO_TARRAY(outSamplers, TextureSampler, 397 SkNEW_APPEND_TO_TARRAY(outSamplers, TextureSampler,
405 (samplers[t].fUniform, effect->textureAccess(t))) ; 398 (samplers[t].fUniform, effect->textureAccess(t))) ;
406 } 399 }
407 } 400 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698