@group(0) @binding(0) var<storage, read> input_words: array<vec2<u32>>;
@group(0) @binding(1) var<storage, read_write> output_words: array<vec2<u32>>;
fn buffer_byte_swap_u64_part(value: u32) -> u32 {
return ((value & 0x000000ffu) << 24u) |
((value & 0x0000ff00u) << 8u) |
((value >> 8u) & 0x0000ff00u) |
((value >> 24u) & 0x000000ffu);
}
fn buffer_byte_swap_u64_low(value: vec2<u32>) -> u32 {
return buffer_byte_swap_u64_part(value.y);
}
fn buffer_byte_swap_u64_high(value: vec2<u32>) -> u32 {
return buffer_byte_swap_u64_part(value.x);
}
fn buffer_byte_swap_u64_compose(value: vec2<u32>) -> vec2<u32> {
let low = buffer_byte_swap_u64_low(value);
let high = buffer_byte_swap_u64_high(value);
return vec2<u32>(low, high);
}
fn buffer_byte_swap_u64_roundtrip_probe(value: vec2<u32>) -> vec2<u32> {
let once = buffer_byte_swap_u64_compose(value);
return buffer_byte_swap_u64_compose(once);
}
@compute @workgroup_size(64, 1, 1)
fn buffer_byte_swap_u64(@builtin(global_invocation_id) id: vec3<u32>) {
let value = input_words[id.x];
let swapped = buffer_byte_swap_u64_compose(value);
let _probe = buffer_byte_swap_u64_roundtrip_probe(value);
output_words[id.x] = swapped;
}