File tree Expand file tree Collapse file tree 4 files changed +53
-5
lines changed
lib/ui/fixtures/shaders/general_shaders Expand file tree Collapse file tree 4 files changed +53
-5
lines changed Original file line number Diff line number Diff line change @@ -398,11 +398,25 @@ std::shared_ptr<RuntimeStageData::Shader> Reflector::GenerateRuntimeStageData()
398
398
break ;
399
399
}
400
400
case StructMember::UnderlyingType::kFloat : {
401
- size_t member_float_count = member.byte_length / sizeof (float );
402
- float_count += member_float_count;
403
- while (member_float_count > 0 ) {
404
- struct_layout.push_back (1 );
405
- member_float_count--;
401
+ if (member.array_elements > 1 ) {
402
+ // For each array element member, insert 1 layout property per byte
403
+ // and 0 layout property per byte of padding
404
+ for (auto i = 0 ; i < member.array_elements ; i++) {
405
+ for (auto j = 0u ; j < member.size / sizeof (float ); j++) {
406
+ struct_layout.push_back (1 );
407
+ }
408
+ for (auto j = 0u ; j < member.element_padding / sizeof (float );
409
+ j++) {
410
+ struct_layout.push_back (0 );
411
+ }
412
+ }
413
+ } else {
414
+ size_t member_float_count = member.byte_length / sizeof (float );
415
+ float_count += member_float_count;
416
+ while (member_float_count > 0 ) {
417
+ struct_layout.push_back (1 );
418
+ member_float_count--;
419
+ }
406
420
}
407
421
break ;
408
422
}
Original file line number Diff line number Diff line change @@ -20,6 +20,7 @@ if (enable_unittests) {
20
20
" filter_shader.frag" ,
21
21
" missing_size.frag" ,
22
22
" missing_texture.frag" ,
23
+ " vec3_uniform.frag" ,
23
24
]
24
25
25
26
group (" general_shaders" ) {
Original file line number Diff line number Diff line change
1
+ #version 320 es
2
+
3
+ // Copyright 2013 The Flutter Authors. All rights reserved.
4
+ // Use of this source code is governed by a BSD-style license that can be
5
+ // found in the LICENSE file.
6
+
7
+ precision highp float ;
8
+
9
+ uniform vec3 [4 ] color_array;
10
+
11
+ out vec4 fragColor;
12
+
13
+ void main() {
14
+ fragColor = vec4 (color_array[3 ].xyz, 1 );
15
+ }
Original file line number Diff line number Diff line change @@ -376,6 +376,24 @@ void main() async {
376
376
}
377
377
});
378
378
379
+ test ('Shader Compiler appropriately pads vec3 uniform arrays' , () async {
380
+ if (! impellerEnabled) {
381
+ print ('Skipped for Skia' );
382
+ return ;
383
+ }
384
+
385
+ final FragmentProgram program = await FragmentProgram .fromAsset ('vec3_uniform.frag.iplr' );
386
+ final FragmentShader shader = program.fragmentShader ();
387
+
388
+ // Set the last vec3 in the uniform array to green. The shader will read this
389
+ // value, and if the uniforms were padded correctly will render green.
390
+ shader.setFloat (12 , 0 );
391
+ shader.setFloat (13 , 1.0 );
392
+ shader.setFloat (14 , 0 );
393
+
394
+ await _expectShaderRendersGreen (shader);
395
+ });
396
+
379
397
test ('ImageFilter.shader can be applied to canvas operations' , () async {
380
398
if (! impellerEnabled) {
381
399
print ('Skipped for Skia' );
You can’t perform that action at this time.
0 commit comments