@@ -196,6 +196,8 @@ class GLShader {
196
196
PUSH
197
197
};
198
198
199
+ bool uniformsUpdated = true ;
200
+
199
201
void MarkProgramForBuilding ( int deformIndex );
200
202
GLuint GetProgram ( int deformIndex, const bool buildOneShader );
201
203
void BindProgram ( int deformIndex );
@@ -543,20 +545,28 @@ class GLUniformSampler : protected GLUniform {
543
545
currentValue = value;
544
546
}
545
547
546
- void SetValueBindless ( GLint64 value ) {
547
- currentValueBindless = value;
548
+ void SetValueBindless ( GLuint64 value ) {
549
+ if ( !glConfig2.usingBindlessTextures ) {
550
+ return ;
551
+ }
548
552
549
- if ( glConfig2.usingBindlessTextures ) {
550
- if ( _shader->UseMaterialSystem () && _updateType == TEXDATA_OR_PUSH ) {
551
- return ;
553
+ if ( _shader->UseMaterialSystem () && _updateType == TEXDATA_OR_PUSH ) {
554
+ if ( currentValueBindless != value ) {
555
+ currentValueBindless = value;
556
+ _shader->uniformsUpdated = true ;
552
557
}
558
+ return ;
559
+ }
553
560
554
- if ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) {
555
- return ;
561
+ if ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) {
562
+ if ( currentValueBindless != value ) {
563
+ currentValueBindless = value;
564
+ _shader->uniformsUpdated = true ;
556
565
}
557
-
558
- glUniformHandleui64ARB ( GetLocation (), currentValueBindless );
566
+ return ;
559
567
}
568
+
569
+ glUniformHandleui64ARB ( GetLocation (), value );
560
570
}
561
571
562
572
uint32_t * WriteToBuffer ( uint32_t * buffer ) override {
@@ -612,14 +622,18 @@ class GLUniform1i : protected GLUniform
612
622
613
623
inline void SetValue ( int value )
614
624
{
615
- ShaderProgramDescriptor *p = _shader->GetProgram ();
616
-
617
625
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
618
626
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
619
- currentValue = value;
627
+
628
+ if ( currentValue != value ) {
629
+ currentValue = value;
630
+ _shader->uniformsUpdated = true ;
631
+ }
632
+
620
633
return ;
621
634
}
622
635
636
+ ShaderProgramDescriptor *p = _shader->GetProgram ();
623
637
ASSERT_EQ ( p, glState.currentProgram );
624
638
625
639
#if defined( USE_UNIFORM_FIREWALL )
@@ -656,14 +670,18 @@ class GLUniform1ui : protected GLUniform {
656
670
}
657
671
658
672
inline void SetValue ( uint value ) {
659
- ShaderProgramDescriptor* p = _shader->GetProgram ();
660
-
661
673
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
662
674
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
663
- currentValue = value;
675
+
676
+ if ( currentValue != value ) {
677
+ currentValue = value;
678
+ _shader->uniformsUpdated = true ;
679
+ }
680
+
664
681
return ;
665
682
}
666
683
684
+ ShaderProgramDescriptor* p = _shader->GetProgram ();
667
685
ASSERT_EQ ( p, glState.currentProgram );
668
686
669
687
#if defined( USE_UNIFORM_FIREWALL )
@@ -699,14 +717,18 @@ class GLUniform1Bool : protected GLUniform {
699
717
}
700
718
701
719
inline void SetValue ( int value ) {
702
- ShaderProgramDescriptor* p = _shader->GetProgram ();
703
-
704
720
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
705
721
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
706
- currentValue = value;
722
+
723
+ if ( currentValue != value ) {
724
+ currentValue = value;
725
+ _shader->uniformsUpdated = true ;
726
+ }
727
+
707
728
return ;
708
729
}
709
730
731
+ ShaderProgramDescriptor* p = _shader->GetProgram ();
710
732
ASSERT_EQ ( p, glState.currentProgram );
711
733
712
734
#if defined( USE_UNIFORM_FIREWALL )
@@ -745,14 +767,18 @@ class GLUniform1f : protected GLUniform
745
767
746
768
inline void SetValue ( float value )
747
769
{
748
- ShaderProgramDescriptor *p = _shader->GetProgram ();
749
-
750
770
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
751
771
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
752
- currentValue = value;
772
+
773
+ if ( currentValue != value ) {
774
+ currentValue = value;
775
+ _shader->uniformsUpdated = true ;
776
+ }
777
+
753
778
return ;
754
779
}
755
780
781
+ ShaderProgramDescriptor *p = _shader->GetProgram ();
756
782
ASSERT_EQ ( p, glState.currentProgram );
757
783
758
784
#if defined( USE_UNIFORM_FIREWALL )
@@ -793,14 +819,18 @@ class GLUniform1fv : protected GLUniform
793
819
794
820
inline void SetValue ( int numFloats, float *f )
795
821
{
796
- ShaderProgramDescriptor *p = _shader->GetProgram ();
797
-
798
822
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
799
823
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
800
- memcpy ( currentValue.data (), f, numFloats * sizeof ( float ) );
824
+
825
+ if ( !memcmp ( currentValue.data (), f, numFloats * sizeof ( float ) ) ) {
826
+ memcpy ( currentValue.data (), f, numFloats * sizeof ( float ) );
827
+ _shader->uniformsUpdated = true ;
828
+ }
829
+
801
830
return ;
802
831
}
803
832
833
+ ShaderProgramDescriptor *p = _shader->GetProgram ();
804
834
ASSERT_EQ ( p, glState.currentProgram );
805
835
806
836
glUniform1fv ( p->uniformLocations [ _locationIndex ], numFloats, f );
@@ -827,14 +857,18 @@ class GLUniform2f : protected GLUniform
827
857
828
858
inline void SetValue ( const vec2_t v )
829
859
{
830
- ShaderProgramDescriptor *p = _shader->GetProgram ();
831
-
832
860
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
833
861
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
834
- Vector2Copy ( v, currentValue );
862
+
863
+ if ( currentValue[0 ] != v[0 ] || currentValue[1 ] != v[1 ] ) {
864
+ Vector2Copy ( v, currentValue );
865
+ _shader->uniformsUpdated = true ;
866
+ }
867
+
835
868
return ;
836
869
}
837
870
871
+ ShaderProgramDescriptor *p = _shader->GetProgram ();
838
872
ASSERT_EQ ( p, glState.currentProgram );
839
873
840
874
#if defined( USE_UNIFORM_FIREWALL )
@@ -878,14 +912,18 @@ class GLUniform3f : protected GLUniform
878
912
879
913
inline void SetValue ( const vec3_t v )
880
914
{
881
- ShaderProgramDescriptor *p = _shader->GetProgram ();
882
-
883
915
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
884
916
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
885
- VectorCopy ( v, currentValue );
917
+
918
+ if ( !VectorCompare ( currentValue, v ) ) {
919
+ VectorCopy ( v, currentValue );
920
+ _shader->uniformsUpdated = true ;
921
+ }
922
+
886
923
return ;
887
924
}
888
925
926
+ ShaderProgramDescriptor *p = _shader->GetProgram ();
889
927
ASSERT_EQ ( p, glState.currentProgram );
890
928
891
929
#if defined( USE_UNIFORM_FIREWALL )
@@ -929,14 +967,18 @@ class GLUniform4f : protected GLUniform
929
967
930
968
inline void SetValue ( const vec4_t v )
931
969
{
932
- ShaderProgramDescriptor *p = _shader->GetProgram ();
933
-
934
970
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
935
971
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
936
- Vector4Copy ( v, currentValue );
972
+
973
+ if ( !VectorCompare ( currentValue, v ) || currentValue[3 ] != v[3 ] ) {
974
+ Vector4Copy ( v, currentValue );
975
+ _shader->uniformsUpdated = true ;
976
+ }
977
+
937
978
return ;
938
979
}
939
980
981
+ ShaderProgramDescriptor *p = _shader->GetProgram ();
940
982
ASSERT_EQ ( p, glState.currentProgram );
941
983
942
984
#if defined( USE_UNIFORM_FIREWALL )
@@ -977,14 +1019,18 @@ class GLUniform4fv : protected GLUniform
977
1019
978
1020
inline void SetValue ( int numV, vec4_t *v )
979
1021
{
980
- ShaderProgramDescriptor *p = _shader->GetProgram ();
981
-
982
1022
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
983
1023
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
984
- memcpy ( currentValue.data (), v, numV * sizeof ( vec4_t ) );
1024
+
1025
+ if ( !memcmp ( currentValue.data (), v, numV * sizeof ( vec4_t ) ) ) {
1026
+ memcpy ( currentValue.data (), v, numV * sizeof ( vec4_t ) );
1027
+ _shader->uniformsUpdated = true ;
1028
+ }
1029
+
985
1030
return ;
986
1031
}
987
1032
1033
+ ShaderProgramDescriptor *p = _shader->GetProgram ();
988
1034
ASSERT_EQ ( p, glState.currentProgram );
989
1035
990
1036
glUniform4fv ( p->uniformLocations [ _locationIndex ], numV, &v[ 0 ][ 0 ] );
@@ -1011,14 +1057,18 @@ class GLUniformMatrix4f : protected GLUniform
1011
1057
1012
1058
inline void SetValue ( GLboolean transpose, const matrix_t m )
1013
1059
{
1014
- ShaderProgramDescriptor *p = _shader->GetProgram ();
1015
-
1016
1060
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
1017
1061
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
1018
- MatrixCopy ( m, currentValue );
1062
+
1063
+ if ( !MatrixCompare ( currentValue, m ) ) {
1064
+ MatrixCopy ( m, currentValue );
1065
+ _shader->uniformsUpdated = true ;
1066
+ }
1067
+
1019
1068
return ;
1020
1069
}
1021
1070
1071
+ ShaderProgramDescriptor *p = _shader->GetProgram ();
1022
1072
ASSERT_EQ ( p, glState.currentProgram );
1023
1073
1024
1074
#if defined( USE_UNIFORM_FIREWALL )
@@ -1055,14 +1105,18 @@ class GLUniformMatrix32f : protected GLUniform {
1055
1105
}
1056
1106
1057
1107
inline void SetValue ( GLboolean transpose, const vec_t * m ) {
1058
- ShaderProgramDescriptor* p = _shader->GetProgram ();
1059
-
1060
1108
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
1061
1109
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
1062
- memcpy ( currentValue, m, 6 * sizeof ( float ) );
1110
+
1111
+ if ( !memcmp ( currentValue, m, 6 * sizeof ( float ) ) ) {
1112
+ memcpy ( currentValue, m, 6 * sizeof ( float ) );
1113
+ _shader->uniformsUpdated = true ;
1114
+ }
1115
+
1063
1116
return ;
1064
1117
}
1065
1118
1119
+ ShaderProgramDescriptor* p = _shader->GetProgram ();
1066
1120
ASSERT_EQ ( p, glState.currentProgram );
1067
1121
1068
1122
glUniformMatrix3x2fv ( p->uniformLocations [_locationIndex], 1 , transpose, m );
@@ -1092,14 +1146,18 @@ class GLUniformMatrix4fv : protected GLUniform
1092
1146
1093
1147
inline void SetValue ( int numMatrices, GLboolean transpose, const matrix_t *m )
1094
1148
{
1095
- ShaderProgramDescriptor *p = _shader->GetProgram ();
1096
-
1097
1149
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
1098
1150
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
1099
- memcpy ( currentValue.data (), m, numMatrices * sizeof ( matrix_t ) );
1151
+
1152
+ if ( !memcmp ( currentValue.data (), m, numMatrices * sizeof ( matrix_t ) ) ) {
1153
+ memcpy ( currentValue.data (), m, numMatrices * sizeof ( matrix_t ) );
1154
+ _shader->uniformsUpdated = true ;
1155
+ }
1156
+
1100
1157
return ;
1101
1158
}
1102
1159
1160
+ ShaderProgramDescriptor *p = _shader->GetProgram ();
1103
1161
ASSERT_EQ ( p, glState.currentProgram );
1104
1162
1105
1163
glUniformMatrix4fv ( p->uniformLocations [ _locationIndex ], numMatrices, transpose, &m[ 0 ][ 0 ] );
@@ -1125,14 +1183,18 @@ class GLUniformMatrix34fv : protected GLUniform
1125
1183
1126
1184
inline void SetValue ( int numMatrices, GLboolean transpose, const float *m )
1127
1185
{
1128
- ShaderProgramDescriptor *p = _shader->GetProgram ();
1129
-
1130
1186
if ( ( _shader->UseMaterialSystem () && _updateType == MATERIAL_OR_PUSH )
1131
1187
|| ( glConfig2.pushBufferAvailable && _updateType <= FRAME ) ) {
1132
- memcpy ( currentValue.data (), m, numMatrices * sizeof ( matrix_t ) );
1188
+
1189
+ if ( !memcmp ( currentValue.data (), m, numMatrices * sizeof ( matrix_t ) ) ) {
1190
+ memcpy ( currentValue.data (), m, numMatrices * sizeof ( matrix_t ) );
1191
+ _shader->uniformsUpdated = true ;
1192
+ }
1193
+
1133
1194
return ;
1134
1195
}
1135
1196
1197
+ ShaderProgramDescriptor *p = _shader->GetProgram ();
1136
1198
ASSERT_EQ ( p, glState.currentProgram );
1137
1199
1138
1200
glUniformMatrix3x4fv ( p->uniformLocations [ _locationIndex ], numMatrices, transpose, m );
0 commit comments