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

103 lines
2.2 KiB
Plaintext

#define OUTPUT_TYPE FLOAT4
#if defined(LESS) || defined(LESSEQUAL) || defined(GREATER) || defined(GREATEREQUAL) || defined(EQUAL) || defined(NOTEQUAL)
#undef OUTPUT_TYPE
#define OUTPUT_TYPE ivec4
#endif
layout(set=0, binding=0) writeonly buffer destBuffer{
OUTPUT_TYPE data[];
} uOutput;
layout(set=0, binding=1) readonly buffer sourceBuffer0{
FLOAT4 data[];
} uInput0;
layout(set=0, binding=2) readonly buffer sourceBuffer1{
FLOAT4 data[];
} uInput1;
layout(set=0, binding=3) uniform constBuffer{
ivec4 stride00;//WHC, LIMIT
int activationType;
} uConstant;
layout(local_size_x = 256, local_size_y = 1, local_size_z = 1) in;
void main()
{
ivec3 posTmp = ivec3(gl_GlobalInvocationID);
ivec3 inSize = uConstant.stride00.xyz;
if(posTmp.x < uConstant.stride00.w)
{
FLOAT4 x0 = uInput0.data[uConstant.stride00.x * posTmp.x];
if (uConstant.stride00.x == 0) {
x0 = FLOAT4(x0.r);
}
FLOAT4 x1 = uInput1.data[uConstant.stride00.y * posTmp.x];
if (uConstant.stride00.y == 0) {
x1 = FLOAT4(x1.r);
}
FLOAT4 value = x0;
#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 ATAN2
value = atan(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
#ifdef LESS
value = FLOAT4(lessThan(x0, x1));
#endif
#ifdef LESSEQUAL
value = FLOAT4(lessThanEqual(x0, x1));
#endif
#ifdef GREATER
value = FLOAT4(greaterThan(x0, x1));
#endif
#ifdef GREATEREQUAL
value = FLOAT4(greaterThanEqual(x0, x1));
#endif
#ifdef EQUAL
value = FLOAT4(equal(x0, x1));
#endif
#ifdef NOTEQUAL
value = FLOAT4(notEqual(x0, x1));
#endif
#ifdef VMOD
value = mod(x0, x1);
#endif
#ifdef FLOORMOD
value = x0 - x1 * floor(x0/x1);
#endif
#ifdef FLOORDIV
value = floor(x0/x1);
#endif
if(uConstant.activationType == 1) {
value = max(value, FLOAT4(0.0));
}
uOutput.data[posTmp.x] = OUTPUT_TYPE(value);
}
}