@@ -152,6 +152,74 @@ function computeBlendOperation(
152
152
}
153
153
}
154
154
155
+ function calculateExpectedClampValue (
156
+ srcValue : number ,
157
+ dstValue : number ,
158
+ srcFactor : GPUBlendFactor ,
159
+ dstFactor : GPUBlendFactor
160
+ ) {
161
+ let srcFactorValue ;
162
+ let dstFactorValue ;
163
+
164
+ switch ( srcFactor ) {
165
+ case 'zero' :
166
+ srcFactorValue = 0 ;
167
+ break ;
168
+ case 'one' :
169
+ case 'one-minus-constant' :
170
+ srcFactorValue = 1 ;
171
+ break ;
172
+ case 'src' :
173
+ case 'src-alpha' :
174
+ srcFactorValue = srcValue ;
175
+ break ;
176
+ case 'dst' :
177
+ srcFactorValue = dstValue ;
178
+ break ;
179
+ case 'one-minus-dst' :
180
+ srcFactorValue = 1 - dstValue ;
181
+ break ;
182
+ case 'one-minus-src' :
183
+ srcFactorValue = 1 - srcValue ;
184
+ break ;
185
+ case 'constant' :
186
+ srcFactorValue = 0 ;
187
+ break ;
188
+ default :
189
+ unreachable ( ) ;
190
+ }
191
+
192
+ switch ( dstFactor ) {
193
+ case 'zero' :
194
+ dstFactorValue = 0 ;
195
+ break ;
196
+ case 'one' :
197
+ case 'one-minus-constant' :
198
+ dstFactorValue = 1 ;
199
+ break ;
200
+ case 'src' :
201
+ case 'src-alpha' :
202
+ dstFactorValue = srcValue ;
203
+ break ;
204
+ case 'dst' :
205
+ dstFactorValue = dstValue ;
206
+ break ;
207
+ case 'one-minus-dst' :
208
+ dstFactorValue = 1 - dstValue ;
209
+ break ;
210
+ case 'one-minus-src' :
211
+ dstFactorValue = 1 - srcValue ;
212
+ break ;
213
+ case 'constant' :
214
+ dstFactorValue = 0 ;
215
+ break ;
216
+ default :
217
+ unreachable ( ) ;
218
+ }
219
+
220
+ return srcValue * srcFactorValue + dstValue * dstFactorValue ;
221
+ }
222
+
155
223
g . test ( 'blending,GPUBlendComponent' )
156
224
. desc (
157
225
`Test all combinations of parameters for GPUBlendComponent.
@@ -791,19 +859,36 @@ g.test('blending,clamping')
791
859
Test that clamping occurs at the correct points in the blend process: src value, src factor, dst
792
860
factor, and output.
793
861
- TODO: Need to test snorm formats.
794
- - TODO: Need to test src value, srcFactor and dstFactor.
795
862
`
796
863
)
797
864
. params ( u =>
798
865
u //
799
866
. combine ( 'format' , [ 'rgba8unorm' , 'rg16float' ] as const )
867
+ . combine ( 'srcFactor' , kBlendFactors )
868
+ . combine ( 'dstFactor' , kBlendFactors )
869
+ . filter ( t => {
870
+ return (
871
+ ! (
872
+ t . srcFactor === 'one-minus-src-alpha' ||
873
+ t . srcFactor === 'dst-alpha' ||
874
+ t . srcFactor === 'one-minus-dst-alpha' ||
875
+ t . srcFactor === 'src-alpha-saturated'
876
+ ) &&
877
+ ! (
878
+ t . dstFactor === 'one-minus-src-alpha' ||
879
+ t . dstFactor === 'dst-alpha' ||
880
+ t . dstFactor === 'one-minus-dst-alpha' ||
881
+ t . dstFactor === 'src-alpha-saturated'
882
+ )
883
+ ) ;
884
+ } )
800
885
. combine ( 'srcValue' , [ 0.4 , 0.6 , 0.8 , 1.0 ] )
801
886
. combine ( 'dstValue' , [ 0.2 , 0.4 ] )
802
887
)
803
888
. fn ( async t => {
804
- const { format, srcValue, dstValue } = t . params ;
889
+ const { format, srcFactor , dstFactor , srcValue, dstValue } = t . params ;
805
890
806
- const blendComponent = { srcFactor : 'one' , dstFactor : 'one' , operation : 'add' } as const ;
891
+ const blendComponent = { srcFactor, dstFactor, operation : 'add' } as const ;
807
892
808
893
const pipeline = t . device . createRenderPipeline ( {
809
894
layout : 'auto' ,
@@ -866,10 +951,13 @@ g.test('blending,clamping')
866
951
let expValue : number ;
867
952
switch ( format ) {
868
953
case 'rgba8unorm' : // unorm types should clamp if the sum of srcValue and dstValue exceeds 1.
869
- expValue = clamp ( srcValue + dstValue , { min : 0 , max : 1 } ) ;
954
+ expValue = clamp ( calculateExpectedClampValue ( srcValue , dstValue , srcFactor , dstFactor ) , {
955
+ min : 0 ,
956
+ max : 1 ,
957
+ } ) ;
870
958
break ;
871
959
case 'rg16float' : // float format types doesn't clamp.
872
- expValue = srcValue + dstValue ;
960
+ expValue = calculateExpectedClampValue ( srcValue , dstValue , srcFactor , dstFactor ) ;
873
961
break ;
874
962
}
875
963
0 commit comments