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

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

Issue 367643004: Implement NVPR on GLES (Closed) Base URL: https://skia.googlesource.com/skia.git@02-path-program-fragment
Patch Set: rebase Created 6 years, 4 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 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/GrGLPathRendering.h"
11 #include "gl/GrGLShaderBuilder.h" 12 #include "gl/GrGLShaderBuilder.h"
12 #include "gl/GrGLVertexEffect.h" 13 #include "gl/GrGLVertexEffect.h"
13 #include "gl/GrGpuGL.h" 14 #include "gl/GrGpuGL.h"
14 15
15 typedef GrGLProgramEffects::TransformedCoords TransformedCoords; 16 typedef GrGLProgramEffects::TransformedCoords TransformedCoords;
16 typedef GrGLProgramEffects::TransformedCoordsArray TransformedCoordsArray; 17 typedef GrGLProgramEffects::TransformedCoordsArray TransformedCoordsArray;
17 typedef GrGLProgramEffects::TextureSampler TextureSampler; 18 typedef GrGLProgramEffects::TextureSampler TextureSampler;
18 typedef GrGLProgramEffects::TextureSamplerArray TextureSamplerArray; 19 typedef GrGLProgramEffects::TextureSamplerArray TextureSamplerArray;
19 20
20 /** 21 /**
(...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 } 300 }
300 } 301 }
301 302
302 void GrGLVertexProgramEffects::emitTransforms(GrGLFullShaderBuilder* builder, 303 void GrGLVertexProgramEffects::emitTransforms(GrGLFullShaderBuilder* builder,
303 const GrDrawEffect& drawEffect, 304 const GrDrawEffect& drawEffect,
304 TransformedCoordsArray* outCoords) { 305 TransformedCoordsArray* outCoords) {
305 SkTArray<Transform, true>& transforms = fTransforms.push_back(); 306 SkTArray<Transform, true>& transforms = fTransforms.push_back();
306 uint32_t totalKey = GenTransformKey(drawEffect); 307 uint32_t totalKey = GenTransformKey(drawEffect);
307 int numTransforms = drawEffect.effect()->numTransforms(); 308 int numTransforms = drawEffect.effect()->numTransforms();
308 transforms.push_back_n(numTransforms); 309 transforms.push_back_n(numTransforms);
310
311 SkTArray<PathTransform, true>* pathTransforms = NULL;
312 const GrGLCaps* glCaps = builder->ctxInfo().caps();
313 if (glCaps->pathRenderingSupport() &&
314 builder->gpu()->pathRendering()->caps().fragmentInputGenSupport) {
315 pathTransforms = &fPathTransforms.push_back();
316 pathTransforms->push_back_n(numTransforms);
317 }
318
309 for (int t = 0; t < numTransforms; t++) { 319 for (int t = 0; t < numTransforms; t++) {
310 GrSLType varyingType = kVoid_GrSLType; 320 GrSLType varyingType = kVoid_GrSLType;
311 const char* uniName; 321 const char* uniName;
312 switch (get_matrix_type(totalKey, t)) { 322 switch (get_matrix_type(totalKey, t)) {
313 case kNoPersp_MatrixType: 323 case kNoPersp_MatrixType:
314 uniName = "StageMatrix"; 324 uniName = "StageMatrix";
315 varyingType = kVec2f_GrSLType; 325 varyingType = kVec2f_GrSLType;
316 break; 326 break;
317 case kGeneral_MatrixType: 327 case kGeneral_MatrixType:
318 uniName = "StageMatrix"; 328 uniName = "StageMatrix";
(...skipping 15 matching lines...) Expand all
334 344
335 const char* varyingName = "MatrixCoord"; 345 const char* varyingName = "MatrixCoord";
336 SkString suffixedVaryingName; 346 SkString suffixedVaryingName;
337 if (0 != t) { 347 if (0 != t) {
338 suffixedVaryingName.append(varyingName); 348 suffixedVaryingName.append(varyingName);
339 suffixedVaryingName.appendf("_%i", t); 349 suffixedVaryingName.appendf("_%i", t);
340 varyingName = suffixedVaryingName.c_str(); 350 varyingName = suffixedVaryingName.c_str();
341 } 351 }
342 const char* vsVaryingName; 352 const char* vsVaryingName;
343 const char* fsVaryingName; 353 const char* fsVaryingName;
344 builder->addVarying(varyingType, varyingName, &vsVaryingName, &fsVarying Name); 354
355 if (pathTransforms) {
356 (*pathTransforms)[t].fHandle =
357 builder->addSeparableVarying(varyingType, varyingName, &vsVaryin gName, &fsVaryingName);
358 (*pathTransforms)[t].fType = varyingType;
359 } else {
360 builder->addVarying(varyingType, varyingName, &vsVaryingName, &fsVar yingName);
361 }
362
345 363
346 const GrGLShaderVar& coords = kPosition_GrCoordSet == get_source_coords( totalKey, t) ? 364 const GrGLShaderVar& coords = kPosition_GrCoordSet == get_source_coords( totalKey, t) ?
347 builder->positionAttribute() : 365 builder->positionAttribute() :
348 builder->localCoordsAttribute(); 366 builder->localCoordsAttribute();
349 // varying = matrix * coords (logically) 367 // varying = matrix * coords (logically)
350 SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyingTyp e); 368 SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyingTyp e);
351 if (kVec2f_GrSLType == varyingType) { 369 if (kVec2f_GrSLType == varyingType) {
352 builder->vsCodeAppendf("\t%s = (%s * vec3(%s, 1)).xy;\n", 370 builder->vsCodeAppendf("\t%s = (%s * vec3(%s, 1)).xy;\n",
353 vsVaryingName, uniName, coords.c_str()); 371 vsVaryingName, uniName, coords.c_str());
354 } else { 372 } else {
355 builder->vsCodeAppendf("\t%s = %s * vec3(%s, 1);\n", 373 builder->vsCodeAppendf("\t%s = %s * vec3(%s, 1);\n",
356 vsVaryingName, uniName, coords.c_str()); 374 vsVaryingName, uniName, coords.c_str());
357 } 375 }
358 SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords, 376 SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords,
359 (SkString(fsVaryingName), varyingType)); 377 (SkString(fsVaryingName), varyingType));
360 } 378 }
361 } 379 }
362 380
363 void GrGLVertexProgramEffects::setData(GrGpuGL* gpu, 381 void GrGLVertexProgramEffects::setData(GrGpuGL* gpu,
364 const GrGLProgramDataManager& programReso urceManager, 382 GrGpu::DrawType drawType,
383 const GrGLProgramDataManager& programData Manager,
365 const GrEffectStage* effectStages[]) { 384 const GrEffectStage* effectStages[]) {
366 int numEffects = fGLEffects.count(); 385 int numEffects = fGLEffects.count();
367 SkASSERT(numEffects == fTransforms.count()); 386 SkASSERT(numEffects == fTransforms.count());
368 SkASSERT(numEffects == fSamplers.count()); 387 SkASSERT(numEffects == fSamplers.count());
369 for (int e = 0; e < numEffects; ++e) { 388 for (int e = 0; e < numEffects; ++e) {
370 GrDrawEffect drawEffect(*effectStages[e], fHasExplicitLocalCoords); 389 GrDrawEffect drawEffect(*effectStages[e], fHasExplicitLocalCoords);
371 fGLEffects[e]->setData(programResourceManager, drawEffect); 390 fGLEffects[e]->setData(programDataManager, drawEffect);
372 this->setTransformData(programResourceManager, drawEffect, e); 391 if (GrGpu::IsPathRenderingDrawType(drawType)) {
392 this->setPathTransformData(gpu, programDataManager, drawEffect, e);
393 } else {
394 this->setTransformData(gpu, programDataManager, drawEffect, e);
395 }
396
373 this->bindTextures(gpu, drawEffect.effect(), e); 397 this->bindTextures(gpu, drawEffect.effect(), e);
374 } 398 }
375 } 399 }
376 400
377 void GrGLVertexProgramEffects::setTransformData(const GrGLProgramDataManager& pr ogramResourceManager, 401 void GrGLVertexProgramEffects::setTransformData(GrGpuGL* gpu,
402 const GrGLProgramDataManager& pd man,
378 const GrDrawEffect& drawEffect, 403 const GrDrawEffect& drawEffect,
379 int effectIdx) { 404 int effectIdx) {
380 SkTArray<Transform, true>& transforms = fTransforms[effectIdx]; 405 SkTArray<Transform, true>& transforms = fTransforms[effectIdx];
381 int numTransforms = transforms.count(); 406 int numTransforms = transforms.count();
382 SkASSERT(numTransforms == drawEffect.effect()->numTransforms()); 407 SkASSERT(numTransforms == drawEffect.effect()->numTransforms());
383 for (int t = 0; t < numTransforms; ++t) { 408 for (int t = 0; t < numTransforms; ++t) {
384 SkASSERT(transforms[t].fHandle.isValid()); 409 SkASSERT(transforms[t].fHandle.isValid());
385 const SkMatrix& matrix = get_transform_matrix(drawEffect, t); 410 const SkMatrix& matrix = get_transform_matrix(drawEffect, t);
386 if (!transforms[t].fCurrentValue.cheapEqualTo(matrix)) { 411 if (!transforms[t].fCurrentValue.cheapEqualTo(matrix)) {
387 programResourceManager.setSkMatrix(transforms[t].fHandle, matrix); 412 pdman.setSkMatrix(transforms[t].fHandle, matrix);
388 transforms[t].fCurrentValue = matrix; 413 transforms[t].fCurrentValue = matrix;
389 } 414 }
390 } 415 }
391 } 416 }
392 417
418 void GrGLVertexProgramEffects::setPathTransformData(GrGpuGL* gpu,
419 const GrGLProgramDataManager & pdman,
420 const GrDrawEffect& drawEffe ct,
421 int effectIdx) {
422 SkTArray<PathTransform, true>& transforms = fPathTransforms[effectIdx];
423 int numTransforms = transforms.count();
424 SkASSERT(numTransforms == drawEffect.effect()->numTransforms());
425 for (int t = 0; t < numTransforms; ++t) {
426 SkASSERT(transforms[t].fHandle.isValid());
427 const SkMatrix& transform = get_transform_matrix(drawEffect, t);
428 if (transforms[t].fCurrentValue.cheapEqualTo(transform))
429 continue;
430 transforms[t].fCurrentValue = transform;
431 switch (transforms[t].fType) {
432 case kVec2f_GrSLType: {
433 pdman.setProgramPathFragmentInputTransform(transforms[t].fHandle , 2, transform);
434 break;
435 }
436 case kVec3f_GrSLType: {
437 pdman.setProgramPathFragmentInputTransform(transforms[t].fHandle , 3, transform);
438 break;
439 }
440 default:
441 SkFAIL("Unexpected matrixs type.");
442 }
443 }
444 }
445
393 GrGLVertexProgramEffectsBuilder::GrGLVertexProgramEffectsBuilder(GrGLFullShaderB uilder* builder, 446 GrGLVertexProgramEffectsBuilder::GrGLVertexProgramEffectsBuilder(GrGLFullShaderB uilder* builder,
394 int reserveCoun t) 447 int reserveCoun t)
395 : fBuilder(builder) 448 : fBuilder(builder)
396 , fProgramEffects(SkNEW_ARGS(GrGLVertexProgramEffects, 449 , fProgramEffects(SkNEW_ARGS(GrGLVertexProgramEffects,
397 (reserveCount, fBuilder->hasExplicitLocalCoords ()))) { 450 (reserveCount, fBuilder->hasExplicitLocalCoords ()))) {
398 } 451 }
399 452
400 void GrGLVertexProgramEffectsBuilder::emitEffect(const GrEffectStage& stage, 453 void GrGLVertexProgramEffectsBuilder::emitEffect(const GrEffectStage& stage,
401 const GrEffectKey& key, 454 const GrEffectKey& key,
402 const char* outColor, 455 const char* outColor,
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
448 for (int t = 0; t < numTransforms; ++t) { 501 for (int t = 0; t < numTransforms; ++t) {
449 GrSLType type = kGeneral_MatrixType == get_matrix_type(totalKey, t) ? 502 GrSLType type = kGeneral_MatrixType == get_matrix_type(totalKey, t) ?
450 kVec3f_GrSLType : 503 kVec3f_GrSLType :
451 kVec2f_GrSLType; 504 kVec2f_GrSLType;
452 name.printf("%s(gl_TexCoord[%i])", GrGLSLTypeString(type), texCoordIndex ++); 505 name.printf("%s(gl_TexCoord[%i])", GrGLSLTypeString(type), texCoordIndex ++);
453 SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords, (name, type)); 506 SkNEW_APPEND_TO_TARRAY(outCoords, TransformedCoords, (name, type));
454 } 507 }
455 } 508 }
456 509
457 void GrGLPathTexGenProgramEffects::setData(GrGpuGL* gpu, 510 void GrGLPathTexGenProgramEffects::setData(GrGpuGL* gpu,
458 const GrGLProgramDataManager& programReso urceManager, 511 GrGpu::DrawType,
459 const GrEffectStage* effectStages[]) { 512 const GrGLProgramDataManager& pdman,
513 const GrEffectStage* effectStages[]) {
460 int numEffects = fGLEffects.count(); 514 int numEffects = fGLEffects.count();
461 SkASSERT(numEffects == fTransforms.count()); 515 SkASSERT(numEffects == fTransforms.count());
462 SkASSERT(numEffects == fSamplers.count()); 516 SkASSERT(numEffects == fSamplers.count());
463 for (int e = 0; e < numEffects; ++e) { 517 for (int e = 0; e < numEffects; ++e) {
464 GrDrawEffect drawEffect(*effectStages[e], false); 518 GrDrawEffect drawEffect(*effectStages[e], false);
465 fGLEffects[e]->setData(programResourceManager, drawEffect); 519 fGLEffects[e]->setData(pdman, drawEffect);
466 this->setPathTexGenState(gpu, drawEffect, e); 520 this->setPathTexGenState(gpu, drawEffect, e);
467 this->bindTextures(gpu, drawEffect.effect(), e); 521 this->bindTextures(gpu, drawEffect.effect(), e);
468 } 522 }
469 } 523 }
470 524
471 void GrGLPathTexGenProgramEffects::setPathTexGenState(GrGpuGL* gpu, 525 void GrGLPathTexGenProgramEffects::setPathTexGenState(GrGpuGL* gpu,
472 const GrDrawEffect& drawEffect, 526 const GrDrawEffect& drawEffect,
473 int effectIdx) { 527 int effectIdx) {
474 uint32_t totalKey = fTransforms[effectIdx].fTransformKey; 528 uint32_t totalKey = fTransforms[effectIdx].fTransformKey;
475 int texCoordIndex = fTransforms[effectIdx].fTexCoordIndex; 529 int texCoordIndex = fTransforms[effectIdx].fTexCoordIndex;
(...skipping 28 matching lines...) Expand all
504 } 558 }
505 559
506 void GrGLPathTexGenProgramEffectsBuilder::emitEffect(const GrEffectStage& stage, 560 void GrGLPathTexGenProgramEffectsBuilder::emitEffect(const GrEffectStage& stage,
507 const GrEffectKey& key, 561 const GrEffectKey& key,
508 const char* outColor, 562 const char* outColor,
509 const char* inColor, 563 const char* inColor,
510 int stageIndex) { 564 int stageIndex) {
511 SkASSERT(NULL != fProgramEffects.get()); 565 SkASSERT(NULL != fProgramEffects.get());
512 fProgramEffects->emitEffect(fBuilder, stage, key, outColor, inColor, stageIn dex); 566 fProgramEffects->emitEffect(fBuilder, stage, key, outColor, inColor, stageIn dex);
513 } 567 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698