#version 460 #extension GL_EXT_shader_8bit_storage : require layout (constant_id = 0) const int CHANNELS = 3; layout (local_size_x = 32, local_size_y = 32) in; layout (push_constant) uniform Constants { uint x; uint y; } PC; layout (set = 1, binding = 0, rgba32f) uniform image2D dst; layout (set = 1, binding = 1) buffer input_array { uint8_t src[]; }; void main() { uint x = gl_GlobalInvocationID.x; uint y = gl_GlobalInvocationID.y; if(x > PC.x || y > PC.y) { return; } if(CHANNELS == 1) { uint index = x + y * PC.x; vec4 col = vec4(vec3(uint(src[index]) / 255.0), 1.0); imageStore(dst, ivec2(x, y), col); } else if(CHANNELS == 2) { uint index = (x + y * PC.x) * 2; float f = uint(src[index]) / 255.0; float a = uint(src[index+1]) / 255.0; vec4 col = vec4(f, f, f, a); imageStore(dst, ivec2(x, y), col); } else if(CHANNELS == 3) { uint index = (x + y * PC.x) * 3; vec4 col = vec4(uint(src[index]) / 255.0, uint(src[index+1]) / 255.0, uint(src[index+2]) / 255.0, 1.0); imageStore(dst, ivec2(x, y), col); } }