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

85 lines
1.8 KiB
Plaintext

#version 440 core
#ifdef C4
#define FLOAT vec4
#else
#define FLOAT float
#endif
#define OUTPUT_TYPE float
#define FLOAT4 vec4
layout(std430) buffer;
layout(set=0, binding=0) writeonly buffer sourceBuffer{
OUTPUT_TYPE data[];
} uOutput;
layout(set=0, binding=1) readonly buffer destBuffer{
FLOAT data[];
} uInput0;
layout(set=0, binding=2) readonly buffer destBuffer0{
FLOAT data[];
} uInput1;
layout(set=0, binding=3) uniform constBuffer{
ivec4 srcview0;
ivec4 srcview1;
ivec4 dstview;
ivec4 size;
} uConstant;
layout (local_size_x = 256, local_size_y = 1, local_size_z = 1) in;
int computeVec4dot(ivec4 a, ivec4 b) {
return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w;
}
FLOAT4 binary(FLOAT4 x0, FLOAT4 x1) {
FLOAT4 value;
#ifdef ADD
value = x0 + x1;
#endif
#ifdef SUB
value = x0 - x1;
#endif
#ifdef MUL
value = x0 * x1;
#endif
#ifdef DIV
value = x0 / x1;
#endif
#ifdef POW
value = pow(x0, x1);
#endif
#ifdef VMAX
value = max(x0, x1);
#endif
#ifdef VMIN
value = min(x0, x1);
#endif
#ifdef SQUDIFF
value = (x0 - x1) * (x0 - x1);
#endif
return value;
}
void main()
{
ivec3 posTmp = ivec3(gl_GlobalInvocationID);
if (posTmp.x < uConstant.size.w)
{
ivec4 pos;
pos.x = posTmp.x / (uConstant.size.y * uConstant.size.z);
int subIndex = posTmp.x % (uConstant.size.y * uConstant.size.z);
pos.z = subIndex % uConstant.size.z;
pos.y = subIndex / uConstant.size.z;
pos.w = 1;
int s0 = computeVec4dot(uConstant.srcview0, pos);
int s1 = computeVec4dot(uConstant.srcview1, pos);
int d = computeVec4dot(uConstant.dstview, pos);
uOutput.data[d] = OUTPUT_TYPE(binary(FLOAT4(uInput0.data[s0]), FLOAT4(uInput1.data[s1])).x);
}
}