| OLD | NEW |
| 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 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 GL_CALL(BindFragDataLocation(fProgramID, 0, declared_color_output_name()
)); | 698 GL_CALL(BindFragDataLocation(fProgramID, 0, declared_color_output_name()
)); |
| 699 } | 699 } |
| 700 if (bindDualSrcOut) { | 700 if (bindDualSrcOut) { |
| 701 GL_CALL(BindFragDataLocationIndexed(fProgramID, 0, 1, dual_source_output
_name())); | 701 GL_CALL(BindFragDataLocationIndexed(fProgramID, 0, 1, dual_source_output
_name())); |
| 702 } | 702 } |
| 703 | 703 |
| 704 // Bind the attrib locations to same values for all shaders | 704 // Bind the attrib locations to same values for all shaders |
| 705 GL_CALL(BindAttribLocation(fProgramID, | 705 GL_CALL(BindAttribLocation(fProgramID, |
| 706 fDesc.fPositionAttributeIndex, | 706 fDesc.fPositionAttributeIndex, |
| 707 builder.positionAttribute().c_str())); | 707 builder.positionAttribute().c_str())); |
| 708 GL_CALL(BindAttribLocation(fProgramID, fDesc.fColorAttributeIndex, COL_ATTR_
NAME)); | 708 if (-1 != fDesc.fLocalCoordAttributeIndex) { |
| 709 GL_CALL(BindAttribLocation(fProgramID, fDesc.fCoverageAttributeIndex, COV_AT
TR_NAME)); | |
| 710 | |
| 711 if (fDesc.fAttribBindings & GrDrawState::kLocalCoords_AttribBindingsBit) { | |
| 712 GL_CALL(BindAttribLocation(fProgramID, | 709 GL_CALL(BindAttribLocation(fProgramID, |
| 713 fDesc.fLocalCoordsAttributeIndex, | 710 fDesc.fLocalCoordAttributeIndex, |
| 714 builder.localCoordsAttribute().c_str())); | 711 builder.localCoordsAttribute().c_str())); |
| 715 } | 712 } |
| 713 if (-1 != fDesc.fColorAttributeIndex) { |
| 714 GL_CALL(BindAttribLocation(fProgramID, fDesc.fColorAttributeIndex, COL_A
TTR_NAME)); |
| 715 } |
| 716 if (-1 != fDesc.fCoverageAttributeIndex) { |
| 717 GL_CALL(BindAttribLocation(fProgramID, fDesc.fCoverageAttributeIndex, CO
V_ATTR_NAME)); |
| 718 } |
| 716 | 719 |
| 717 const GrGLShaderBuilder::AttributePair* attribEnd = builder.getEffectAttribu
tes().end(); | 720 const GrGLShaderBuilder::AttributePair* attribEnd = builder.getEffectAttribu
tes().end(); |
| 718 for (const GrGLShaderBuilder::AttributePair* attrib = builder.getEffectAttri
butes().begin(); | 721 for (const GrGLShaderBuilder::AttributePair* attrib = builder.getEffectAttri
butes().begin(); |
| 719 attrib != attribEnd; | 722 attrib != attribEnd; |
| 720 ++attrib) { | 723 ++attrib) { |
| 721 GL_CALL(BindAttribLocation(fProgramID, attrib->fIndex, attrib->fName.c_
str())); | 724 GL_CALL(BindAttribLocation(fProgramID, attrib->fIndex, attrib->fName.c_
str())); |
| 722 } | 725 } |
| 723 | 726 |
| 724 GL_CALL(LinkProgram(fProgramID)); | 727 GL_CALL(LinkProgram(fProgramID)); |
| 725 | 728 |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 819 GrAssert(GrGLUniformManager::kInvalidUniformHandle == | 822 GrAssert(GrGLUniformManager::kInvalidUniformHandle == |
| 820 fUniformHandles.fDstCopyScaleUni); | 823 fUniformHandles.fDstCopyScaleUni); |
| 821 GrAssert(GrGLUniformManager::kInvalidUniformHandle == | 824 GrAssert(GrGLUniformManager::kInvalidUniformHandle == |
| 822 fUniformHandles.fDstCopySamplerUni); | 825 fUniformHandles.fDstCopySamplerUni); |
| 823 } | 826 } |
| 824 for (int s = 0; s < GrDrawState::kNumStages; ++s) { | 827 for (int s = 0; s < GrDrawState::kNumStages; ++s) { |
| 825 if (NULL != fEffects[s]) { | 828 if (NULL != fEffects[s]) { |
| 826 const GrEffectStage& stage = drawState.getStage(s); | 829 const GrEffectStage& stage = drawState.getStage(s); |
| 827 GrAssert(NULL != stage.getEffect()); | 830 GrAssert(NULL != stage.getEffect()); |
| 828 | 831 |
| 829 bool explicitLocalCoords = | 832 bool explicitLocalCoords = -1 != fDesc.fLocalCoordAttributeIndex; |
| 830 (fDesc.fAttribBindings & GrDrawState::kLocalCoords_AttribBinding
sBit); | |
| 831 GrDrawEffect drawEffect(stage, explicitLocalCoords); | 833 GrDrawEffect drawEffect(stage, explicitLocalCoords); |
| 832 fEffects[s]->setData(fUniformManager, drawEffect); | 834 fEffects[s]->setData(fUniformManager, drawEffect); |
| 833 int numSamplers = fUniformHandles.fEffectSamplerUnis[s].count(); | 835 int numSamplers = fUniformHandles.fEffectSamplerUnis[s].count(); |
| 834 for (int u = 0; u < numSamplers; ++u) { | 836 for (int u = 0; u < numSamplers; ++u) { |
| 835 UniformHandle handle = fUniformHandles.fEffectSamplerUnis[s][u]; | 837 UniformHandle handle = fUniformHandles.fEffectSamplerUnis[s][u]; |
| 836 if (GrGLUniformManager::kInvalidUniformHandle != handle) { | 838 if (GrGLUniformManager::kInvalidUniformHandle != handle) { |
| 837 const GrTextureAccess& access = (*stage.getEffect())->textur
eAccess(u); | 839 const GrTextureAccess& access = (*stage.getEffect())->textur
eAccess(u); |
| 838 GrGLTexture* texture = static_cast<GrGLTexture*>(access.getT
exture()); | 840 GrGLTexture* texture = static_cast<GrGLTexture*>(access.getT
exture()); |
| 839 gpu->bindTexture(texUnitIdx, access.getParams(), texture); | 841 gpu->bindTexture(texUnitIdx, access.getParams(), texture); |
| 840 ++texUnitIdx; | 842 ++texUnitIdx; |
| 841 } | 843 } |
| 842 } | 844 } |
| 843 } | 845 } |
| 844 } | 846 } |
| 845 } | 847 } |
| 846 | 848 |
| 847 void GrGLProgram::setColor(const GrDrawState& drawState, | 849 void GrGLProgram::setColor(const GrDrawState& drawState, |
| 848 GrColor color, | 850 GrColor color, |
| 849 SharedGLState* sharedState) { | 851 SharedGLState* sharedState) { |
| 850 if (!(drawState.getAttribBindings() & GrDrawState::kColor_AttribBindingsBit)
) { | 852 if (!drawState.hasColorVertexAttribute()) { |
| 851 switch (fDesc.fColorInput) { | 853 switch (fDesc.fColorInput) { |
| 852 case GrGLProgramDesc::kAttribute_ColorInput: | 854 case GrGLProgramDesc::kAttribute_ColorInput: |
| 853 if (sharedState->fConstAttribColor != color) { | 855 GrAssert(-1 != fDesc.fColorAttributeIndex); |
| 856 if (sharedState->fConstAttribColor != color || |
| 857 sharedState->fConstAttribColorIndex != fDesc.fColorAttribute
Index) { |
| 854 // OpenGL ES only supports the float varieties of glVertexAt
trib | 858 // OpenGL ES only supports the float varieties of glVertexAt
trib |
| 855 GrGLfloat c[4]; | 859 GrGLfloat c[4]; |
| 856 GrColorToRGBAFloat(color, c); | 860 GrColorToRGBAFloat(color, c); |
| 857 GL_CALL(VertexAttrib4fv(fDesc.fColorAttributeIndex, c)); | 861 GL_CALL(VertexAttrib4fv(fDesc.fColorAttributeIndex, c)); |
| 858 sharedState->fConstAttribColor = color; | 862 sharedState->fConstAttribColor = color; |
| 863 sharedState->fConstAttribColorIndex = fDesc.fColorAttributeI
ndex; |
| 859 } | 864 } |
| 860 break; | 865 break; |
| 861 case GrGLProgramDesc::kUniform_ColorInput: | 866 case GrGLProgramDesc::kUniform_ColorInput: |
| 862 if (fColor != color) { | 867 if (fColor != color) { |
| 863 // OpenGL ES doesn't support unsigned byte varieties of glUn
iform | 868 // OpenGL ES doesn't support unsigned byte varieties of glUn
iform |
| 864 GrGLfloat c[4]; | 869 GrGLfloat c[4]; |
| 865 GrColorToRGBAFloat(color, c); | 870 GrColorToRGBAFloat(color, c); |
| 866 GrAssert(GrGLUniformManager::kInvalidUniformHandle != | 871 GrAssert(GrGLUniformManager::kInvalidUniformHandle != |
| 867 fUniformHandles.fColorUni); | 872 fUniformHandles.fColorUni); |
| 868 fUniformManager.set4fv(fUniformHandles.fColorUni, 0, 1, c); | 873 fUniformManager.set4fv(fUniformHandles.fColorUni, 0, 1, c); |
| 869 fColor = color; | 874 fColor = color; |
| 870 } | 875 } |
| 876 sharedState->fConstAttribColorIndex = -1; |
| 871 break; | 877 break; |
| 872 case GrGLProgramDesc::kSolidWhite_ColorInput: | 878 case GrGLProgramDesc::kSolidWhite_ColorInput: |
| 873 case GrGLProgramDesc::kTransBlack_ColorInput: | 879 case GrGLProgramDesc::kTransBlack_ColorInput: |
| 880 sharedState->fConstAttribColorIndex = -1; |
| 874 break; | 881 break; |
| 875 default: | 882 default: |
| 876 GrCrash("Unknown color type."); | 883 GrCrash("Unknown color type."); |
| 877 } | 884 } |
| 885 } else { |
| 886 sharedState->fConstAttribColorIndex = -1; |
| 878 } | 887 } |
| 879 } | 888 } |
| 880 | 889 |
| 881 void GrGLProgram::setCoverage(const GrDrawState& drawState, | 890 void GrGLProgram::setCoverage(const GrDrawState& drawState, |
| 882 GrColor coverage, | 891 GrColor coverage, |
| 883 SharedGLState* sharedState) { | 892 SharedGLState* sharedState) { |
| 884 if (!(drawState.getAttribBindings() & GrDrawState::kCoverage_AttribBindingsB
it)) { | 893 if (!drawState.hasCoverageVertexAttribute()) { |
| 885 switch (fDesc.fCoverageInput) { | 894 switch (fDesc.fCoverageInput) { |
| 886 case GrGLProgramDesc::kAttribute_ColorInput: | 895 case GrGLProgramDesc::kAttribute_ColorInput: |
| 887 if (sharedState->fConstAttribCoverage != coverage) { | 896 if (sharedState->fConstAttribCoverage != coverage || |
| 897 sharedState->fConstAttribCoverageIndex != fDesc.fCoverageAtt
ributeIndex) { |
| 888 // OpenGL ES only supports the float varieties of glVertexA
ttrib | 898 // OpenGL ES only supports the float varieties of glVertexA
ttrib |
| 889 GrGLfloat c[4]; | 899 GrGLfloat c[4]; |
| 890 GrColorToRGBAFloat(coverage, c); | 900 GrColorToRGBAFloat(coverage, c); |
| 891 GL_CALL(VertexAttrib4fv(fDesc.fCoverageAttributeIndex, c)); | 901 GL_CALL(VertexAttrib4fv(fDesc.fCoverageAttributeIndex, c)); |
| 892 sharedState->fConstAttribCoverage = coverage; | 902 sharedState->fConstAttribCoverage = coverage; |
| 903 sharedState->fConstAttribCoverageIndex = fDesc.fCoverageAttr
ibuteIndex; |
| 893 } | 904 } |
| 894 break; | 905 break; |
| 895 case GrGLProgramDesc::kUniform_ColorInput: | 906 case GrGLProgramDesc::kUniform_ColorInput: |
| 896 if (fCoverage != coverage) { | 907 if (fCoverage != coverage) { |
| 897 // OpenGL ES doesn't support unsigned byte varieties of glUn
iform | 908 // OpenGL ES doesn't support unsigned byte varieties of glUn
iform |
| 898 GrGLfloat c[4]; | 909 GrGLfloat c[4]; |
| 899 GrColorToRGBAFloat(coverage, c); | 910 GrColorToRGBAFloat(coverage, c); |
| 900 GrAssert(GrGLUniformManager::kInvalidUniformHandle != | 911 GrAssert(GrGLUniformManager::kInvalidUniformHandle != |
| 901 fUniformHandles.fCoverageUni); | 912 fUniformHandles.fCoverageUni); |
| 902 fUniformManager.set4fv(fUniformHandles.fCoverageUni, 0, 1, c
); | 913 fUniformManager.set4fv(fUniformHandles.fCoverageUni, 0, 1, c
); |
| 903 fCoverage = coverage; | 914 fCoverage = coverage; |
| 904 } | 915 } |
| 916 sharedState->fConstAttribCoverageIndex = -1; |
| 905 break; | 917 break; |
| 906 case GrGLProgramDesc::kSolidWhite_ColorInput: | 918 case GrGLProgramDesc::kSolidWhite_ColorInput: |
| 907 case GrGLProgramDesc::kTransBlack_ColorInput: | 919 case GrGLProgramDesc::kTransBlack_ColorInput: |
| 920 sharedState->fConstAttribCoverageIndex = -1; |
| 908 break; | 921 break; |
| 909 default: | 922 default: |
| 910 GrCrash("Unknown coverage type."); | 923 GrCrash("Unknown coverage type."); |
| 911 } | 924 } |
| 925 } else { |
| 926 sharedState->fConstAttribCoverageIndex = -1; |
| 912 } | 927 } |
| 913 } | 928 } |
| 914 | 929 |
| 915 void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { | 930 void GrGLProgram::setMatrixAndRenderTargetHeight(const GrDrawState& drawState) { |
| 916 const GrRenderTarget* rt = drawState.getRenderTarget(); | 931 const GrRenderTarget* rt = drawState.getRenderTarget(); |
| 917 SkISize size; | 932 SkISize size; |
| 918 size.set(rt->width(), rt->height()); | 933 size.set(rt->width(), rt->height()); |
| 919 | 934 |
| 920 // Load the RT height uniform if it is needed to y-flip gl_FragCoord. | 935 // Load the RT height uniform if it is needed to y-flip gl_FragCoord. |
| 921 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fRTHeightUn
i && | 936 if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fRTHeightUn
i && |
| (...skipping 29 matching lines...) Expand all Loading... |
| 951 SkScalarToFloat(m[SkMatrix::kMTransX]), | 966 SkScalarToFloat(m[SkMatrix::kMTransX]), |
| 952 SkScalarToFloat(m[SkMatrix::kMTransY]), | 967 SkScalarToFloat(m[SkMatrix::kMTransY]), |
| 953 SkScalarToFloat(m[SkMatrix::kMPersp2]) | 968 SkScalarToFloat(m[SkMatrix::kMPersp2]) |
| 954 }; | 969 }; |
| 955 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt); | 970 fUniformManager.setMatrix3f(fUniformHandles.fViewMatrixUni, mt); |
| 956 fMatrixState.fViewMatrix = drawState.getViewMatrix(); | 971 fMatrixState.fViewMatrix = drawState.getViewMatrix(); |
| 957 fMatrixState.fRenderTargetSize = size; | 972 fMatrixState.fRenderTargetSize = size; |
| 958 fMatrixState.fRenderTargetOrigin = rt->origin(); | 973 fMatrixState.fRenderTargetOrigin = rt->origin(); |
| 959 } | 974 } |
| 960 } | 975 } |
| OLD | NEW |