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

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

Issue 16158007: Make GrGLProgram no longer depend on kNumStages (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: cleanup Created 7 years, 6 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') | no next file » | 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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 const GrGLProgramDesc& desc, 51 const GrGLProgramDesc& desc,
52 const GrEffectStage* stages[]) 52 const GrEffectStage* stages[])
53 : fContext(gl) 53 : fContext(gl)
54 , fUniformManager(gl) { 54 , fUniformManager(gl) {
55 fDesc = desc; 55 fDesc = desc;
56 fVShaderID = 0; 56 fVShaderID = 0;
57 fGShaderID = 0; 57 fGShaderID = 0;
58 fFShaderID = 0; 58 fFShaderID = 0;
59 fProgramID = 0; 59 fProgramID = 0;
60 60
61 fDstCopyTexUnit = -1;
62
61 fColor = GrColor_ILLEGAL; 63 fColor = GrColor_ILLEGAL;
62 fColorFilterColor = GrColor_ILLEGAL; 64 fColorFilterColor = GrColor_ILLEGAL;
63 65
64 for (int s = 0; s < GrDrawState::kNumStages; ++s) { 66 fEffectStates.reset(desc.numTotalEffects());
65 fEffects[s] = NULL;
66 }
67 67
68 this->genProgram(stages); 68 this->genProgram(stages);
69 } 69 }
70 70
71 GrGLProgram::~GrGLProgram() { 71 GrGLProgram::~GrGLProgram() {
72 if (fVShaderID) { 72 if (fVShaderID) {
73 GL_CALL(DeleteShader(fVShaderID)); 73 GL_CALL(DeleteShader(fVShaderID));
74 } 74 }
75 if (fGShaderID) { 75 if (fGShaderID) {
76 GL_CALL(DeleteShader(fGShaderID)); 76 GL_CALL(DeleteShader(fGShaderID));
77 } 77 }
78 if (fFShaderID) { 78 if (fFShaderID) {
79 GL_CALL(DeleteShader(fFShaderID)); 79 GL_CALL(DeleteShader(fFShaderID));
80 } 80 }
81 if (fProgramID) { 81 if (fProgramID) {
82 GL_CALL(DeleteProgram(fProgramID)); 82 GL_CALL(DeleteProgram(fProgramID));
83 } 83 }
84
85 for (int i = 0; i < GrDrawState::kNumStages; ++i) {
86 delete fEffects[i];
87 }
88 } 84 }
89 85
90 void GrGLProgram::abandon() { 86 void GrGLProgram::abandon() {
91 fVShaderID = 0; 87 fVShaderID = 0;
92 fGShaderID = 0; 88 fGShaderID = 0;
93 fFShaderID = 0; 89 fFShaderID = 0;
94 fProgramID = 0; 90 fProgramID = 0;
95 } 91 }
96 92
97 void GrGLProgram::overrideBlend(GrBlendCoeff* srcCoeff, 93 void GrGLProgram::overrideBlend(GrBlendCoeff* srcCoeff,
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 SkXfermode::Coeff colorCoeff; 477 SkXfermode::Coeff colorCoeff;
482 SkXfermode::Coeff filterColorCoeff; 478 SkXfermode::Coeff filterColorCoeff;
483 SkAssertResult( 479 SkAssertResult(
484 SkXfermode::ModeAsCoeff(static_cast<SkXfermode::Mode>(header.fColorFilte rXfermode), 480 SkXfermode::ModeAsCoeff(static_cast<SkXfermode::Mode>(header.fColorFilte rXfermode),
485 &filterColorCoeff, 481 &filterColorCoeff,
486 &colorCoeff)); 482 &colorCoeff));
487 bool needColor, needFilterColor; 483 bool needColor, needFilterColor;
488 need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor ); 484 need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor );
489 485
490 // used in order for builder to return the per-stage uniform handles. 486 // used in order for builder to return the per-stage uniform handles.
491 SkTArray<GrGLUniformManager::UniformHandle, true>* stageUniformArrays[GrDraw State::kNumStages]; 487 typedef SkTArray<GrGLUniformManager::UniformHandle, true>* UniHandleArrayPtr ;
488 int maxColorOrCovEffectCnt = GrMax(fDesc.numColorEffects(), fDesc.numCoverag eEffects());
489 SkAutoTArray<UniHandleArrayPtr> effectUniformArrays(maxColorOrCovEffectCnt);
490 SkAutoTArray<GrGLEffect*> glEffects(maxColorOrCovEffectCnt);
492 491
493 if (needColor) { 492 if (needColor) {
494 for (int s = 0; s < fDesc.numColorEffects(); ++s) { 493 for (int e = 0; e < fDesc.numColorEffects(); ++e) {
495 stageUniformArrays[s] = &fUniformHandles.fEffectSamplerUnis[s]; 494 effectUniformArrays[e] = &fEffectStates[e].fSamplerUnis;
496 } 495 }
497 496
498 builder.emitEffects(stages, 497 builder.emitEffects(stages,
499 fDesc.effectKeys(), 498 fDesc.effectKeys(),
500 fDesc.numColorEffects(), 499 fDesc.numColorEffects(),
501 &inColor, 500 &inColor,
502 &knownColorValue, 501 &knownColorValue,
503 stageUniformArrays, 502 effectUniformArrays.get(),
504 fEffects); 503 glEffects.get());
504
505 for (int e = 0; e < fDesc.numColorEffects(); ++e) {
506 fEffectStates[e].fGLEffect = glEffects[e];
507 }
505 } 508 }
506 509
507 // Insert the color filter. This will soon be replaced by a color effect. 510 // Insert the color filter. This will soon be replaced by a color effect.
508 if (SkXfermode::kDst_Mode != header.fColorFilterXfermode) { 511 if (SkXfermode::kDst_Mode != header.fColorFilterXfermode) {
509 const char* colorFilterColorUniName = NULL; 512 const char* colorFilterColorUniName = NULL;
510 fUniformHandles.fColorFilterUni = builder.addUniform(GrGLShaderBuilder:: kFragment_ShaderType, 513 fUniformHandles.fColorFilterUni = builder.addUniform(GrGLShaderBuilder:: kFragment_ShaderType,
511 kVec4f_GrSLType, "F ilterColor", 514 kVec4f_GrSLType, "F ilterColor",
512 &colorFilterColorUn iName); 515 &colorFilterColorUn iName);
513 516
514 builder.fsCodeAppend("\tvec4 filteredColor;\n"); 517 builder.fsCodeAppend("\tvec4 filteredColor;\n");
515 const char* color; 518 const char* color;
516 // add_color_filter requires a real input string. 519 // add_color_filter requires a real input string.
517 if (knownColorValue == kOnes_GrSLConstantVec) { 520 if (knownColorValue == kOnes_GrSLConstantVec) {
518 color = GrGLSLOnesVecf(4); 521 color = GrGLSLOnesVecf(4);
519 } else if (knownColorValue == kZeros_GrSLConstantVec) { 522 } else if (knownColorValue == kZeros_GrSLConstantVec) {
520 color = GrGLSLZerosVecf(4); 523 color = GrGLSLZerosVecf(4);
521 } else { 524 } else {
522 color = inColor.c_str(); 525 color = inColor.c_str();
523 } 526 }
524 add_color_filter(&builder, "filteredColor", filterColorCoeff, 527 add_color_filter(&builder, "filteredColor", filterColorCoeff,
525 colorCoeff, colorFilterColorUniName, color); 528 colorCoeff, colorFilterColorUniName, color);
526 inColor = "filteredColor"; 529 inColor = "filteredColor";
527 } 530 }
528 531
529 /////////////////////////////////////////////////////////////////////////// 532 ///////////////////////////////////////////////////////////////////////////
530 // compute the partial coverage 533 // compute the partial coverage
531 SkString inCoverage; 534 SkString inCoverage;
532 GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCov erage); 535 GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCov erage);
533 536
534 for (int s = 0; s < fDesc.numCoverageEffects(); ++s) { 537 for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
535 stageUniformArrays[s] = &fUniformHandles.fEffectSamplerUnis[s + fDesc.nu mColorEffects()]; 538 effectUniformArrays[e] = &fEffectStates[e + fDesc.numColorEffects()].fSa mplerUnis;
536 } 539 }
537 540
538 builder.emitEffects(stages + fDesc.numColorEffects(), 541 builder.emitEffects(stages + fDesc.numColorEffects(),
539 fDesc.getEffectKeys() + fDesc.numColorEffects(), 542 fDesc.getEffectKeys() + fDesc.numColorEffects(),
540 fDesc.numCoverageEffects(), 543 fDesc.numCoverageEffects(),
541 &inCoverage, 544 &inCoverage,
542 &knownCoverageValue, 545 &knownCoverageValue,
543 stageUniformArrays, 546 effectUniformArrays.get(),
544 fEffects + fDesc.numColorEffects()); 547 glEffects.get());
548 for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
549 fEffectStates[e + fDesc.numColorEffects()].fGLEffect = glEffects[e];
550 }
545 551
546 // discard if coverage is zero 552 // discard if coverage is zero
547 if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageV alue) { 553 if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageV alue) {
548 if (kZeros_GrSLConstantVec == knownCoverageValue) { 554 if (kZeros_GrSLConstantVec == knownCoverageValue) {
549 // This is unfortunate. 555 // This is unfortunate.
550 builder.fsCodeAppend("\tdiscard;\n"); 556 builder.fsCodeAppend("\tdiscard;\n");
551 } else { 557 } else {
552 builder.fsCodeAppendf("\tif (all(lessThanEqual(%s, vec4(0.0)))) {\n\ t\tdiscard;\n\t}\n", 558 builder.fsCodeAppendf("\tif (all(lessThanEqual(%s, vec4(0.0)))) {\n\ t\tdiscard;\n\t}\n",
553 inCoverage.c_str()); 559 inCoverage.c_str());
554 } 560 }
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
735 GrAssert(!"Error linking program"); 741 GrAssert(!"Error linking program");
736 GL_CALL(DeleteProgram(fProgramID)); 742 GL_CALL(DeleteProgram(fProgramID));
737 fProgramID = 0; 743 fProgramID = 0;
738 return false; 744 return false;
739 } 745 }
740 return true; 746 return true;
741 } 747 }
742 748
743 void GrGLProgram::initSamplerUniforms() { 749 void GrGLProgram::initSamplerUniforms() {
744 GL_CALL(UseProgram(fProgramID)); 750 GL_CALL(UseProgram(fProgramID));
745 // We simply bind the uniforms to successive texture units beginning at 0. s etData() assumes
746 // this behavior.
747 GrGLint texUnitIdx = 0; 751 GrGLint texUnitIdx = 0;
748 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopySam plerUni) { 752 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopySam plerUni) {
749 fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitId x); 753 fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitId x);
750 ++texUnitIdx; 754 fDstCopyTexUnit = texUnitIdx++;
751 } 755 }
752 756
753 for (int s = 0; s < GrDrawState::kNumStages; ++s) { 757 for (int e = 0; e < fEffectStates.count(); ++e) {
754 int numSamplers = fUniformHandles.fEffectSamplerUnis[s].count(); 758 int numSamplers = fEffectStates[e].fSamplerUnis.count();
755 for (int u = 0; u < numSamplers; ++u) { 759 fEffectStates[e].fTextureUnits.reset(numSamplers);
756 UniformHandle handle = fUniformHandles.fEffectSamplerUnis[s][u]; 760 for (int s = 0; s < numSamplers; ++s) {
761 UniformHandle handle = fEffectStates[e].fSamplerUnis[s];
757 if (GrGLUniformManager::kInvalidUniformHandle != handle) { 762 if (GrGLUniformManager::kInvalidUniformHandle != handle) {
758 fUniformManager.setSampler(handle, texUnitIdx); 763 fUniformManager.setSampler(handle, texUnitIdx);
759 ++texUnitIdx; 764 fEffectStates[e].fTextureUnits[s] = texUnitIdx++;
760 } 765 }
761 } 766 }
762 } 767 }
763 } 768 }
764 769
765 /////////////////////////////////////////////////////////////////////////////// 770 ///////////////////////////////////////////////////////////////////////////////
766 771
767 void GrGLProgram::setData(GrGpuGL* gpu, 772 void GrGLProgram::setData(GrGpuGL* gpu,
768 GrDrawState::BlendOptFlags blendOpts, 773 GrDrawState::BlendOptFlags blendOpts,
769 const GrEffectStage* stages[], 774 const GrEffectStage* stages[],
(...skipping 20 matching lines...) Expand all
790 795
791 // Setup the SkXfermode::Mode-based colorfilter uniform if necessary 796 // Setup the SkXfermode::Mode-based colorfilter uniform if necessary
792 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fColorFilte rUni && 797 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fColorFilte rUni &&
793 fColorFilterColor != drawState.getColorFilterColor()) { 798 fColorFilterColor != drawState.getColorFilterColor()) {
794 GrGLfloat c[4]; 799 GrGLfloat c[4];
795 GrColorToRGBAFloat(drawState.getColorFilterColor(), c); 800 GrColorToRGBAFloat(drawState.getColorFilterColor(), c);
796 fUniformManager.set4fv(fUniformHandles.fColorFilterUni, 0, 1, c); 801 fUniformManager.set4fv(fUniformHandles.fColorFilterUni, 0, 1, c);
797 fColorFilterColor = drawState.getColorFilterColor(); 802 fColorFilterColor = drawState.getColorFilterColor();
798 } 803 }
799 804
800 GrGLint texUnitIdx = 0;
801 if (NULL != dstCopy) { 805 if (NULL != dstCopy) {
802 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCop yTopLeftUni) { 806 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCop yTopLeftUni) {
803 GrAssert(GrGLUniformManager::kInvalidUniformHandle != fUniformHandle s.fDstCopyScaleUni); 807 GrAssert(GrGLUniformManager::kInvalidUniformHandle != fUniformHandle s.fDstCopyScaleUni);
804 GrAssert(GrGLUniformManager::kInvalidUniformHandle != 808 GrAssert(GrGLUniformManager::kInvalidUniformHandle !=
805 fUniformHandles.fDstCopySamplerUni); 809 fUniformHandles.fDstCopySamplerUni);
806 fUniformManager.set2f(fUniformHandles.fDstCopyTopLeftUni, 810 fUniformManager.set2f(fUniformHandles.fDstCopyTopLeftUni,
807 static_cast<GrGLfloat>(dstCopy->offset().fX), 811 static_cast<GrGLfloat>(dstCopy->offset().fX),
808 static_cast<GrGLfloat>(dstCopy->offset().fY)); 812 static_cast<GrGLfloat>(dstCopy->offset().fY));
809 fUniformManager.set2f(fUniformHandles.fDstCopyScaleUni, 813 fUniformManager.set2f(fUniformHandles.fDstCopyScaleUni,
810 1.f / dstCopy->texture()->width(), 814 1.f / dstCopy->texture()->width(),
811 1.f / dstCopy->texture()->height()); 815 1.f / dstCopy->texture()->height());
812 GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture()) ; 816 GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture()) ;
813 static GrTextureParams kParams; // the default is clamp, nearest fil tering. 817 static GrTextureParams kParams; // the default is clamp, nearest fil tering.
814 gpu->bindTexture(texUnitIdx, kParams, texture); 818 gpu->bindTexture(fDstCopyTexUnit, kParams, texture);
815 ++texUnitIdx;
816 } else { 819 } else {
817 GrAssert(GrGLUniformManager::kInvalidUniformHandle == 820 GrAssert(GrGLUniformManager::kInvalidUniformHandle ==
818 fUniformHandles.fDstCopyScaleUni); 821 fUniformHandles.fDstCopyScaleUni);
819 GrAssert(GrGLUniformManager::kInvalidUniformHandle == 822 GrAssert(GrGLUniformManager::kInvalidUniformHandle ==
820 fUniformHandles.fDstCopySamplerUni); 823 fUniformHandles.fDstCopySamplerUni);
821 } 824 }
822 } else { 825 } else {
823 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopyTopLeftUni); 826 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopyTopLeftUni);
824 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopyScaleUni); 827 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopyScaleUni);
825 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopySamplerUni); 828 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopySamplerUni);
826 } 829 }
827 830
828 int numEffects = fDesc.numTotalEffects(); 831 int numEffects = fDesc.numTotalEffects();
829 for (int e = 0; e < numEffects; ++e) { 832 for (int e = 0; e < numEffects; ++e) {
830 GrAssert(NULL != stages[e]); 833 GrAssert(NULL != stages[e]);
831 // We may have omitted the GrGLEffect because of the color filter logic in genProgram. 834 // We may have omitted the GrGLEffect because of the color filter logic in genProgram.
832 // This can be removed when the color filter is an effect. 835 // This can be removed when the color filter is an effect.
833 if (NULL != fEffects[e]) { 836 if (NULL != fEffectStates[e].fGLEffect) {
834 bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttrib uteIndex; 837 bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttrib uteIndex;
835 GrDrawEffect drawEffect(*stages[e], explicitLocalCoords); 838 GrDrawEffect drawEffect(*stages[e], explicitLocalCoords);
836 fEffects[e]->setData(fUniformManager, drawEffect); 839 fEffectStates[e].fGLEffect->setData(fUniformManager, drawEffect);
837 int numSamplers = fUniformHandles.fEffectSamplerUnis[e].count(); 840 int numSamplers = fEffectStates[e].fSamplerUnis.count();
838 for (int u = 0; u < numSamplers; ++u) { 841 GrAssert((*stages[e]->getEffect())->numTextures() == numSamplers);
839 UniformHandle handle = fUniformHandles.fEffectSamplerUnis[e][u]; 842 for (int s = 0; s < numSamplers; ++s) {
843 UniformHandle handle = fEffectStates[e].fSamplerUnis[s];
840 if (GrGLUniformManager::kInvalidUniformHandle != handle) { 844 if (GrGLUniformManager::kInvalidUniformHandle != handle) {
841 const GrTextureAccess& access = (*stages[e]->getEffect())->t extureAccess(u); 845 const GrTextureAccess& access = (*stages[e]->getEffect())->t extureAccess(s);
842 GrGLTexture* texture = static_cast<GrGLTexture*>(access.getT exture()); 846 GrGLTexture* texture = static_cast<GrGLTexture*>(access.getT exture());
843 gpu->bindTexture(texUnitIdx, access.getParams(), texture); 847 int unit = fEffectStates[e].fTextureUnits[s];
844 ++texUnitIdx; 848 gpu->bindTexture(unit, access.getParams(), texture);
845 } 849 }
846 } 850 }
847 } 851 }
848 } 852 }
849 } 853 }
850 854
851 void GrGLProgram::setColor(const GrDrawState& drawState, 855 void GrGLProgram::setColor(const GrDrawState& drawState,
852 GrColor color, 856 GrColor color,
853 SharedGLState* sharedState) { 857 SharedGLState* sharedState) {
854 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); 858 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
970 SkScalarToFloat(m[SkMatrix::kMTransX]), 974 SkScalarToFloat(m[SkMatrix::kMTransX]),
971 SkScalarToFloat(m[SkMatrix::kMTransY]), 975 SkScalarToFloat(m[SkMatrix::kMTransY]),
972 SkScalarToFloat(m[SkMatrix::kMPersp2]) 976 SkScalarToFloat(m[SkMatrix::kMPersp2])
973 }; 977 };
974 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt); 978 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt);
975 fMatrixState.fViewMatrix = drawState.getViewMatrix(); 979 fMatrixState.fViewMatrix = drawState.getViewMatrix();
976 fMatrixState.fRenderTargetSize = size; 980 fMatrixState.fRenderTargetSize = size;
977 fMatrixState.fRenderTargetOrigin = rt->origin(); 981 fMatrixState.fRenderTargetOrigin = rt->origin();
978 } 982 }
979 } 983 }
OLDNEW
« no previous file with comments | « src/gpu/gl/GrGLProgram.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698