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

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

Issue 16180006: separate arrays for color and coverage effects. (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: 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
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 20 matching lines...) Expand all
31 #define COV_ATTR_NAME "aCoverage" 31 #define COV_ATTR_NAME "aCoverage"
32 #define EDGE_ATTR_NAME "aEdge" 32 #define EDGE_ATTR_NAME "aEdge"
33 33
34 namespace { 34 namespace {
35 inline const char* declared_color_output_name() { return "fsColorOut"; } 35 inline const char* declared_color_output_name() { return "fsColorOut"; }
36 inline const char* dual_source_output_name() { return "dualSourceOut"; } 36 inline const char* dual_source_output_name() { return "dualSourceOut"; }
37 } 37 }
38 38
39 GrGLProgram* GrGLProgram::Create(const GrGLContext& gl, 39 GrGLProgram* GrGLProgram::Create(const GrGLContext& gl,
40 const GrGLProgramDesc& desc, 40 const GrGLProgramDesc& desc,
41 const GrEffectStage* stages[]) { 41 const GrEffectStage* colorStages[],
42 GrGLProgram* program = SkNEW_ARGS(GrGLProgram, (gl, desc, stages)); 42 const GrEffectStage* coverageStages[]) {
43 GrGLProgram* program = SkNEW_ARGS(GrGLProgram, (gl, desc, colorStages, cover ageStages));
43 if (!program->succeeded()) { 44 if (!program->succeeded()) {
44 delete program; 45 delete program;
45 program = NULL; 46 program = NULL;
46 } 47 }
47 return program; 48 return program;
48 } 49 }
49 50
50 GrGLProgram::GrGLProgram(const GrGLContext& gl, 51 GrGLProgram::GrGLProgram(const GrGLContext& gl,
51 const GrGLProgramDesc& desc, 52 const GrGLProgramDesc& desc,
52 const GrEffectStage* stages[]) 53 const GrEffectStage* colorStages[],
54 const GrEffectStage* coverageStages[])
53 : fContext(gl) 55 : fContext(gl)
54 , fUniformManager(gl) { 56 , fUniformManager(gl) {
55 fDesc = desc; 57 fDesc = desc;
56 fVShaderID = 0; 58 fVShaderID = 0;
57 fGShaderID = 0; 59 fGShaderID = 0;
58 fFShaderID = 0; 60 fFShaderID = 0;
59 fProgramID = 0; 61 fProgramID = 0;
60 62
61 fDstCopyTexUnit = -1; 63 fDstCopyTexUnit = -1;
62 64
63 fColor = GrColor_ILLEGAL; 65 fColor = GrColor_ILLEGAL;
64 fColorFilterColor = GrColor_ILLEGAL; 66 fColorFilterColor = GrColor_ILLEGAL;
65 67
66 fEffectStates.reset(desc.numTotalEffects()); 68 fColorEffects.reset(desc.numColorEffects());
69 fCoverageEffects.reset(desc.numCoverageEffects());
67 70
68 this->genProgram(stages); 71 this->genProgram(colorStages, coverageStages);
69 } 72 }
70 73
71 GrGLProgram::~GrGLProgram() { 74 GrGLProgram::~GrGLProgram() {
72 if (fVShaderID) { 75 if (fVShaderID) {
73 GL_CALL(DeleteShader(fVShaderID)); 76 GL_CALL(DeleteShader(fVShaderID));
74 } 77 }
75 if (fGShaderID) { 78 if (fGShaderID) {
76 GL_CALL(DeleteShader(fGShaderID)); 79 GL_CALL(DeleteShader(fGShaderID));
77 } 80 }
78 if (fFShaderID) { 81 if (fFShaderID) {
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 GrPrintf(shader.c_str()); 428 GrPrintf(shader.c_str());
426 GrPrintf("\n"); 429 GrPrintf("\n");
427 } 430 }
428 if (!(fFShaderID = compile_shader(fContext, GR_GL_FRAGMENT_SHADER, shader))) { 431 if (!(fFShaderID = compile_shader(fContext, GR_GL_FRAGMENT_SHADER, shader))) {
429 return false; 432 return false;
430 } 433 }
431 434
432 return true; 435 return true;
433 } 436 }
434 437
435 bool GrGLProgram::genProgram(const GrEffectStage* stages[]) { 438 bool GrGLProgram::genProgram(const GrEffectStage* colorStages[],
439 const GrEffectStage* coverageStages[]) {
436 GrAssert(0 == fProgramID); 440 GrAssert(0 == fProgramID);
437 441
438 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); 442 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
439 443
440 GrGLShaderBuilder builder(fContext.info(), fUniformManager, fDesc); 444 GrGLShaderBuilder builder(fContext.info(), fUniformManager, fDesc);
441 445
442 // the dual source output has no canonical var name, have to 446 // the dual source output has no canonical var name, have to
443 // declare an output, which is incompatible with gl_FragColor/gl_FragData. 447 // declare an output, which is incompatible with gl_FragColor/gl_FragData.
444 bool dualSourceOutputWritten = false; 448 bool dualSourceOutputWritten = false;
445 449
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
484 need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor ); 488 need_blend_inputs(filterColorCoeff, colorCoeff, &needFilterColor, &needColor );
485 489
486 // used in order for builder to return the per-stage uniform handles. 490 // used in order for builder to return the per-stage uniform handles.
487 typedef SkTArray<GrGLUniformManager::UniformHandle, true>* UniHandleArrayPtr ; 491 typedef SkTArray<GrGLUniformManager::UniformHandle, true>* UniHandleArrayPtr ;
488 int maxColorOrCovEffectCnt = GrMax(fDesc.numColorEffects(), fDesc.numCoverag eEffects()); 492 int maxColorOrCovEffectCnt = GrMax(fDesc.numColorEffects(), fDesc.numCoverag eEffects());
489 SkAutoTArray<UniHandleArrayPtr> effectUniformArrays(maxColorOrCovEffectCnt); 493 SkAutoTArray<UniHandleArrayPtr> effectUniformArrays(maxColorOrCovEffectCnt);
490 SkAutoTArray<GrGLEffect*> glEffects(maxColorOrCovEffectCnt); 494 SkAutoTArray<GrGLEffect*> glEffects(maxColorOrCovEffectCnt);
491 495
492 if (needColor) { 496 if (needColor) {
493 for (int e = 0; e < fDesc.numColorEffects(); ++e) { 497 for (int e = 0; e < fDesc.numColorEffects(); ++e) {
494 effectUniformArrays[e] = &fEffectStates[e].fSamplerUnis; 498 effectUniformArrays[e] = &fColorEffects[e].fSamplerUnis;
495 } 499 }
496 500
497 builder.emitEffects(stages, 501 builder.emitEffects(colorStages,
498 fDesc.effectKeys(), 502 fDesc.effectKeys(),
499 fDesc.numColorEffects(), 503 fDesc.numColorEffects(),
500 &inColor, 504 &inColor,
501 &knownColorValue, 505 &knownColorValue,
502 effectUniformArrays.get(), 506 effectUniformArrays.get(),
503 glEffects.get()); 507 glEffects.get());
504 508
505 for (int e = 0; e < fDesc.numColorEffects(); ++e) { 509 for (int e = 0; e < fDesc.numColorEffects(); ++e) {
506 fEffectStates[e].fGLEffect = glEffects[e]; 510 fColorEffects[e].fGLEffect = glEffects[e];
507 } 511 }
508 } 512 }
509 513
510 // Insert the color filter. This will soon be replaced by a color effect. 514 // Insert the color filter. This will soon be replaced by a color effect.
511 if (SkXfermode::kDst_Mode != header.fColorFilterXfermode) { 515 if (SkXfermode::kDst_Mode != header.fColorFilterXfermode) {
512 const char* colorFilterColorUniName = NULL; 516 const char* colorFilterColorUniName = NULL;
513 fUniformHandles.fColorFilterUni = builder.addUniform(GrGLShaderBuilder:: kFragment_ShaderType, 517 fUniformHandles.fColorFilterUni = builder.addUniform(GrGLShaderBuilder:: kFragment_ShaderType,
514 kVec4f_GrSLType, "F ilterColor", 518 kVec4f_GrSLType, "F ilterColor",
515 &colorFilterColorUn iName); 519 &colorFilterColorUn iName);
516 520
(...skipping 11 matching lines...) Expand all
528 colorCoeff, colorFilterColorUniName, color); 532 colorCoeff, colorFilterColorUniName, color);
529 inColor = "filteredColor"; 533 inColor = "filteredColor";
530 } 534 }
531 535
532 /////////////////////////////////////////////////////////////////////////// 536 ///////////////////////////////////////////////////////////////////////////
533 // compute the partial coverage 537 // compute the partial coverage
534 SkString inCoverage; 538 SkString inCoverage;
535 GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCov erage); 539 GrSLConstantVec knownCoverageValue = this->genInputCoverage(&builder, &inCov erage);
536 540
537 for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { 541 for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
538 effectUniformArrays[e] = &fEffectStates[e + fDesc.numColorEffects()].fSa mplerUnis; 542 effectUniformArrays[e] = &fCoverageEffects[e].fSamplerUnis;
539 } 543 }
540 544
541 builder.emitEffects(stages + fDesc.numColorEffects(), 545 builder.emitEffects(coverageStages,
542 fDesc.getEffectKeys() + fDesc.numColorEffects(), 546 fDesc.getEffectKeys() + fDesc.numColorEffects(),
543 fDesc.numCoverageEffects(), 547 fDesc.numCoverageEffects(),
544 &inCoverage, 548 &inCoverage,
545 &knownCoverageValue, 549 &knownCoverageValue,
546 effectUniformArrays.get(), 550 effectUniformArrays.get(),
547 glEffects.get()); 551 glEffects.get());
548 for (int e = 0; e < fDesc.numCoverageEffects(); ++e) { 552 for (int e = 0; e < fDesc.numCoverageEffects(); ++e) {
549 fEffectStates[e + fDesc.numColorEffects()].fGLEffect = glEffects[e]; 553 fCoverageEffects[e].fGLEffect = glEffects[e];
550 } 554 }
551 555
552 // discard if coverage is zero 556 // discard if coverage is zero
553 if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageV alue) { 557 if (header.fDiscardIfZeroCoverage && kOnes_GrSLConstantVec != knownCoverageV alue) {
554 if (kZeros_GrSLConstantVec == knownCoverageValue) { 558 if (kZeros_GrSLConstantVec == knownCoverageValue) {
555 // This is unfortunate. 559 // This is unfortunate.
556 builder.fsCodeAppend("\tdiscard;\n"); 560 builder.fsCodeAppend("\tdiscard;\n");
557 } else { 561 } else {
558 builder.fsCodeAppendf("\tif (all(lessThanEqual(%s, vec4(0.0)))) {\n\ t\tdiscard;\n\t}\n", 562 builder.fsCodeAppendf("\tif (all(lessThanEqual(%s, vec4(0.0)))) {\n\ t\tdiscard;\n\t}\n",
559 inCoverage.c_str()); 563 inCoverage.c_str());
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 return true; 750 return true;
747 } 751 }
748 752
749 void GrGLProgram::initSamplerUniforms() { 753 void GrGLProgram::initSamplerUniforms() {
750 GL_CALL(UseProgram(fProgramID)); 754 GL_CALL(UseProgram(fProgramID));
751 GrGLint texUnitIdx = 0; 755 GrGLint texUnitIdx = 0;
752 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopySam plerUni) { 756 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopySam plerUni) {
753 fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitId x); 757 fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitId x);
754 fDstCopyTexUnit = texUnitIdx++; 758 fDstCopyTexUnit = texUnitIdx++;
755 } 759 }
756 760
robertphillips 2013/06/06 19:38:15 sub-routine for these two?
bsalomon 2013/06/06 20:07:40 yeah, will do
757 for (int e = 0; e < fEffectStates.count(); ++e) { 761 for (int e = 0; e < fColorEffects.count(); ++e) {
758 int numSamplers = fEffectStates[e].fSamplerUnis.count(); 762 int numSamplers = fColorEffects[e].fSamplerUnis.count();
759 fEffectStates[e].fTextureUnits.reset(numSamplers); 763 fColorEffects[e].fTextureUnits.reset(numSamplers);
760 for (int s = 0; s < numSamplers; ++s) { 764 for (int s = 0; s < numSamplers; ++s) {
761 UniformHandle handle = fEffectStates[e].fSamplerUnis[s]; 765 UniformHandle handle = fColorEffects[e].fSamplerUnis[s];
762 if (GrGLUniformManager::kInvalidUniformHandle != handle) { 766 if (GrGLUniformManager::kInvalidUniformHandle != handle) {
763 fUniformManager.setSampler(handle, texUnitIdx); 767 fUniformManager.setSampler(handle, texUnitIdx);
764 fEffectStates[e].fTextureUnits[s] = texUnitIdx++; 768 fColorEffects[e].fTextureUnits[s] = texUnitIdx++;
765 } 769 }
766 } 770 }
767 } 771 }
772
773 for (int e = 0; e < fCoverageEffects.count(); ++e) {
774 int numSamplers = fCoverageEffects[e].fSamplerUnis.count();
775 fCoverageEffects[e].fTextureUnits.reset(numSamplers);
776 for (int s = 0; s < numSamplers; ++s) {
777 UniformHandle handle = fCoverageEffects[e].fSamplerUnis[s];
778 if (GrGLUniformManager::kInvalidUniformHandle != handle) {
779 fUniformManager.setSampler(handle, texUnitIdx);
780 fCoverageEffects[e].fTextureUnits[s] = texUnitIdx++;
781 }
782 }
783 }
768 } 784 }
769 785
770 /////////////////////////////////////////////////////////////////////////////// 786 ///////////////////////////////////////////////////////////////////////////////
771 787
788 void GrGLProgram::setEffectData(GrGpuGL* gpu,
789 const GrEffectStage& stage,
790 const EffectAndSamplers& effect) {
791
792 // Let the GrGLEffect set its data.
bsalomon 2013/06/06 19:13:02 This is the removed block below, split out into it
793 bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttributeIndex ;
794 GrDrawEffect drawEffect(stage, explicitLocalCoords);
795 effect.fGLEffect->setData(fUniformManager, drawEffect);
796
797 // Bind the texures for the effect.
798 int numSamplers = effect.fSamplerUnis.count();
799 GrAssert((*stage.getEffect())->numTextures() == numSamplers);
800 for (int s = 0; s < numSamplers; ++s) {
801 UniformHandle handle = effect.fSamplerUnis[s];
802 if (GrGLUniformManager::kInvalidUniformHandle != handle) {
803 const GrTextureAccess& access = (*stage.getEffect())->textureAccess( s);
804 GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture() );
805 int unit = effect.fTextureUnits[s];
806 gpu->bindTexture(unit, access.getParams(), texture);
807 }
808 }
809 }
810
772 void GrGLProgram::setData(GrGpuGL* gpu, 811 void GrGLProgram::setData(GrGpuGL* gpu,
773 GrDrawState::BlendOptFlags blendOpts, 812 GrDrawState::BlendOptFlags blendOpts,
774 const GrEffectStage* stages[], 813 const GrEffectStage* colorStages[],
814 const GrEffectStage* coverageStages[],
775 const GrDeviceCoordTexture* dstCopy, 815 const GrDeviceCoordTexture* dstCopy,
776 SharedGLState* sharedState) { 816 SharedGLState* sharedState) {
777 const GrDrawState& drawState = gpu->getDrawState(); 817 const GrDrawState& drawState = gpu->getDrawState();
778 818
779 GrColor color; 819 GrColor color;
780 GrColor coverage; 820 GrColor coverage;
781 if (blendOpts & GrDrawState::kEmitTransBlack_BlendOptFlag) { 821 if (blendOpts & GrDrawState::kEmitTransBlack_BlendOptFlag) {
782 color = 0; 822 color = 0;
783 coverage = 0; 823 coverage = 0;
784 } else if (blendOpts & GrDrawState::kEmitCoverage_BlendOptFlag) { 824 } else if (blendOpts & GrDrawState::kEmitCoverage_BlendOptFlag) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 fUniformHandles.fDstCopyScaleUni); 861 fUniformHandles.fDstCopyScaleUni);
822 GrAssert(GrGLUniformManager::kInvalidUniformHandle == 862 GrAssert(GrGLUniformManager::kInvalidUniformHandle ==
823 fUniformHandles.fDstCopySamplerUni); 863 fUniformHandles.fDstCopySamplerUni);
824 } 864 }
825 } else { 865 } else {
826 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopyTopLeftUni); 866 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopyTopLeftUni);
827 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopyScaleUni); 867 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopyScaleUni);
828 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopySamplerUni); 868 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopySamplerUni);
829 } 869 }
830 870
831 int numEffects = fDesc.numTotalEffects(); 871 for (int e = 0; e < fColorEffects.count(); ++e) {
832 for (int e = 0; e < numEffects; ++e) {
833 GrAssert(NULL != stages[e]);
834 // We may have omitted the GrGLEffect because of the color filter logic in genProgram. 872 // We may have omitted the GrGLEffect because of the color filter logic in genProgram.
835 // This can be removed when the color filter is an effect. 873 // This can be removed when the color filter is an effect.
836 if (NULL != fEffectStates[e].fGLEffect) { 874 if (NULL != fColorEffects[e].fGLEffect) {
837 bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttrib uteIndex; 875 this->setEffectData(gpu, *colorStages[e], fColorEffects[e]);
838 GrDrawEffect drawEffect(*stages[e], explicitLocalCoords); 876 }
839 fEffectStates[e].fGLEffect->setData(fUniformManager, drawEffect); 877 }
840 int numSamplers = fEffectStates[e].fSamplerUnis.count(); 878
841 GrAssert((*stages[e]->getEffect())->numTextures() == numSamplers); 879 for (int e = 0; e < fCoverageEffects.count(); ++e) {
842 for (int s = 0; s < numSamplers; ++s) { 880 if (NULL != fCoverageEffects[e].fGLEffect) {
843 UniformHandle handle = fEffectStates[e].fSamplerUnis[s]; 881 this->setEffectData(gpu, *coverageStages[e], fCoverageEffects[e]);
844 if (GrGLUniformManager::kInvalidUniformHandle != handle) {
845 const GrTextureAccess& access = (*stages[e]->getEffect())->t extureAccess(s);
846 GrGLTexture* texture = static_cast<GrGLTexture*>(access.getT exture());
847 int unit = fEffectStates[e].fTextureUnits[s];
848 gpu->bindTexture(unit, access.getParams(), texture);
849 }
850 }
851 } 882 }
852 } 883 }
853 } 884 }
854 885
855 void GrGLProgram::setColor(const GrDrawState& drawState, 886 void GrGLProgram::setColor(const GrDrawState& drawState,
856 GrColor color, 887 GrColor color,
857 SharedGLState* sharedState) { 888 SharedGLState* sharedState) {
858 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader(); 889 const GrGLProgramDesc::KeyHeader& header = fDesc.getHeader();
859 if (!drawState.hasColorVertexAttribute()) { 890 if (!drawState.hasColorVertexAttribute()) {
860 switch (header.fColorInput) { 891 switch (header.fColorInput) {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
974 SkScalarToFloat(m[SkMatrix::kMTransX]), 1005 SkScalarToFloat(m[SkMatrix::kMTransX]),
975 SkScalarToFloat(m[SkMatrix::kMTransY]), 1006 SkScalarToFloat(m[SkMatrix::kMTransY]),
976 SkScalarToFloat(m[SkMatrix::kMPersp2]) 1007 SkScalarToFloat(m[SkMatrix::kMPersp2])
977 }; 1008 };
978 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt); 1009 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt);
979 fMatrixState.fViewMatrix = drawState.getViewMatrix(); 1010 fMatrixState.fViewMatrix = drawState.getViewMatrix();
980 fMatrixState.fRenderTargetSize = size; 1011 fMatrixState.fRenderTargetSize = size;
981 fMatrixState.fRenderTargetOrigin = rt->origin(); 1012 fMatrixState.fRenderTargetOrigin = rt->origin();
982 } 1013 }
983 } 1014 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698