1#version 450 core 2// clang-format off 3#define PRECISION ${PRECISION} 4#define FORMAT ${FORMAT} 5 6#define OP(X) ${OPERATOR} 7// clang-format on 8 9layout(std430) buffer; 10 11// clang-format off 12$if not INPLACE: 13 layout(set = 0, binding = 0, FORMAT) uniform PRECISION restrict writeonly image3D uOutput; 14 layout(set = 0, binding = 1) uniform PRECISION sampler3D uInput; 15 layout(set = 0, binding = 2) uniform PRECISION restrict Block { 16 ivec4 extents; 17 } 18 uBlock; 19$else: 20 layout(set = 0, binding = 0, FORMAT) uniform PRECISION restrict image3D uInput; 21 layout(set = 0, binding = 1) uniform PRECISION restrict Block { 22 ivec4 extents; 23 } 24 uBlock; 25// clang-format on 26 27layout(local_size_x_id = 0, local_size_y_id = 1, local_size_z_id = 2) in; 28 29void main() { 30 const ivec3 pos = ivec3(gl_GlobalInvocationID); 31 if (any(greaterThanEqual(pos, uBlock.extents.xyz))) { 32 return; 33 } 34 35 // clang-format off 36 $if not INPLACE: 37 const vec4 v = texelFetch(uInput, pos, 0); 38 imageStore(uOutput, pos, OP(v)); 39 $else: 40 vec4 v = imageLoad(uInput, pos); 41 imageStore(uInput, pos, OP(v)); 42 // clang-format on 43} 44