#define OUTPUT_TYPE FLOAT #if defined(LESS) || defined(LESSEQUAL) || defined(GREATER) || defined(GREATEREQUAL) || defined(EQUAL) || defined(NOTEQUAL) #undef OUTPUT_TYPE #define OUTPUT_TYPE int #endif 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; } FLOAT binary(FLOAT x0, FLOAT x1) { FLOAT value; #ifdef ADD value = x0 + x1; #endif #ifdef ATAN2 value = atan(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 #ifdef LESS value = FLOAT(x0 < x1); #endif #ifdef LESSEQUAL value = FLOAT(x0 <= x1); #endif #ifdef GREATER value = FLOAT(x0 > x1); #endif #ifdef GREATEREQUAL value = FLOAT(x0 >= x1); #endif #ifdef EQUAL value = FLOAT(x0 == x1); #endif #ifdef NOTEQUAL value = FLOAT(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 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(uInput0.data[s0], uInput1.data[s1])); } }