]> git.tdb.fi Git - libs/gl.git/commitdiff
Store required capabilities for SPIR-V builtin functions
authorMikko Rasa <tdb@tdb.fi>
Wed, 28 Apr 2021 11:04:49 +0000 (14:04 +0300)
committerMikko Rasa <tdb@tdb.fi>
Wed, 28 Apr 2021 11:04:49 +0000 (14:04 +0300)
source/glsl/spirv.cpp
source/glsl/spirv.h
source/glsl/spirvconstants.h

index 036446f5bab630d83613f7c97e774c3b1dd7bb30..33da0d5ca86c830bbb8f2248f4ee774b8ecc5e0d 100644 (file)
@@ -11,121 +11,121 @@ namespace SL {
 
 const SpirVGenerator::BuiltinFunctionInfo SpirVGenerator::builtin_functions[] =
 {
-       { "radians", "f", "GLSL.std.450", GLSL450_RADIANS, { 1 }, 0 },
-       { "degrees", "f", "GLSL.std.450", GLSL450_DEGREES, { 1 }, 0 },
-       { "sin", "f", "GLSL.std.450", GLSL450_SIN, { 1 }, 0 },
-       { "cos", "f", "GLSL.std.450", GLSL450_COS, { 1 }, 0 },
-       { "tan", "f", "GLSL.std.450", GLSL450_TAN, { 1 }, 0 },
-       { "asin", "f", "GLSL.std.450", GLSL450_ASIN, { 1 }, 0 },
-       { "acos", "f", "GLSL.std.450", GLSL450_ACOS, { 1 }, 0 },
-       { "atan", "f", "GLSL.std.450", GLSL450_ATAN, { 1 }, 0 },
-       { "atan", "ff", "GLSL.std.450", GLSL450_ATAN2, { 1, 2 }, 0 },
-       { "sinh", "f", "GLSL.std.450", GLSL450_SINH, { 1 }, 0 },
-       { "cosh", "f", "GLSL.std.450", GLSL450_COSH, { 1 }, 0 },
-       { "tanh", "f", "GLSL.std.450", GLSL450_TANH, { 1 }, 0 },
-       { "asinh", "f", "GLSL.std.450", GLSL450_ASINH, { 1 }, 0 },
-       { "acosh", "f", "GLSL.std.450", GLSL450_ACOSH, { 1 }, 0 },
-       { "atanh", "f", "GLSL.std.450", GLSL450_ATANH, { 1 }, 0 },
-       { "pow", "ff", "GLSL.std.450", GLSL450_POW, { 1, 2 }, 0 },
-       { "exp", "f", "GLSL.std.450", GLSL450_EXP, { 1 }, 0 },
-       { "log", "f", "GLSL.std.450", GLSL450_LOG, { 1 }, 0 },
-       { "exp2", "f", "GLSL.std.450", GLSL450_EXP2, { 1 }, 0 },
-       { "log2", "f", "GLSL.std.450", GLSL450_LOG2, { 1 }, 0 },
-       { "sqrt", "f", "GLSL.std.450", GLSL450_SQRT, { 1 }, 0 },
-       { "inversesqrt", "f", "GLSL.std.450", GLSL450_INVERSE_SQRT, { 1 }, 0 },
-       { "abs", "f", "GLSL.std.450", GLSL450_F_ABS, { 1 }, 0 },
-       { "abs", "i", "GLSL.std.450", GLSL450_S_ABS, { 1 }, 0 },
-       { "sign", "f", "GLSL.std.450", GLSL450_F_SIGN, { 1 }, 0 },
-       { "sign", "i", "GLSL.std.450", GLSL450_S_SIGN, { 1 }, 0 },
-       { "floor", "f", "GLSL.std.450", GLSL450_FLOOR, { 1 }, 0 },
-       { "trunc", "f", "GLSL.std.450", GLSL450_TRUNC, { 1 }, 0 },
-       { "round", "f", "GLSL.std.450", GLSL450_ROUND, { 1 }, 0 },
-       { "roundEven", "f", "GLSL.std.450", GLSL450_ROUND_EVEN, { 1 }, 0 },
-       { "ceil", "f", "GLSL.std.450", GLSL450_CEIL, { 1 }, 0 },
-       { "fract", "f", "GLSL.std.450", GLSL450_FRACT, { 1 }, 0 },
-       { "mod", "f", "", OP_F_MOD, { 1, 2 }, 0 },
-       { "min", "ff", "GLSL.std.450", GLSL450_F_MIN, { 1, 2 }, 0 },
-       { "min", "ii", "GLSL.std.450", GLSL450_S_MIN, { 1, 2 }, 0 },
-       { "min", "uu", "GLSL.std.450", GLSL450_U_MIN, { 1, 2 }, 0 },
-       { "max", "ff", "GLSL.std.450", GLSL450_F_MAX, { 1, 2 }, 0 },
-       { "max", "ii", "GLSL.std.450", GLSL450_S_MAX, { 1, 2 }, 0 },
-       { "max", "uu", "GLSL.std.450", GLSL450_U_MAX, { 1, 2 }, 0 },
-       { "clamp", "fff", "GLSL.std.450", GLSL450_F_CLAMP, { 1, 2, 3 }, 0 },
-       { "clamp", "iii", "GLSL.std.450", GLSL450_S_CLAMP, { 1, 2, 3 }, 0 },
-       { "clamp", "uuu", "GLSL.std.450", GLSL450_U_CLAMP, { 1, 2, 3 }, 0 },
-       { "mix", "fff", "GLSL.std.450", GLSL450_F_MIX, { 1, 2, 3 }, 0 },
-       { "mix", "ffb", "", OP_SELECT, { 3, 2, 1 }, 0 },
-       { "mix", "iib", "", OP_SELECT, { 3, 2, 1 }, 0 },
-       { "mix", "uub", "", OP_SELECT, { 3, 2, 1 }, 0 },
-       { "step", "ff", "GLSL.std.450", GLSL450_F_STEP, { 1, 2 }, 0 },
-       { "smoothstep", "fff", "GLSL.std.450", GLSL450_F_SMOOTH_STEP, { 1, 2, 3 }, 0 },
-       { "isnan", "f", "", OP_IS_NAN, { 1 }, 0 },
-       { "isinf", "f", "", OP_IS_INF, { 1 }, 0 },
-       { "fma", "fff", "GLSL.std.450", GLSL450_F_FMA, { 1, 2, 3 }, 0 },
-       { "length", "f", "GLSL.std.450", GLSL450_LENGTH, { 1 }, 0 },
-       { "distance", "ff", "GLSL.std.450", GLSL450_DISTANCE, { 1, 2 }, 0 },
-       { "dot", "ff", "", OP_DOT, { 1, 2 }, 0 },
-       { "cross", "ff", "GLSL.std.450", GLSL450_CROSS, { 1, 2 }, 0 },
-       { "normalize", "f", "GLSL.std.450", GLSL450_NORMALIZE, { 1 }, 0 },
-       { "faceforward", "fff", "GLSL.std.450", GLSL450_FACE_FORWARD, { 1, 2, 3 }, 0 },
-       { "reflect", "ff", "GLSL.std.450", GLSL450_REFLECT, { 1, 2 }, 0 },
-       { "refract", "fff", "GLSL.std.450", GLSL450_REFRACT, { 1, 2, 3 }, 0 },
-       { "matrixCompMult", "ff", "", 0, { 0 }, &SpirVGenerator::visit_builtin_matrix_comp_mult },
-       { "outerProduct", "ff", "", OP_OUTER_PRODUCT, { 1, 2 }, 0 },
-       { "transpose", "f", "", OP_TRANSPOSE, { 1 }, 0 },
-       { "determinant", "f", "GLSL.std.450", GLSL450_DETERMINANT, { 1 }, 0 },
-       { "inverse", "f", "GLSL.std.450", GLSL450_MATRIX_INVERSE, { 1 }, 0 },
-       { "lessThan", "ff", "", OP_F_ORD_LESS_THAN, { 1, 2 }, 0 },
-       { "lessThan", "ii", "", OP_S_LESS_THAN, { 1, 2 }, 0 },
-       { "lessThan", "uu", "", OP_U_LESS_THAN, { 1, 2 }, 0 },
-       { "lessThanEqual", "ff", "", OP_F_ORD_LESS_THAN_EQUAL, { 1, 2 }, 0 },
-       { "lessThanEqual", "ii", "", OP_S_LESS_THAN_EQUAL, { 1, 2 }, 0 },
-       { "lessThanEqual", "uu", "", OP_U_LESS_THAN_EQUAL, { 1, 2 }, 0 },
-       { "greaterThan", "ff", "", OP_F_ORD_GREATER_THAN, { 1, 2 }, 0 },
-       { "greaterThan", "ii", "", OP_S_GREATER_THAN, { 1, 2 }, 0 },
-       { "greaterThan", "uu", "", OP_U_GREATER_THAN, { 1, 2 }, 0 },
-       { "greaterThanEqual", "ff", "", OP_F_ORD_GREATER_THAN_EQUAL, { 1, 2 }, 0 },
-       { "greaterThanEqual", "ii", "", OP_S_GREATER_THAN_EQUAL, { 1, 2 }, 0 },
-       { "greaterThanEqual", "uu", "", OP_U_GREATER_THAN_EQUAL, { 1, 2 }, 0 },
-       { "equal", "ff", "", OP_F_ORD_EQUAL, { 1, 2 }, 0 },
-       { "equal", "ii", "", OP_I_EQUAL, { 1, 2 }, 0 },
-       { "equal", "uu", "", OP_I_EQUAL, { 1, 2 }, 0 },
-       { "notEqual", "ff", "", OP_F_ORD_NOT_EQUAL, { 1, 2 }, 0 },
-       { "notEqual", "ii", "", OP_I_NOT_EQUAL, { 1, 2 }, 0 },
-       { "notEqual", "uu", "", OP_I_NOT_EQUAL, { 1, 2 }, 0 },
-       { "any", "b", "", OP_ANY, { 1 }, 0 },
-       { "all", "b", "", OP_ALL, { 1 }, 0 },
-       { "not", "b", "", OP_LOGICAL_NOT, { 1 }, 0 },
-       { "bitfieldExtract", "iii", "", OP_BIT_FIELD_S_EXTRACT, { 1, 2, 3 }, 0 },
-       { "bitfieldExtract", "uii", "", OP_BIT_FIELD_U_EXTRACT, { 1, 2, 3 }, 0 },
-       { "bitfieldInsert", "iiii", "", OP_BIT_FIELD_INSERT, { 1, 2, 3, 4 }, 0 },
-       { "bitfieldInsert", "uuii", "", OP_BIT_FIELD_INSERT, { 1, 2, 3, 4 }, 0 },
-       { "bitfieldReverse", "i", "", OP_BIT_REVERSE, { 1 }, 0 },
-       { "bitfieldReverse", "u", "", OP_BIT_REVERSE, { 1 }, 0 },
-       { "bitCount", "i", "", OP_BIT_COUNT, { 1 }, 0 },
-       { "findLSB", "i", "GLSL.std.450", GLSL450_FIND_I_LSB, { 1 }, 0 },
-       { "findLSB", "u", "GLSL.std.450", GLSL450_FIND_I_LSB, { 1 }, 0 },
-       { "findMSB", "i", "GLSL.std.450", GLSL450_FIND_S_MSB, { 1 }, 0 },
-       { "findMSB", "u", "GLSL.std.450", GLSL450_FIND_U_MSB, { 1 }, 0 },
-       { "textureSize", "", "", OP_IMAGE_QUERY_SIZE_LOD, { 1, 2 }, 0 },
-       { "texture", "", "", 0, { }, &SpirVGenerator::visit_builtin_texture },
-       { "textureLod", "", "", 0, { }, &SpirVGenerator::visit_builtin_texture },
-       { "texelFetch", "", "", 0, { }, &SpirVGenerator::visit_builtin_texel_fetch },
-       { "EmitVertex", "", "", OP_EMIT_VERTEX, { }, 0 },
-       { "EndPrimitive", "", "", OP_END_PRIMITIVE, { }, 0 },
-       { "dFdx", "f", "", OP_DP_DX, { 1 }, 0 },
-       { "dFdy", "f", "", OP_DP_DY, { 1 }, 0 },
-       { "dFdxFine", "f", "", OP_DP_DX_FINE, { 1 }, 0 },
-       { "dFdyFine", "f", "", OP_DP_DY_FINE, { 1 }, 0 },
-       { "dFdxCoarse", "f", "", OP_DP_DX_COARSE, { 1 }, 0 },
-       { "dFdyCoarse", "f", "", OP_DP_DY_COARSE, { 1 }, 0 },
-       { "fwidth", "f", "", OP_FWIDTH, { 1 }, 0 },
-       { "fwidthFine", "f", "", OP_FWIDTH_FINE, { 1 }, 0 },
-       { "fwidthCoarse", "f", "", OP_FWIDTH_COARSE, { 1 }, 0 },
-       { "interpolateAtCentroid", "", "", 0, { }, &SpirVGenerator::visit_builtin_interpolate },
-       { "interpolateAtSample", "", "", 0, { }, &SpirVGenerator::visit_builtin_interpolate },
-       { "interpolateAtOffset", "", "", 0, { }, &SpirVGenerator::visit_builtin_interpolate },
-       { "", "", "", 0, { }, 0 }
+       { "radians", "f", "GLSL.std.450", GLSL450_RADIANS, { 1 }, 0, 0 },
+       { "degrees", "f", "GLSL.std.450", GLSL450_DEGREES, { 1 }, 0, 0 },
+       { "sin", "f", "GLSL.std.450", GLSL450_SIN, { 1 }, 0, 0 },
+       { "cos", "f", "GLSL.std.450", GLSL450_COS, { 1 }, 0, 0 },
+       { "tan", "f", "GLSL.std.450", GLSL450_TAN, { 1 }, 0, 0 },
+       { "asin", "f", "GLSL.std.450", GLSL450_ASIN, { 1 }, 0, 0 },
+       { "acos", "f", "GLSL.std.450", GLSL450_ACOS, { 1 }, 0, 0 },
+       { "atan", "f", "GLSL.std.450", GLSL450_ATAN, { 1 }, 0, 0 },
+       { "atan", "ff", "GLSL.std.450", GLSL450_ATAN2, { 1, 2 }, 0, 0 },
+       { "sinh", "f", "GLSL.std.450", GLSL450_SINH, { 1 }, 0, 0 },
+       { "cosh", "f", "GLSL.std.450", GLSL450_COSH, { 1 }, 0, 0 },
+       { "tanh", "f", "GLSL.std.450", GLSL450_TANH, { 1 }, 0, 0 },
+       { "asinh", "f", "GLSL.std.450", GLSL450_ASINH, { 1 }, 0, 0 },
+       { "acosh", "f", "GLSL.std.450", GLSL450_ACOSH, { 1 }, 0, 0 },
+       { "atanh", "f", "GLSL.std.450", GLSL450_ATANH, { 1 }, 0, 0 },
+       { "pow", "ff", "GLSL.std.450", GLSL450_POW, { 1, 2 }, 0, 0 },
+       { "exp", "f", "GLSL.std.450", GLSL450_EXP, { 1 }, 0, 0 },
+       { "log", "f", "GLSL.std.450", GLSL450_LOG, { 1 }, 0, 0 },
+       { "exp2", "f", "GLSL.std.450", GLSL450_EXP2, { 1 }, 0, 0 },
+       { "log2", "f", "GLSL.std.450", GLSL450_LOG2, { 1 }, 0, 0 },
+       { "sqrt", "f", "GLSL.std.450", GLSL450_SQRT, { 1 }, 0, 0 },
+       { "inversesqrt", "f", "GLSL.std.450", GLSL450_INVERSE_SQRT, { 1 }, 0, 0 },
+       { "abs", "f", "GLSL.std.450", GLSL450_F_ABS, { 1 }, 0, 0 },
+       { "abs", "i", "GLSL.std.450", GLSL450_S_ABS, { 1 }, 0, 0 },
+       { "sign", "f", "GLSL.std.450", GLSL450_F_SIGN, { 1 }, 0, 0 },
+       { "sign", "i", "GLSL.std.450", GLSL450_S_SIGN, { 1 }, 0, 0 },
+       { "floor", "f", "GLSL.std.450", GLSL450_FLOOR, { 1 }, 0, 0 },
+       { "trunc", "f", "GLSL.std.450", GLSL450_TRUNC, { 1 }, 0, 0 },
+       { "round", "f", "GLSL.std.450", GLSL450_ROUND, { 1 }, 0, 0 },
+       { "roundEven", "f", "GLSL.std.450", GLSL450_ROUND_EVEN, { 1 }, 0, 0 },
+       { "ceil", "f", "GLSL.std.450", GLSL450_CEIL, { 1 }, 0, 0 },
+       { "fract", "f", "GLSL.std.450", GLSL450_FRACT, { 1 }, 0, 0 },
+       { "mod", "f", "", OP_F_MOD, { 1, 2 }, 0, 0 },
+       { "min", "ff", "GLSL.std.450", GLSL450_F_MIN, { 1, 2 }, 0, 0 },
+       { "min", "ii", "GLSL.std.450", GLSL450_S_MIN, { 1, 2 }, 0, 0 },
+       { "min", "uu", "GLSL.std.450", GLSL450_U_MIN, { 1, 2 }, 0, 0 },
+       { "max", "ff", "GLSL.std.450", GLSL450_F_MAX, { 1, 2 }, 0, 0 },
+       { "max", "ii", "GLSL.std.450", GLSL450_S_MAX, { 1, 2 }, 0, 0 },
+       { "max", "uu", "GLSL.std.450", GLSL450_U_MAX, { 1, 2 }, 0, 0 },
+       { "clamp", "fff", "GLSL.std.450", GLSL450_F_CLAMP, { 1, 2, 3 }, 0, 0 },
+       { "clamp", "iii", "GLSL.std.450", GLSL450_S_CLAMP, { 1, 2, 3 }, 0, 0 },
+       { "clamp", "uuu", "GLSL.std.450", GLSL450_U_CLAMP, { 1, 2, 3 }, 0, 0 },
+       { "mix", "fff", "GLSL.std.450", GLSL450_F_MIX, { 1, 2, 3 }, 0, 0 },
+       { "mix", "ffb", "", OP_SELECT, { 3, 2, 1 }, 0, 0 },
+       { "mix", "iib", "", OP_SELECT, { 3, 2, 1 }, 0, 0 },
+       { "mix", "uub", "", OP_SELECT, { 3, 2, 1 }, 0, 0 },
+       { "step", "ff", "GLSL.std.450", GLSL450_F_STEP, { 1, 2 }, 0, 0 },
+       { "smoothstep", "fff", "GLSL.std.450", GLSL450_F_SMOOTH_STEP, { 1, 2, 3 }, 0, 0 },
+       { "isnan", "f", "", OP_IS_NAN, { 1 }, 0, 0 },
+       { "isinf", "f", "", OP_IS_INF, { 1 }, 0, 0 },
+       { "fma", "fff", "GLSL.std.450", GLSL450_F_FMA, { 1, 2, 3 }, 0, 0 },
+       { "length", "f", "GLSL.std.450", GLSL450_LENGTH, { 1 }, 0, 0 },
+       { "distance", "ff", "GLSL.std.450", GLSL450_DISTANCE, { 1, 2 }, 0, 0 },
+       { "dot", "ff", "", OP_DOT, { 1, 2 }, 0, 0 },
+       { "cross", "ff", "GLSL.std.450", GLSL450_CROSS, { 1, 2 }, 0, 0 },
+       { "normalize", "f", "GLSL.std.450", GLSL450_NORMALIZE, { 1 }, 0, 0 },
+       { "faceforward", "fff", "GLSL.std.450", GLSL450_FACE_FORWARD, { 1, 2, 3 }, 0, 0 },
+       { "reflect", "ff", "GLSL.std.450", GLSL450_REFLECT, { 1, 2 }, 0, 0 },
+       { "refract", "fff", "GLSL.std.450", GLSL450_REFRACT, { 1, 2, 3 }, 0, 0 },
+       { "matrixCompMult", "ff", "", 0, { 0 }, 0, &SpirVGenerator::visit_builtin_matrix_comp_mult },
+       { "outerProduct", "ff", "", OP_OUTER_PRODUCT, { 1, 2 }, 0, 0 },
+       { "transpose", "f", "", OP_TRANSPOSE, { 1 }, 0, 0 },
+       { "determinant", "f", "GLSL.std.450", GLSL450_DETERMINANT, { 1 }, 0, 0 },
+       { "inverse", "f", "GLSL.std.450", GLSL450_MATRIX_INVERSE, { 1 }, 0, 0 },
+       { "lessThan", "ff", "", OP_F_ORD_LESS_THAN, { 1, 2 }, 0, 0 },
+       { "lessThan", "ii", "", OP_S_LESS_THAN, { 1, 2 }, 0, 0 },
+       { "lessThan", "uu", "", OP_U_LESS_THAN, { 1, 2 }, 0, 0 },
+       { "lessThanEqual", "ff", "", OP_F_ORD_LESS_THAN_EQUAL, { 1, 2 }, 0, 0 },
+       { "lessThanEqual", "ii", "", OP_S_LESS_THAN_EQUAL, { 1, 2 }, 0, 0 },
+       { "lessThanEqual", "uu", "", OP_U_LESS_THAN_EQUAL, { 1, 2 }, 0, 0 },
+       { "greaterThan", "ff", "", OP_F_ORD_GREATER_THAN, { 1, 2 }, 0, 0 },
+       { "greaterThan", "ii", "", OP_S_GREATER_THAN, { 1, 2 }, 0, 0 },
+       { "greaterThan", "uu", "", OP_U_GREATER_THAN, { 1, 2 }, 0, 0 },
+       { "greaterThanEqual", "ff", "", OP_F_ORD_GREATER_THAN_EQUAL, { 1, 2 }, 0, 0 },
+       { "greaterThanEqual", "ii", "", OP_S_GREATER_THAN_EQUAL, { 1, 2 }, 0, 0 },
+       { "greaterThanEqual", "uu", "", OP_U_GREATER_THAN_EQUAL, { 1, 2 }, 0, 0 },
+       { "equal", "ff", "", OP_F_ORD_EQUAL, { 1, 2 }, 0, 0 },
+       { "equal", "ii", "", OP_I_EQUAL, { 1, 2 }, 0, 0 },
+       { "equal", "uu", "", OP_I_EQUAL, { 1, 2 }, 0, 0 },
+       { "notEqual", "ff", "", OP_F_ORD_NOT_EQUAL, { 1, 2 }, 0, 0 },
+       { "notEqual", "ii", "", OP_I_NOT_EQUAL, { 1, 2 }, 0, 0 },
+       { "notEqual", "uu", "", OP_I_NOT_EQUAL, { 1, 2 }, 0, 0 },
+       { "any", "b", "", OP_ANY, { 1 }, 0, 0 },
+       { "all", "b", "", OP_ALL, { 1 }, 0, 0 },
+       { "not", "b", "", OP_LOGICAL_NOT, { 1 }, 0, 0 },
+       { "bitfieldExtract", "iii", "", OP_BIT_FIELD_S_EXTRACT, { 1, 2, 3 }, 0, 0 },
+       { "bitfieldExtract", "uii", "", OP_BIT_FIELD_U_EXTRACT, { 1, 2, 3 }, 0, 0 },
+       { "bitfieldInsert", "iiii", "", OP_BIT_FIELD_INSERT, { 1, 2, 3, 4 }, 0, 0 },
+       { "bitfieldInsert", "uuii", "", OP_BIT_FIELD_INSERT, { 1, 2, 3, 4 }, 0, 0 },
+       { "bitfieldReverse", "i", "", OP_BIT_REVERSE, { 1 }, 0, 0 },
+       { "bitfieldReverse", "u", "", OP_BIT_REVERSE, { 1 }, 0, 0 },
+       { "bitCount", "i", "", OP_BIT_COUNT, { 1 }, 0, 0 },
+       { "findLSB", "i", "GLSL.std.450", GLSL450_FIND_I_LSB, { 1 }, 0, 0 },
+       { "findLSB", "u", "GLSL.std.450", GLSL450_FIND_I_LSB, { 1 }, 0, 0 },
+       { "findMSB", "i", "GLSL.std.450", GLSL450_FIND_S_MSB, { 1 }, 0, 0 },
+       { "findMSB", "u", "GLSL.std.450", GLSL450_FIND_U_MSB, { 1 }, 0, 0 },
+       { "textureSize", "", "", OP_IMAGE_QUERY_SIZE_LOD, { 1, 2 }, CAP_IMAGE_QUERY, 0 },
+       { "texture", "", "", 0, { }, 0, &SpirVGenerator::visit_builtin_texture },
+       { "textureLod", "", "", 0, { }, 0, &SpirVGenerator::visit_builtin_texture },
+       { "texelFetch", "", "", 0, { }, 0, &SpirVGenerator::visit_builtin_texel_fetch },
+       { "EmitVertex", "", "", OP_EMIT_VERTEX, { }, 0, 0 },
+       { "EndPrimitive", "", "", OP_END_PRIMITIVE, { }, 0, 0 },
+       { "dFdx", "f", "", OP_DP_DX, { 1 }, 0, 0 },
+       { "dFdy", "f", "", OP_DP_DY, { 1 }, 0, 0 },
+       { "dFdxFine", "f", "", OP_DP_DX_FINE, { 1 }, CAP_DERIVATIVE_CONTROL, 0 },
+       { "dFdyFine", "f", "", OP_DP_DY_FINE, { 1 }, CAP_DERIVATIVE_CONTROL, 0 },
+       { "dFdxCoarse", "f", "", OP_DP_DX_COARSE, { 1 }, CAP_DERIVATIVE_CONTROL, 0 },
+       { "dFdyCoarse", "f", "", OP_DP_DY_COARSE, { 1 }, CAP_DERIVATIVE_CONTROL, 0 },
+       { "fwidth", "f", "", OP_FWIDTH, { 1 }, 0, 0 },
+       { "fwidthFine", "f", "", OP_FWIDTH_FINE, { 1 }, CAP_DERIVATIVE_CONTROL, 0 },
+       { "fwidthCoarse", "f", "", OP_FWIDTH_COARSE, { 1 }, CAP_DERIVATIVE_CONTROL, 0 },
+       { "interpolateAtCentroid", "", "", 0, { }, CAP_INTERPOLATION_FUNCTION, &SpirVGenerator::visit_builtin_interpolate },
+       { "interpolateAtSample", "", "", 0, { }, CAP_INTERPOLATION_FUNCTION, &SpirVGenerator::visit_builtin_interpolate },
+       { "interpolateAtOffset", "", "", 0, { }, CAP_INTERPOLATION_FUNCTION, &SpirVGenerator::visit_builtin_interpolate },
+       { "", "", "", 0, { }, 0, 0 }
 };
 
 SpirVGenerator::SpirVGenerator():
@@ -1096,6 +1096,9 @@ void SpirVGenerator::visit(FunctionCall &call)
                        if(builtin_info->function==call.name && (!builtin_info->arg_types[0] || builtin_info->arg_types==arg_types))
                                break;
 
+               if(builtin_info->capability)
+                       use_capability(static_cast<Capability>(builtin_info->capability));
+
                if(builtin_info->opcode)
                {
                        Opcode opcode;
@@ -1361,8 +1364,6 @@ void SpirVGenerator::visit_builtin_interpolate(FunctionCall &call, const vector<
        else
                throw internal_error("invalid interpolate call");
 
-       use_capability(CAP_INTERPOLATION_FUNCTION);
-
        Id ext_id = import_extension("GLSL.std.450");
        r_expression_result_id = begin_expression(OP_EXT_INST, get_id(*call.type));
        writer.write(ext_id);
index 26467bcd15a3941858ceb82b6bf3cc1eb0fc4c84..c023adae9af3cc5e75a637298afc8f98fd244fc7 100644 (file)
@@ -31,6 +31,7 @@ private:
                char extension[13];
                Word opcode;
                UInt8 arg_order[4];
+               Word capability;
                void (SpirVGenerator::*handler)(FunctionCall &, const std::vector<Id> &);
        };
 
index 28f556630a7df31d5115d52f87fa442e335bbd59..04d283490e790dd21421d4ef7ee2dda228ea16a5 100644 (file)
@@ -159,6 +159,8 @@ enum SpirVCapability
        CAP_SAMPLED_1D = 43,
        CAP_IMAGE_1D = 44,
        CAP_SAMPLED_CUBE_ARRAY = 45,
+       CAP_IMAGE_QUERY = 50,
+       CAP_DERIVATIVE_CONTROL = 51,
        CAP_INTERPOLATION_FUNCTION = 52
 };