66 lines
2.0 KiB
Plaintext
66 lines
2.0 KiB
Plaintext
layout(set=0, binding=0) writeonly buffer sourceBuffer{
|
|
FLOAT data[];
|
|
} uOutput;
|
|
|
|
layout(set=0, binding=1) readonly buffer s0{
|
|
FLOAT data[];
|
|
} uInput;
|
|
|
|
layout(set=0, binding=2) readonly buffer s1{
|
|
int data[];
|
|
} uSrcOffset;
|
|
|
|
layout(set=0, binding=3) readonly buffer s2{
|
|
int data[];
|
|
} uDstOffset;
|
|
|
|
layout(set=0, binding=4) uniform constBuffer{
|
|
ivec4 stride;
|
|
ivec4 size;
|
|
ivec4 extent;
|
|
ivec4 step;
|
|
ivec4 iter;
|
|
} uConstant;
|
|
|
|
layout (local_size_x = 256, local_size_y = 1, local_size_z = 1) in;
|
|
|
|
void main()
|
|
{
|
|
ivec3 posTmp = ivec3(gl_GlobalInvocationID);
|
|
if (posTmp.x < uConstant.step.w)
|
|
{
|
|
ivec3 pos;
|
|
int regionInsideIndex = posTmp.x % uConstant.size.w;
|
|
int regionOutsideIndex = posTmp.x / uConstant.size.w;
|
|
pos.x = regionInsideIndex / (uConstant.size.y * uConstant.size.z);
|
|
int subIndex = regionInsideIndex % (uConstant.size.y * uConstant.size.z);
|
|
pos.z = subIndex % uConstant.size.z;
|
|
pos.y = subIndex / uConstant.size.z;
|
|
int srcBasicOffset, dstBasicOffset;
|
|
if (uConstant.iter.y > 0) {
|
|
srcBasicOffset = uConstant.step.y * int(uSrcOffset.data[regionOutsideIndex]);
|
|
} else {
|
|
srcBasicOffset = uConstant.step.y * regionOutsideIndex;;
|
|
}
|
|
if (uConstant.iter.x > 0) {
|
|
dstBasicOffset = uConstant.step.x * int(uDstOffset.data[regionOutsideIndex]);
|
|
} else {
|
|
dstBasicOffset = uConstant.step.x * regionOutsideIndex;;
|
|
}
|
|
int srcOffset = srcBasicOffset
|
|
+ uConstant.stride.w
|
|
+ uConstant.stride.z * pos.z
|
|
+ uConstant.stride.y * pos.y
|
|
+ uConstant.stride.x * pos.x
|
|
;
|
|
|
|
int dstOffset = dstBasicOffset
|
|
+ uConstant.extent.w
|
|
+ pos.x * uConstant.extent.x
|
|
+ pos.y * uConstant.extent.y
|
|
+ pos.z * uConstant.extent.z
|
|
;
|
|
uOutput.data[dstOffset] = uInput.data[srcOffset];
|
|
}
|
|
}
|