| #version 450 | |
| #extension GL_EXT_buffer_reference : require | |
| layout(local_size_x = 1) in; | |
| layout(constant_id = 0) const uint c_arg_count = 0; | |
| layout(constant_id = 1) const bool c_arg_indirect = false; | |
| layout(std430, buffer_reference, buffer_reference_align = 4) | |
| readonly buffer predicate_t { | |
| uint data; | |
| }; | |
| layout(std430, buffer_reference, buffer_reference_align = 4) | |
| readonly buffer src_args_t { | |
| uint data[]; | |
| }; | |
| layout(std430, buffer_reference, buffer_reference_align = 4) | |
| writeonly buffer dst_args_t { | |
| uint data[]; | |
| }; | |
| layout(push_constant) | |
| uniform u_info_t { | |
| predicate_t predicate; | |
| src_args_t src_args; | |
| dst_args_t dst_args; | |
| uint cmd_args[5]; | |
| }; | |
| void main() { | |
| bool do_exec = predicate.data != 0; | |
| for (uint i = 0; i < c_arg_count; i++) { | |
| uint arg = c_arg_indirect ? src_args.data[i] : cmd_args[i]; | |
| dst_args.data[i] = do_exec ? arg : 0u; | |
| } | |
| } |