Files
2026-07-13 13:33:03 +08:00

55 lines
1.4 KiB
Plaintext

#version 440 core
layout(std430) buffer;
layout(set=0, binding=0) writeonly buffer destBuffer{
float data[];
} uDx;
layout(set=0, binding=1) writeonly buffer destBuffer1{
float data[];
} uDy;
layout(set=0, binding=2) readonly buffer sourceBuffer0{
float data[];
} uInput;
layout(set=0, binding=3) uniform constBuffer {
ivec4 size;
} uConstant;
layout (local_size_x = 256, local_size_y = 1, local_size_z = 1) in;
void main()
{
int pos = int(gl_GlobalInvocationID.x);
// input output grid layout is NC4HW4
ivec4 size = uConstant.size;
int total = size.x * size.y * size.z * size.w;
if(pos < total)
{
// get nchw num of output
int x = pos % size.x;
int tmp = pos / size.x;
int y = tmp % size.y;
tmp = tmp / size.y;
int z = tmp % size.z;
int n = tmp / size.z;
int outPos = n * size.x * size.y * size.z + x * size.z + y * size.x * size.z + z;
int xDPos = n * size.x * size.y * size.z + (x+1) * size.z + y * size.x * size.z + z;
int yDPos = n * size.x * size.y * size.z + x * size.z + (y+1) * size.x * size.z + z;
if (x < size.x - 1) {
uDx.data[outPos] = uInput.data[xDPos] - uInput.data[outPos];
} else {
uDx.data[outPos] = 0.0;
}
if (y < size.y - 1) {
uDy.data[outPos] = uInput.data[yDPos] - uInput.data[outPos];
} else {
uDy.data[outPos] = 0.0;
}
}
}