| layout(local_size_x = 128) in; | |
| layout(std430) buffer; | |
| struct SomeStruct { | |
| vec2 vf; | |
| uint i; | |
| }; | |
| layout(binding = 0) writeonly buffer Output { | |
| vec4 elements[]; | |
| } | |
| output_data; | |
| layout(binding = 1) readonly buffer Input0 { | |
| int some_int; | |
| ivec2 fixed_array[3]; | |
| vec4 elements[]; | |
| } | |
| input_data0; | |
| layout(binding = 2) readonly buffer Input1 { | |
| SomeStruct some_struct; | |
| uvec2 fixed_array[4]; | |
| vec4 elements[]; | |
| } | |
| input_data1; | |
| uniform Info { | |
| uint count; | |
| } | |
| info; | |
| void main() { | |
| uint ident = gl_GlobalInvocationID.x; | |
| // TODO(dnfield): https://github.com/flutter/flutter/issues/112683 | |
| // We should be able to use length here instead of an extra arrgument. | |
| if (ident >= info.count) { | |
| return; | |
| } | |
| output_data.elements[ident] = | |
| input_data0.elements[ident] * input_data1.elements[ident]; | |
| output_data.elements[ident].x += | |
| input_data0.fixed_array[1].x + input_data1.some_struct.i; | |
| output_data.elements[ident].y += | |
| input_data1.fixed_array[0].y + input_data1.some_struct.vf.x; | |
| output_data.elements[ident].z += | |
| input_data0.some_int + input_data1.some_struct.vf.y; | |
| } |