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

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

Issue 22340010: Refactor GrGLUniformManager::UniformHandle to initialize itself by default (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: description Created 7 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 | 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 735 matching lines...) Expand 10 before | Expand all | Expand 10 after
746 GL_CALL(DeleteProgram(fProgramID)); 746 GL_CALL(DeleteProgram(fProgramID));
747 fProgramID = 0; 747 fProgramID = 0;
748 return false; 748 return false;
749 } 749 }
750 return true; 750 return true;
751 } 751 }
752 752
753 void GrGLProgram::initSamplerUniforms() { 753 void GrGLProgram::initSamplerUniforms() {
754 GL_CALL(UseProgram(fProgramID)); 754 GL_CALL(UseProgram(fProgramID));
755 GrGLint texUnitIdx = 0; 755 GrGLint texUnitIdx = 0;
756 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopySam plerUni) { 756 if (fUniformHandles.fDstCopySamplerUni.isValid()) {
757 fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitId x); 757 fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitId x);
758 fDstCopyTexUnit = texUnitIdx++; 758 fDstCopyTexUnit = texUnitIdx++;
759 } 759 }
760 760
761 for (int e = 0; e < fColorEffects.count(); ++e) { 761 for (int e = 0; e < fColorEffects.count(); ++e) {
762 this->initEffectSamplerUniforms(&fColorEffects[e], &texUnitIdx); 762 this->initEffectSamplerUniforms(&fColorEffects[e], &texUnitIdx);
763 } 763 }
764 764
765 for (int e = 0; e < fCoverageEffects.count(); ++e) { 765 for (int e = 0; e < fCoverageEffects.count(); ++e) {
766 this->initEffectSamplerUniforms(&fCoverageEffects[e], &texUnitIdx); 766 this->initEffectSamplerUniforms(&fCoverageEffects[e], &texUnitIdx);
767 } 767 }
768 } 768 }
769 769
770 void GrGLProgram::initEffectSamplerUniforms(EffectAndSamplers* effect, int* texU nitIdx) { 770 void GrGLProgram::initEffectSamplerUniforms(EffectAndSamplers* effect, int* texU nitIdx) {
771 int numSamplers = effect->fSamplerUnis.count(); 771 int numSamplers = effect->fSamplerUnis.count();
772 effect->fTextureUnits.reset(numSamplers); 772 effect->fTextureUnits.reset(numSamplers);
773 for (int s = 0; s < numSamplers; ++s) { 773 for (int s = 0; s < numSamplers; ++s) {
774 UniformHandle handle = effect->fSamplerUnis[s]; 774 UniformHandle handle = effect->fSamplerUnis[s];
775 if (GrGLUniformManager::kInvalidUniformHandle != handle) { 775 if (handle.isValid()) {
776 fUniformManager.setSampler(handle, *texUnitIdx); 776 fUniformManager.setSampler(handle, *texUnitIdx);
777 effect->fTextureUnits[s] = (*texUnitIdx)++; 777 effect->fTextureUnits[s] = (*texUnitIdx)++;
778 } 778 }
779 } 779 }
780 } 780 }
781 781
782 /////////////////////////////////////////////////////////////////////////////// 782 ///////////////////////////////////////////////////////////////////////////////
783 783
784 void GrGLProgram::setEffectData(GrGpuGL* gpu, 784 void GrGLProgram::setEffectData(GrGpuGL* gpu,
785 const GrEffectStage& stage, 785 const GrEffectStage& stage,
786 const EffectAndSamplers& effect) { 786 const EffectAndSamplers& effect) {
787 787
788 // Let the GrGLEffect set its data. 788 // Let the GrGLEffect set its data.
789 bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttributeIndex ; 789 bool explicitLocalCoords = -1 != fDesc.getHeader().fLocalCoordAttributeIndex ;
790 GrDrawEffect drawEffect(stage, explicitLocalCoords); 790 GrDrawEffect drawEffect(stage, explicitLocalCoords);
791 effect.fGLEffect->setData(fUniformManager, drawEffect); 791 effect.fGLEffect->setData(fUniformManager, drawEffect);
792 792
793 // Bind the texures for the effect. 793 // Bind the texures for the effect.
794 int numSamplers = effect.fSamplerUnis.count(); 794 int numSamplers = effect.fSamplerUnis.count();
795 GrAssert((*stage.getEffect())->numTextures() == numSamplers); 795 GrAssert((*stage.getEffect())->numTextures() == numSamplers);
796 for (int s = 0; s < numSamplers; ++s) { 796 for (int s = 0; s < numSamplers; ++s) {
797 UniformHandle handle = effect.fSamplerUnis[s]; 797 UniformHandle handle = effect.fSamplerUnis[s];
798 if (GrGLUniformManager::kInvalidUniformHandle != handle) { 798 if (handle.isValid()) {
799 const GrTextureAccess& access = (*stage.getEffect())->textureAccess( s); 799 const GrTextureAccess& access = (*stage.getEffect())->textureAccess( s);
800 GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture() ); 800 GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture() );
801 int unit = effect.fTextureUnits[s]; 801 int unit = effect.fTextureUnits[s];
802 gpu->bindTexture(unit, access.getParams(), texture); 802 gpu->bindTexture(unit, access.getParams(), texture);
803 } 803 }
804 } 804 }
805 } 805 }
806 806
807 void GrGLProgram::setData(GrGpuGL* gpu, 807 void GrGLProgram::setData(GrGpuGL* gpu,
808 GrDrawState::BlendOptFlags blendOpts, 808 GrDrawState::BlendOptFlags blendOpts,
(...skipping 14 matching lines...) Expand all
823 } else { 823 } else {
824 color = drawState.getColor(); 824 color = drawState.getColor();
825 coverage = drawState.getCoverage(); 825 coverage = drawState.getCoverage();
826 } 826 }
827 827
828 this->setColor(drawState, color, sharedState); 828 this->setColor(drawState, color, sharedState);
829 this->setCoverage(drawState, coverage, sharedState); 829 this->setCoverage(drawState, coverage, sharedState);
830 this->setMatrixAndRenderTargetHeight(drawState); 830 this->setMatrixAndRenderTargetHeight(drawState);
831 831
832 // Setup the SkXfermode::Mode-based colorfilter uniform if necessary 832 // Setup the SkXfermode::Mode-based colorfilter uniform if necessary
833 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fColorFilte rUni && 833 if (fUniformHandles.fColorFilterUni.isValid() &&
834 fColorFilterColor != drawState.getColorFilterColor()) { 834 fColorFilterColor != drawState.getColorFilterColor()) {
835 GrGLfloat c[4]; 835 GrGLfloat c[4];
836 GrColorToRGBAFloat(drawState.getColorFilterColor(), c); 836 GrColorToRGBAFloat(drawState.getColorFilterColor(), c);
837 fUniformManager.set4fv(fUniformHandles.fColorFilterUni, 0, 1, c); 837 fUniformManager.set4fv(fUniformHandles.fColorFilterUni, 0, 1, c);
838 fColorFilterColor = drawState.getColorFilterColor(); 838 fColorFilterColor = drawState.getColorFilterColor();
839 } 839 }
840 840
841 if (NULL != dstCopy) { 841 if (NULL != dstCopy) {
842 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCop yTopLeftUni) { 842 if (fUniformHandles.fDstCopyTopLeftUni.isValid()) {
843 GrAssert(GrGLUniformManager::kInvalidUniformHandle != fUniformHandle s.fDstCopyScaleUni);
844 GrAssert(GrGLUniformManager::kInvalidUniformHandle !=
845 fUniformHandles.fDstCopySamplerUni);
846 fUniformManager.set2f(fUniformHandles.fDstCopyTopLeftUni, 843 fUniformManager.set2f(fUniformHandles.fDstCopyTopLeftUni,
847 static_cast<GrGLfloat>(dstCopy->offset().fX), 844 static_cast<GrGLfloat>(dstCopy->offset().fX),
848 static_cast<GrGLfloat>(dstCopy->offset().fY)); 845 static_cast<GrGLfloat>(dstCopy->offset().fY));
849 fUniformManager.set2f(fUniformHandles.fDstCopyScaleUni, 846 fUniformManager.set2f(fUniformHandles.fDstCopyScaleUni,
850 1.f / dstCopy->texture()->width(), 847 1.f / dstCopy->texture()->width(),
851 1.f / dstCopy->texture()->height()); 848 1.f / dstCopy->texture()->height());
852 GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture()) ; 849 GrGLTexture* texture = static_cast<GrGLTexture*>(dstCopy->texture()) ;
853 static GrTextureParams kParams; // the default is clamp, nearest fil tering. 850 static GrTextureParams kParams; // the default is clamp, nearest fil tering.
854 gpu->bindTexture(fDstCopyTexUnit, kParams, texture); 851 gpu->bindTexture(fDstCopyTexUnit, kParams, texture);
855 } else { 852 } else {
856 GrAssert(GrGLUniformManager::kInvalidUniformHandle == 853 GrAssert(!fUniformHandles.fDstCopyScaleUni.isValid());
857 fUniformHandles.fDstCopyScaleUni); 854 GrAssert(!fUniformHandles.fDstCopySamplerUni.isValid());
858 GrAssert(GrGLUniformManager::kInvalidUniformHandle ==
859 fUniformHandles.fDstCopySamplerUni);
860 } 855 }
861 } else { 856 } else {
862 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopyTopLeftUni); 857 GrAssert(!fUniformHandles.fDstCopyTopLeftUni.isValid());
863 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopyScaleUni); 858 GrAssert(!fUniformHandles.fDstCopyScaleUni.isValid());
864 GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fD stCopySamplerUni); 859 GrAssert(!fUniformHandles.fDstCopySamplerUni.isValid());
865 } 860 }
866 861
867 for (int e = 0; e < fColorEffects.count(); ++e) { 862 for (int e = 0; e < fColorEffects.count(); ++e) {
868 // We may have omitted the GrGLEffect because of the color filter logic in genProgram. 863 // We may have omitted the GrGLEffect because of the color filter logic in genProgram.
869 // This can be removed when the color filter is an effect. 864 // This can be removed when the color filter is an effect.
870 if (NULL != fColorEffects[e].fGLEffect) { 865 if (NULL != fColorEffects[e].fGLEffect) {
871 this->setEffectData(gpu, *colorStages[e], fColorEffects[e]); 866 this->setEffectData(gpu, *colorStages[e], fColorEffects[e]);
872 } 867 }
873 } 868 }
874 869
(...skipping 20 matching lines...) Expand all
895 GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c)); 890 GL_CALL(VertexAttrib4fv(header.fColorAttributeIndex, c));
896 sharedState->fConstAttribColor = color; 891 sharedState->fConstAttribColor = color;
897 sharedState->fConstAttribColorIndex = header.fColorAttribute Index; 892 sharedState->fConstAttribColorIndex = header.fColorAttribute Index;
898 } 893 }
899 break; 894 break;
900 case GrGLProgramDesc::kUniform_ColorInput: 895 case GrGLProgramDesc::kUniform_ColorInput:
901 if (fColor != color) { 896 if (fColor != color) {
902 // OpenGL ES doesn't support unsigned byte varieties of glUn iform 897 // OpenGL ES doesn't support unsigned byte varieties of glUn iform
903 GrGLfloat c[4]; 898 GrGLfloat c[4];
904 GrColorToRGBAFloat(color, c); 899 GrColorToRGBAFloat(color, c);
905 GrAssert(GrGLUniformManager::kInvalidUniformHandle !=
906 fUniformHandles.fColorUni);
907 fUniformManager.set4fv(fUniformHandles.fColorUni, 0, 1, c); 900 fUniformManager.set4fv(fUniformHandles.fColorUni, 0, 1, c);
908 fColor = color; 901 fColor = color;
909 } 902 }
910 sharedState->fConstAttribColorIndex = -1; 903 sharedState->fConstAttribColorIndex = -1;
911 break; 904 break;
912 case GrGLProgramDesc::kSolidWhite_ColorInput: 905 case GrGLProgramDesc::kSolidWhite_ColorInput:
913 case GrGLProgramDesc::kTransBlack_ColorInput: 906 case GrGLProgramDesc::kTransBlack_ColorInput:
914 sharedState->fConstAttribColorIndex = -1; 907 sharedState->fConstAttribColorIndex = -1;
915 break; 908 break;
916 default: 909 default:
(...skipping 19 matching lines...) Expand all
936 GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c)); 929 GL_CALL(VertexAttrib4fv(header.fCoverageAttributeIndex, c));
937 sharedState->fConstAttribCoverage = coverage; 930 sharedState->fConstAttribCoverage = coverage;
938 sharedState->fConstAttribCoverageIndex = header.fCoverageAtt ributeIndex; 931 sharedState->fConstAttribCoverageIndex = header.fCoverageAtt ributeIndex;
939 } 932 }
940 break; 933 break;
941 case GrGLProgramDesc::kUniform_ColorInput: 934 case GrGLProgramDesc::kUniform_ColorInput:
942 if (fCoverage != coverage) { 935 if (fCoverage != coverage) {
943 // OpenGL ES doesn't support unsigned byte varieties of glUn iform 936 // OpenGL ES doesn't support unsigned byte varieties of glUn iform
944 GrGLfloat c[4]; 937 GrGLfloat c[4];
945 GrColorToRGBAFloat(coverage, c); 938 GrColorToRGBAFloat(coverage, c);
946 GrAssert(GrGLUniformManager::kInvalidUniformHandle !=
947 fUniformHandles.fCoverageUni);
948 fUniformManager.set4fv(fUniformHandles.fCoverageUni, 0, 1, c ); 939 fUniformManager.set4fv(fUniformHandles.fCoverageUni, 0, 1, c );
949 fCoverage = coverage; 940 fCoverage = coverage;
950 } 941 }
951 sharedState->fConstAttribCoverageIndex = -1; 942 sharedState->fConstAttribCoverageIndex = -1;
952 break; 943 break;
953 case GrGLProgramDesc::kSolidWhite_ColorInput: 944 case GrGLProgramDesc::kSolidWhite_ColorInput:
954 case GrGLProgramDesc::kTransBlack_ColorInput: 945 case GrGLProgramDesc::kTransBlack_ColorInput:
955 sharedState->fConstAttribCoverageIndex = -1; 946 sharedState->fConstAttribCoverageIndex = -1;
956 break; 947 break;
957 default: 948 default:
958 GrCrash("Unknown coverage type."); 949 GrCrash("Unknown coverage type.");
959 } 950 }
960 } else { 951 } else {
961 sharedState->fConstAttribCoverageIndex = -1; 952 sharedState->fConstAttribCoverageIndex = -1;
962 } 953 }
963 } 954 }
964 955
965 void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { 956 void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) {
966 const GrRenderTarget* rt = drawState.getRenderTarget(); 957 const GrRenderTarget* rt = drawState.getRenderTarget();
967 SkISize size; 958 SkISize size;
968 size.set(rt->width(), rt->height()); 959 size.set(rt->width(), rt->height());
969 960
970 // Load the RT height uniform if it is needed to y-flip gl_FragCoord. 961 // Load the RT height uniform if it is needed to y-flip gl_FragCoord.
971 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fRTHeightUn i && 962 if (fUniformHandles.fRTHeightUni.isValid() &&
972 fMatrixState.fRenderTargetSize.fHeight != size.fHeight) { 963 fMatrixState.fRenderTargetSize.fHeight != size.fHeight) {
973 fUniformManager.set1f(fUniformHandles.fRTHeightUni, SkIntToScalar(size.f Height)); 964 fUniformManager.set1f(fUniformHandles.fRTHeightUni, SkIntToScalar(size.f Height));
974 } 965 }
975 966
976 if (fMatrixState.fRenderTargetOrigin != rt->origin() || 967 if (fMatrixState.fRenderTargetOrigin != rt->origin() ||
977 !fMatrixState.fViewMatrix.cheapEqualTo(drawState.getViewMatrix()) || 968 !fMatrixState.fViewMatrix.cheapEqualTo(drawState.getViewMatrix()) ||
978 fMatrixState.fRenderTargetSize != size) { 969 fMatrixState.fRenderTargetSize != size) {
979 SkMatrix m; 970 SkMatrix m;
980 if (kBottomLeft_GrSurfaceOrigin == rt->origin()) { 971 if (kBottomLeft_GrSurfaceOrigin == rt->origin()) {
981 m.setAll( 972 m.setAll(
(...skipping 19 matching lines...) Expand all
1001 SkScalarToFloat(m[SkMatrix::kMTransX]), 992 SkScalarToFloat(m[SkMatrix::kMTransX]),
1002 SkScalarToFloat(m[SkMatrix::kMTransY]), 993 SkScalarToFloat(m[SkMatrix::kMTransY]),
1003 SkScalarToFloat(m[SkMatrix::kMPersp2]) 994 SkScalarToFloat(m[SkMatrix::kMPersp2])
1004 }; 995 };
1005 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt); 996 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt);
1006 fMatrixState.fViewMatrix = drawState.getViewMatrix(); 997 fMatrixState.fViewMatrix = drawState.getViewMatrix();
1007 fMatrixState.fRenderTargetSize = size; 998 fMatrixState.fRenderTargetSize = size;
1008 fMatrixState.fRenderTargetOrigin = rt->origin(); 999 fMatrixState.fRenderTargetOrigin = rt->origin();
1009 } 1000 }
1010 } 1001 }
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