#version 450 core layout(std430) buffer; #ifdef INT layout(set=0, binding=0) writeonly uniform iimage2D uOutput; layout(set=0, binding=1) readonly buffer sourceBuffer{ int data[]; } uInBuffer; #else layout(set=0, binding=0) writeonly uniform image2D uOutput; layout(set=0, binding=1) readonly buffer sourceBuffer{ float data[]; } uInBuffer; #endif layout(set=0, binding=2) uniform constBuffer{ ivec4 size; // w, h, c, n ivec4 stride; } uConstant; layout(set=0, binding=3) uniform offsetBuffer { ivec4 offset; // Offset x, y, 0, 0 ivec4 size;//w, h, 0, w*h } uOffset; layout (local_size_x = 256, local_size_y = 1, local_size_z = 1) in; void main() { int posX = ivec3(gl_GlobalInvocationID).x; if (posX < uOffset.size.w) { ivec2 pos; pos.x = posX % uOffset.size.x; pos.y = posX / uOffset.size.x; ivec2 spos = pos + uOffset.offset.xy; int n = spos.y / uConstant.size.y; int h = spos.y % uConstant.size.y; int c = spos.x / uConstant.size.x; int w = spos.x % uConstant.size.x; int basicOffset = 0 + n * uConstant.stride.w + 4 * c * uConstant.stride.z + h * uConstant.stride.y + w * uConstant.stride.x; #ifdef INT ivec4 color = ivec4(0); color.r = uInBuffer.data[basicOffset+0]; int imgHW = uConstant.stride.z; if (4 * c + 1 < uConstant.size.z) { color.g = uInBuffer.data[basicOffset+1*imgHW]; } if (4 * c + 2 < uConstant.size.z) { color.b = uInBuffer.data[basicOffset+2*imgHW]; } if (4 * c + 3 < uConstant.size.z) { color.a = uInBuffer.data[basicOffset+3*imgHW]; } #else vec4 color = vec4(0); color.r = uInBuffer.data[basicOffset+0]; int imgHW = uConstant.stride.z; if (4 * c + 1 < uConstant.size.z) { color.g = uInBuffer.data[basicOffset+1*imgHW]; } if (4 * c + 2 < uConstant.size.z) { color.b = uInBuffer.data[basicOffset+2*imgHW]; } if (4 * c + 3 < uConstant.size.z) { color.a = uInBuffer.data[basicOffset+3*imgHW]; } #endif imageStore(uOutput, pos, color); } }