layout(set=0, binding=0) writeonly buffer destBuffer{ FLOAT4 data[]; } uOutput; layout(set=0, binding=1) readonly buffer sourceBuffer0{ FLOAT4 data[]; } uInput; layout(set=0, binding=2) uniform constBuffer { ivec4 inputSize; ivec4 outputSize; ivec2 pad; ivec2 kernelSize; ivec2 stride; ivec2 count; } uConstant; layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in; void main() { ivec3 pos = ivec3(gl_GlobalInvocationID); ivec3 outputSize = uConstant.outputSize.xyz; ivec2 spos = pos.xy*uConstant.stride-uConstant.pad; if (all(lessThan(pos, outputSize))) { ivec2 inputSizeXY = uConstant.inputSize.xy; FLOAT4 color = FLOAT4(0.0); ivec2 sfxy = max(ivec2(0), -spos); ivec2 efxy = min(uConstant.kernelSize, inputSizeXY-spos); ivec2 size = efxy-sfxy; FLOAT4 frac = FLOAT4(1.0/FLOAT(size.x)/FLOAT(size.y)); if (uConstant.count.x == 1) { frac = FLOAT4(1.0/FLOAT(uConstant.kernelSize.x)/FLOAT(uConstant.kernelSize.y)); } for (int fy=sfxy.y; fy