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/GrGLProgram.cpp

Issue 23464082: Revert "Add a requiresVertexShader method to GrGLEffect" (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 years, 3 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/GrGLProgram.h ('k') | src/gpu/gl/GrGLShaderBuilder.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 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 "GrGLProgram.h" 8 #include "GrGLProgram.h"
9 9
10 #include "GrAllocator.h" 10 #include "GrAllocator.h"
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after
439 } 439 }
440 440
441 return true; 441 return true;
442 } 442 }
443 443
444 bool GrGLProgram::genProgram(const GrEffectStage* colorStages[], 444 bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
445 const GrEffectStage* coverageStages[]) { 445 const GrEffectStage* coverageStages[]) {
446 SkASSERT(0 == fProgramID); 446 SkASSERT(0 == fProgramID);
447 447
448 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); 448 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
449 bool hasExplicitLocalCoords = -1 != header.fLocalCoordAttributeIndex;
450 449
451 // Get the coeffs for the Mode-based color filter, determine if color is nee ded. 450 bool needsVertexShader = true;
452 SkXfermode::Coeff colorCoeff;
453 SkXfermode::Coeff filterColorCoeff;
454 SkAssertResult(
455 SkXfermode::ModeAsCoeff(static_cast<SkXfermode::Mode>(header.fColorFilte rXfermode),
456 &filterColorCoeff,
457 &colorCoeff));
458 bool needColor, needFilterColor;
459 need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor );
460 451
461 // Create the GL effects. 452 GrGLShaderBuilder builder(fGpu->ctxInfo(), fUniformManager, fDesc, needsVert exShader);
462 bool hasVertexShaderEffects = false;
463
464 SkTArray<GrDrawEffect> colorDrawEffects(needColor ? fDesc.numColorEffects() : 0);
465 if (needColor) {
466 this->buildGLEffects(&GrGLProgram::fColorEffects, colorStages, fDesc.num ColorEffects(),
467 hasExplicitLocalCoords, &colorDrawEffects, &hasVert exShaderEffects);
468 }
469
470 SkTArray<GrDrawEffect> coverageDrawEffects(fDesc.numCoverageEffects());
471 this->buildGLEffects(&GrGLProgram::fCoverageEffects, coverageStages, fDesc.n umCoverageEffects(),
472 hasExplicitLocalCoords, &coverageDrawEffects, &hasVerte xShaderEffects);
473
474 GrGLShaderBuilder builder(fGpu->ctxInfo(), fUniformManager, fDesc, hasVertex ShaderEffects);
475 453
476 if (GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder.getVertexBuild er()) { 454 if (GrGLShaderBuilder::VertexBuilder* vertexBuilder = builder.getVertexBuild er()) {
477 const char* viewMName; 455 const char* viewMName;
478 fUniformHandles.fViewMatrixUni = builder.addUniform(GrGLShaderBuilder::k Vertex_Visibility, 456 fUniformHandles.fViewMatrixUni = builder.addUniform(GrGLShaderBuilder::k Vertex_Visibility,
479 kMat33f_GrSLType, "V iewM", &viewMName); 457 kMat33f_GrSLType, "V iewM", &viewMName);
480 458
481 vertexBuilder->vsCodeAppendf("\tvec3 pos3 = %s * vec3(%s, 1);\n" 459 vertexBuilder->vsCodeAppendf("\tvec3 pos3 = %s * vec3(%s, 1);\n"
482 "\tgl_Position = vec4(pos3.xy, 0, pos3.z);\ n", 460 "\tgl_Position = vec4(pos3.xy, 0, pos3.z);\ n",
483 viewMName, vertexBuilder->positionAttribute ().c_str()); 461 viewMName, vertexBuilder->positionAttribute ().c_str());
484 462
(...skipping 16 matching lines...) Expand all
501 declared_color_output_name(), 479 declared_color_output_name(),
502 &colorOutput); 480 &colorOutput);
503 if (isColorDeclared) { 481 if (isColorDeclared) {
504 builder.fsOutputAppend(colorOutput); 482 builder.fsOutputAppend(colorOutput);
505 } 483 }
506 484
507 // incoming color to current stage being processed. 485 // incoming color to current stage being processed.
508 SkString inColor; 486 SkString inColor;
509 GrSLConstantVec knownColorValue = this->genInputColor(&builder, &inColor); 487 GrSLConstantVec knownColorValue = this->genInputColor(&builder, &inColor);
510 488
489 // Get the coeffs for the Mode-based color filter, determine if color is nee ded.
490 SkXfermode::Coeff colorCoeff;
491 SkXfermode::Coeff filterColorCoeff;
492 SkAssertResult(
493 SkXfermode::ModeAsCoeff(static_cast<SkXfermode::Mode>(header.fColorFilte rXfermode),
494 &filterColorCoeff,
495 &colorCoeff));
496 bool needColor, needFilterColor;
497 need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor );
498
511 // used in order for builder to return the per-stage uniform handles. 499 // used in order for builder to return the per-stage uniform handles.
512 typedef SkTArray<GrGLUniformManager::UniformHandle, true>* UniHandleArrayPtr ; 500 typedef SkTArray<GrGLUniformManager::UniformHandle, true>* UniHandleArrayPtr ;
513 int maxColorOrCovEffectCnt = GrMax(fDesc.numColorEffects(), fDesc.numCoverag eEffects()); 501 int maxColorOrCovEffectCnt = GrMax(fDesc.numColorEffects(), fDesc.numCoverag eEffects());
514 SkAutoTArray<UniHandleArrayPtr> effectUniformArrays(maxColorOrCovEffectCnt); 502 SkAutoTArray<UniHandleArrayPtr> effectUniformArrays(maxColorOrCovEffectCnt);
515 SkAutoTArray<GrGLEffect*> glEffects(maxColorOrCovEffectCnt); 503 SkAutoTArray<GrGLEffect*> glEffects(maxColorOrCovEffectCnt);
516 504
517 if (needColor) { 505 if (needColor) {
518 for (int e = 0; e < fDesc.numColorEffects(); ++e) { 506 for (int e = 0; e < fDesc.numColorEffects(); ++e) {
519 glEffects[e] = fColorEffects[e].fGLEffect;
520 effectUniformArrays[e] = &fColorEffects[e].fSamplerUnis; 507 effectUniformArrays[e] = &fColorEffects[e].fSamplerUnis;
521 } 508 }
522 509
523 builder.emitEffects(glEffects.get(), 510 builder.emitEffects(colorStages,
524 colorDrawEffects.begin(),
525 fDesc.effectKeys(), 511 fDesc.effectKeys(),
526 fDesc.numColorEffects(), 512 fDesc.numColorEffects(),
527 &inColor, 513 &inColor,
528 &knownColorValue, 514 &knownColorValue,
529 effectUniformArrays.get()); 515 effectUniformArrays.get(),
516 glEffects.get());
517
518 for (int e = 0; e < fDesc.numColorEffects(); ++e) {
519 fColorEffects[e].fGLEffect = glEffects[e];
520 }
530 } 521 }
531 522
532 // Insert the color filter. This will soon be replaced by a color effect. 523 // Insert the color filter. This will soon be replaced by a color effect.
533 if (SkXfermode::kDst_Mode != header.fColorFilterXfermode) { 524 if (SkXfermode::kDst_Mode != header.fColorFilterXfermode) {
534 const char* colorFilterColorUniName = NULL; 525 const char* colorFilterColorUniName = NULL;
535 fUniformHandles.fColorFilterUni = builder.addUniform(GrGLShaderBuilder:: kFragment_Visibility, 526 fUniformHandles.fColorFilterUni = builder.addUniform(GrGLShaderBuilder:: kFragment_Visibility,
536 kVec4f_GrSLType, "F ilterColor", 527 kVec4f_GrSLType, "F ilterColor",
537 &colorFilterColorUn iName); 528 &colorFilterColorUn iName);
538 529
539 builder.fsCodeAppend("\tvec4 filteredColor;\n"); 530 builder.fsCodeAppend("\tvec4 filteredColor;\n");
(...skipping 10 matching lines...) Expand all
550 colorCoeff, colorFilterColorUniName, color); 541 colorCoeff, colorFilterColorUniName, color);
551 inColor = "filteredColor"; 542 inColor = "filteredColor";
552 } 543 }
553 544
554 /////////////////////////////////////////////////////////////////////////// 545 ///////////////////////////////////////////////////////////////////////////
555 // compute the partial coverage 546 // compute the partial coverage
556 SkString inCoverage; 547 SkString inCoverage;
557 GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCov erage); 548 GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCov erage);
558 549
559 for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { 550 for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
560 glEffects[e] = fCoverageEffects[e].fGLEffect;
561 effectUniformArrays[e] = &fCoverageEffects[e].fSamplerUnis; 551 effectUniformArrays[e] = &fCoverageEffects[e].fSamplerUnis;
562 } 552 }
563 553
564 builder.emitEffects(glEffects.get(), 554 builder.emitEffects(coverageStages,
565 coverageDrawEffects.begin(),
566 fDesc.getEffectKeys() + fDesc.numColorEffects(), 555 fDesc.getEffectKeys() + fDesc.numColorEffects(),
567 fDesc.numCoverageEffects(), 556 fDesc.numCoverageEffects(),
568 &inCoverage, 557 &inCoverage,
569 &knownCoverageValue, 558 &knownCoverageValue,
570 effectUniformArrays.get()); 559 effectUniformArrays.get(),
560 glEffects.get());
561 for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
562 fCoverageEffects[e].fGLEffect = glEffects[e];
563 }
571 564
572 // discard if coverage is zero 565 // discard if coverage is zero
573 if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageV alue) { 566 if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageV alue) {
574 if (kZeros_GrSLConstantVec == knownCoverageValue) { 567 if (kZeros_GrSLConstantVec == knownCoverageValue) {
575 // This is unfortunate. 568 // This is unfortunate.
576 builder.fsCodeAppend("\tdiscard;\n"); 569 builder.fsCodeAppend("\tdiscard;\n");
577 } else { 570 } else {
578 builder.fsCodeAppendf("\tif (all(lessThanEqual(%s, vec4(0.0)))) {\n\ t\tdiscard;\n\t}\n", 571 builder.fsCodeAppendf("\tif (all(lessThanEqual(%s, vec4(0.0)))) {\n\ t\tdiscard;\n\t}\n",
579 inCoverage.c_str()); 572 inCoverage.c_str());
580 } 573 }
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 fUniformHandles.fRTHeightUni = builder.getRTHeightUniform(); 682 fUniformHandles.fRTHeightUni = builder.getRTHeightUniform();
690 fUniformHandles.fDstCopyTopLeftUni = builder.getDstCopyTopLeftUniform(); 683 fUniformHandles.fDstCopyTopLeftUni = builder.getDstCopyTopLeftUniform();
691 fUniformHandles.fDstCopyScaleUni = builder.getDstCopyScaleUniform(); 684 fUniformHandles.fDstCopyScaleUni = builder.getDstCopyScaleUniform();
692 fUniformHandles.fDstCopySamplerUni = builder.getDstCopySamplerUniform(); 685 fUniformHandles.fDstCopySamplerUni = builder.getDstCopySamplerUniform();
693 // This must be called after we set fDstCopySamplerUni above. 686 // This must be called after we set fDstCopySamplerUni above.
694 this->initSamplerUniforms(); 687 this->initSamplerUniforms();
695 688
696 return true; 689 return true;
697 } 690 }
698 691
699 void GrGLProgram::buildGLEffects(SkTArray<EffectAndSamplers> GrGLProgram::* effe ctSet,
700 const GrEffectStage* stages[],
701 int count,
702 bool hasExplicitLocalCoords,
703 SkTArray<GrDrawEffect>* drawEffects,
704 bool* hasVertexShaderEffects) {
705 for (int e = 0; e < count; ++e) {
706 SkASSERT(NULL != stages[e] && NULL != stages[e]->getEffect());
707
708 const GrEffectStage& stage = *stages[e];
709 SkNEW_APPEND_TO_TARRAY(drawEffects, GrDrawEffect, (stage, hasExplicitLoc alCoords));
710
711 const GrDrawEffect& drawEffect = (*drawEffects)[e];
712 GrGLEffect* effect = (this->*effectSet)[e].fGLEffect =
713 (*stage.getEffect())->getFactory().createGLInstance(drawEffect);
714
715 if (!*hasVertexShaderEffects && effect->requiresVertexShader(drawEffect) ) {
716 *hasVertexShaderEffects = true;
717 }
718 }
719 }
720
721 bool GrGLProgram::bindOutputsAttribsAndLinkProgram(const GrGLShaderBuilder& buil der, 692 bool GrGLProgram::bindOutputsAttribsAndLinkProgram(const GrGLShaderBuilder& buil der,
722 bool bindColorOut, 693 bool bindColorOut,
723 bool bindDualSrcOut) { 694 bool bindDualSrcOut) {
724 GL_CALL_RET(fProgramID, CreateProgram()); 695 GL_CALL_RET(fProgramID, CreateProgram());
725 if (!fProgramID) { 696 if (!fProgramID) {
726 return false; 697 return false;
727 } 698 }
728 699
729 if (fVShaderID) { 700 if (fVShaderID) {
730 GL_CALL(AttachShader(fProgramID, fVShaderID)); 701 GL_CALL(AttachShader(fProgramID, fVShaderID));
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
1012 983
1013 fMatrixState.fViewMatrix = drawState.getViewMatrix(); 984 fMatrixState.fViewMatrix = drawState.getViewMatrix();
1014 fMatrixState.fRenderTargetSize = size; 985 fMatrixState.fRenderTargetSize = size;
1015 fMatrixState.fRenderTargetOrigin = rt->origin(); 986 fMatrixState.fRenderTargetOrigin = rt->origin();
1016 987
1017 GrGLfloat viewMatrix[3 * 3]; 988 GrGLfloat viewMatrix[3 * 3];
1018 fMatrixState.getGLMatrix<3>(viewMatrix); 989 fMatrixState.getGLMatrix<3>(viewMatrix);
1019 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, viewMatrix); 990 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, viewMatrix);
1020 } 991 }
1021 } 992 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLProgram.h ('k') | src/gpu/gl/GrGLShaderBuilder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698