[qfcc] Parse about 2/5 of the glsl functions

They're stuck on computed return types causing segfaults, but the rest
helped with ironing out other issues in the compiler.
This commit is contained in:
Bill Currie 2024-09-04 10:43:11 +09:00
parent 3aab301d45
commit f6d2cf43e8

View file

@ -309,217 +309,256 @@ static gentype_t genDType = {
.name = "genDType", .name = "genDType",
.valid_types = Dtypes, .valid_types = Dtypes,
}; };
#endif
genFType radians(genFType degrees) static const char *glsl_general_functions =
genFType degrees(genFType radians) SRC_LINE
genFType sin(genFType angle) "#define out @out" "\n"
genFType cos(genFType angle) "#define highp" "\n"
genFType tan(genFType angle) "#define lowp" "\n"
genFType asin(genFType x) "#define uint unsigned" "\n"
genFType acos(genFType x) "#define uvec2 uivec2" "\n"
genFType atan(genFType y, genFType x) "@generic(genFType=@vector(float)," "\n"
genFType atan(genFType y_over_x) " genDType=@vector(double)," "\n"
genFType sinh(genFType x) " genIType=@vector(int)," "\n"
genFType cosh(genFType x) " genUType=@vector(unsigned int)," "\n"
genFType tanh(genFType x) " genBType=@vector(bool)," "\n"
genFType asinh(genFType x) " mat=@matrix(float)," "\n"
genFType acosh(genFType x) " vec=[vec2,vec3,vec4,dvec2,dvec3,dvec4]," "\n"
genFType atanh(genFType x) " ivec=[ivec2,ivec3,ivec4]," "\n"
" uvec=[uivec2,uivec3,uivec4]," "\n"
" bvec=[bvec2,bvec3,bvec4]) {" "\n"
"genFType radians(genFType degrees);" "\n"
"genFType degrees(genFType radians);" "\n"
"genFType sin(genFType angle);" "\n"
"genFType cos(genFType angle);" "\n"
"genFType tan(genFType angle);" "\n"
"genFType asin(genFType x);" "\n"
"genFType acos(genFType x);" "\n"
"genFType atan(genFType y, genFType x);" "\n"
"genFType atan(genFType y_over_x);" "\n"
"genFType sinh(genFType x);" "\n"
"genFType cosh(genFType x);" "\n"
"genFType tanh(genFType x);" "\n"
"genFType asinh(genFType x);" "\n"
"genFType acosh(genFType x);" "\n"
"genFType atanh(genFType x);" "\n"
//exponential functions //exponential functions
genFType pow(genFType x, genFType y) SRC_LINE
genFType exp(genFType x) "genFType pow(genFType x, genFType y);" "\n"
genFType log(genFType x) "genFType exp(genFType x);" "\n"
genFType exp2(genFType x) "genFType log(genFType x);" "\n"
genFType log2(genFType x) "genFType exp2(genFType x);" "\n"
genFType sqrt(genFType x) "genFType log2(genFType x);" "\n"
genDType sqrt(genDType x) "genFType sqrt(genFType x);" "\n"
genFType inversesqrt(genFType x) "genDType sqrt(genDType x);" "\n"
genDType inversesqrt(genDType x) "genFType inversesqrt(genFType x);" "\n"
"genDType inversesqrt(genDType x);" "\n"
//common functions //common functions
genFType abs(genFType x) SRC_LINE
genIType abs(genIType x) "genFType abs(genFType x);" "\n"
genDType abs(genDType x) "genIType abs(genIType x);" "\n"
genFType sign(genFType x) "genDType abs(genDType x);" "\n"
genIType sign(genIType x) "genFType sign(genFType x);" "\n"
genDType sign(genDType x) "genIType sign(genIType x);" "\n"
genFType floor(genFType x) "genDType sign(genDType x);" "\n"
genDType floor(genDType x) "genFType floor(genFType x);" "\n"
genFType trunc(genFType x) "genDType floor(genDType x);" "\n"
genDType trunc(genDType x) "genFType trunc(genFType x);" "\n"
genFType round(genFType x) "genDType trunc(genDType x);" "\n"
genDType round(genDType x) "genFType round(genFType x);" "\n"
genFType roundEven(genFType x) "genDType round(genDType x);" "\n"
genDType roundEven(genDType x) "genFType roundEven(genFType x);" "\n"
genFType ceil(genFType x) "genDType roundEven(genDType x);" "\n"
genDType ceil(genDType x) "genFType ceil(genFType x);" "\n"
genFType fract(genFType x) "genDType ceil(genDType x);" "\n"
genDType fract(genDType x) "genFType fract(genFType x);" "\n"
genFType mod(genFType x, float y) "genDType fract(genDType x);" "\n"
genFType mod(genFType x, genFType y) "genFType mod(genFType x, float y);" "\n"
genDType mod(genDType x, double y) "genFType mod(genFType x, genFType y);" "\n"
genDType mod(genDType x, genDType y) "genDType mod(genDType x, double y);" "\n"
genFType modf(genFType x, out genFType i) "genDType mod(genDType x, genDType y);" "\n"
genDType modf(genDType x, out genDType i) "genFType modf(genFType x, out genFType i);" "\n"
genFType min(genFType x, genFType y) "genDType modf(genDType x, out genDType i);" "\n"
genFType min(genFType x, float y) "genFType min(genFType x, genFType y);" "\n"
genDType min(genDType x, genDType y) "genFType min(genFType x, float y);" "\n"
genDType min(genDType x, double y) "genDType min(genDType x, genDType y);" "\n"
genIType min(genIType x, genIType y) "genDType min(genDType x, double y);" "\n"
genIType min(genIType x, int y) "genIType min(genIType x, genIType y);" "\n"
genUType min(genUType x, genUType y) "genIType min(genIType x, int y);" "\n"
genUType min(genUType x, uint y) "genUType min(genUType x, genUType y);" "\n"
genFType max(genFType x, genFType y) "genUType min(genUType x, uint y);" "\n"
genFType max(genFType x, float y) "genFType max(genFType x, genFType y);" "\n"
genDType max(genDType x, genDType y) "genFType max(genFType x, float y);" "\n"
genDType max(genDType x, double y) "genDType max(genDType x, genDType y);" "\n"
genIType max(genIType x, genIType y) "genDType max(genDType x, double y);" "\n"
genIType max(genIType x, int y) "genIType max(genIType x, genIType y);" "\n"
genUType max(genUType x, genUType y) "genIType max(genIType x, int y);" "\n"
genUType max(genUType x, uint y) "genUType max(genUType x, genUType y);" "\n"
genFType clamp(genFType x, genFType minVal, genFType maxVal) "genUType max(genUType x, uint y);" "\n"
genFType clamp(genFType x, float minVal, float maxVal) "genFType clamp(genFType x, genFType minVal, genFType maxVal);" "\n"
genDType clamp(genDType x, genDType minVal, genDType maxVal) "genFType clamp(genFType x, float minVal, float maxVal);" "\n"
genDType clamp(genDType x, double minVal, double maxVal) "genDType clamp(genDType x, genDType minVal, genDType maxVal);" "\n"
genIType clamp(genIType x, genIType minVal, genIType maxVal) "genDType clamp(genDType x, double minVal, double maxVal);" "\n"
genIType clamp(genIType x, int minVal, int maxVal) "genIType clamp(genIType x, genIType minVal, genIType maxVal);" "\n"
genUType clamp(genUType x, genUType minVal, genUType maxVal) "genIType clamp(genIType x, int minVal, int maxVal);" "\n"
genUType clamp(genUType x, uint minVal, uint maxVal) "genUType clamp(genUType x, genUType minVal, genUType maxVal);" "\n"
genFType mix(genFType x, genFType y, genFType a) "genUType clamp(genUType x, uint minVal, uint maxVal);" "\n"
genFType mix(genFType x, genFType y, float a) "genFType mix(genFType x, genFType y, genFType a);" "\n"
genDType mix(genDType x, genDType y, genDType a) "genFType mix(genFType x, genFType y, float a);" "\n"
genDType mix(genDType x, genDType y, double a) "genDType mix(genDType x, genDType y, genDType a);" "\n"
genFType mix(genFType x, genFType y, genBType a) "genDType mix(genDType x, genDType y, double a);" "\n"
genDType mix(genDType x, genDType y, genBType a) "genFType mix(genFType x, genFType y, genBType a);" "\n"
genIType mix(genIType x, genIType y, genBType a) "genDType mix(genDType x, genDType y, genBType a);" "\n"
genUType mix(genUType x, genUType y, genBType a) "genIType mix(genIType x, genIType y, genBType a);" "\n"
genBType mix(genBType x, genBType y, genBType a) "genUType mix(genUType x, genUType y, genBType a);" "\n"
genFType step(genFType edge, genFType x) "genBType mix(genBType x, genBType y, genBType a);" "\n"
genFType step(float edge, genFType x) "genFType step(genFType edge, genFType x);" "\n"
genDType step(genDType edge, genDType x) "genFType step(float edge, genFType x);" "\n"
genDType step(double edge, genDType x) "genDType step(genDType edge, genDType x);" "\n"
genFType smoothstep(genFType edge0, genFType edge1, genFType x) "genDType step(double edge, genDType x);" "\n"
genFType smoothstep(float edge0, float edge1, genFType x) "genFType smoothstep(genFType edge0, genFType edge1, genFType x);" "\n"
genDType smoothstep(genDType edge0, genDType edge1, genDType x) "genFType smoothstep(float edge0, float edge1, genFType x);" "\n"
genDType smoothstep(double edge0, double edge1, genDType x) "genDType smoothstep(genDType edge0, genDType edge1, genDType x);" "\n"
genBType isnan(genFType x) "genDType smoothstep(double edge0, double edge1, genDType x);" "\n"
genBType isnan(genDType x) "genBType isnan(genFType x);" "\n"
genBType isinf(genFType x) "genBType isnan(genDType x);" "\n"
genBType isinf(genDType x) "genBType isinf(genFType x);" "\n"
genIType floatBitsToInt(highp genFType value) "genBType isinf(genDType x);" "\n"
genUType floatBitsToUint(highp genFType value) "genIType floatBitsToInt(highp genFType value);" "\n"
genFType intBitsToFloat(highp genIType value) "genUType floatBitsToUint(highp genFType value);" "\n"
genFType uintBitsToFloat(highp genUType value) "genFType intBitsToFloat(highp genIType value);" "\n"
genFType fma(genFType a, genFType b, genFType c) "genFType uintBitsToFloat(highp genUType value);" "\n"
genDType fma(genDType a, genDType b, genDType c) "genFType fma(genFType a, genFType b, genFType c);" "\n"
genFType frexp(highp genFType x, out highp genIType exp) "genDType fma(genDType a, genDType b, genDType c);" "\n"
genDType frexp(genDType x, out genIType exp) "genFType frexp(highp genFType x, out highp genIType exp);" "\n"
genFType ldexp(highp genFType x, highp genIType exp) "genDType frexp(genDType x, out genIType exp);" "\n"
genDType ldexp(genDType x, genIType exp) "genFType ldexp(highp genFType x, highp genIType exp);" "\n"
"genDType ldexp(genDType x, genIType exp);" "\n"
//floating-point pack and unpack functions //floating-point pack and unpack functions
highp uint packUnorm2x16(vec2 v) SRC_LINE
highp uint packSnorm2x16(vec2 v) "highp uint packUnorm2x16(vec2 v);" "\n"
uint packUnorm4x8(vec4 v) "highp uint packSnorm2x16(vec2 v);" "\n"
uint packSnorm4x8(vec4 v) "uint packUnorm4x8(vec4 v);" "\n"
vec2 unpackUnorm2x16(highp uint p) "uint packSnorm4x8(vec4 v);" "\n"
vec2 unpackSnorm2x16(highp uint p) "vec2 unpackUnorm2x16(highp uint p);" "\n"
vec4 unpackUnorm4x8(highp uint p) "vec2 unpackSnorm2x16(highp uint p);" "\n"
vec4 unpackSnorm4x8(highp uint p) "vec4 unpackUnorm4x8(highp uint p);" "\n"
uint packHalf2x16(vec2 v) "vec4 unpackSnorm4x8(highp uint p);" "\n"
vec2 unpackHalf2x16(uint v) "uint packHalf2x16(vec2 v);" "\n"
double packDouble2x32(uvec2 v) "vec2 unpackHalf2x16(uint v);" "\n"
uvec2 unpackDouble2x32(double v) "double packDouble2x32(uvec2 v);" "\n"
"uvec2 unpackDouble2x32(double v);" "\n"
//geometric functions //geometric functions
float length(genFType x) SRC_LINE
double length(genDType x) "float length(genFType x);" "\n"
float distance(genFType p0, genFType p1) "double length(genDType x);" "\n"
double distance(genDType p0, genDType p1) "float distance(genFType p0, genFType p1);" "\n"
float dot(genFType x, genFType y) "double distance(genDType p0, genDType p1);" "\n"
double dot(genDType x, genDType y) "float dot(genFType x, genFType y);" "\n"
vec3 cross(vec3 x, vec3 y) "double dot(genDType x, genDType y);" "\n"
dvec3 cross(dvec3 x, dvec3 y) "@overload vec3 cross(vec3 x, vec3 y);" "\n"
genFType normalize(genFType x) "@overload dvec3 cross(dvec3 x, dvec3 y);" "\n"
genDType normalize(genDType x) "genFType normalize(genFType x);" "\n"
genFType faceforward(genFType N, genFType I, genFType Nref) "genDType normalize(genDType x);" "\n"
genDType faceforward(genDType N, genDType I, genDType Nref) "genFType faceforward(genFType N, genFType I, genFType Nref);" "\n"
genFType reflect(genFType I, genFType N) "genDType faceforward(genDType N, genDType I, genDType Nref);" "\n"
genDType reflect(genDType I, genDType N) "genFType reflect(genFType I, genFType N);" "\n"
genFType refract(genFType I, genFType N, float eta) "genDType reflect(genDType I, genDType N);" "\n"
genDType refract(genDType I, genDType N, double eta) "genFType refract(genFType I, genFType N, float eta);" "\n"
"genDType refract(genDType I, genDType N, double eta);" "\n"
//matrix functions //matrix functions
mat matrixCompMult(mat x, mat y) SRC_LINE
mat2 outerProduct(vec2 c, vec2 r) "mat matrixCompMult(mat x, mat y);" "\n"
mat3 outerProduct(vec3 c, vec3 r) "@overload mat2 outerProduct(vec2 c, vec2 r);" "\n"
mat4 outerProduct(vec4 c, vec4 r) "@overload mat3 outerProduct(vec3 c, vec3 r);" "\n"
mat2x3 outerProduct(vec3 c, vec2 r) "@overload mat4 outerProduct(vec4 c, vec4 r);" "\n"
mat3x2 outerProduct(vec2 c, vec3 r) "@overload mat2x3 outerProduct(vec3 c, vec2 r);" "\n"
mat2x4 outerProduct(vec4 c, vec2 r) "@overload mat3x2 outerProduct(vec2 c, vec3 r);" "\n"
mat4x2 outerProduct(vec2 c, vec4 r) "@overload mat2x4 outerProduct(vec4 c, vec2 r);" "\n"
mat3x4 outerProduct(vec4 c, vec3 r) "@overload mat4x2 outerProduct(vec2 c, vec4 r);" "\n"
mat4x3 outerProduct(vec3 c, vec4 r) "@overload mat3x4 outerProduct(vec4 c, vec3 r);" "\n"
mat2 transpose(mat2 m) "@overload mat4x3 outerProduct(vec3 c, vec4 r);" "\n"
mat3 transpose(mat3 m) "@overload mat2 transpose(mat2 m);" "\n"
mat4 transpose(mat4 m) "@overload mat3 transpose(mat3 m);" "\n"
mat2x3 transpose(mat3x2 m) "@overload mat4 transpose(mat4 m);" "\n"
mat3x2 transpose(mat2x3 m) "@overload mat2x3 transpose(mat3x2 m);" "\n"
mat2x4 transpose(mat4x2 m) "@overload mat3x2 transpose(mat2x3 m);" "\n"
mat4x2 transpose(mat2x4 m) "@overload mat2x4 transpose(mat4x2 m);" "\n"
mat3x4 transpose(mat4x3 m) "@overload mat4x2 transpose(mat2x4 m);" "\n"
mat4x3 transpose(mat3x4 m) "@overload mat3x4 transpose(mat4x3 m);" "\n"
float determinant(mat2 m) "@overload mat4x3 transpose(mat3x4 m);" "\n"
float determinant(mat3 m) "@overload float determinant(mat2 m);" "\n"
float determinant(mat4 m) "@overload float determinant(mat3 m);" "\n"
mat2 inverse(mat2 m) "@overload float determinant(mat4 m);" "\n"
mat3 inverse(mat3 m) "@overload mat2 inverse(mat2 m);" "\n"
mat4 inverse(mat4 m) "@overload mat3 inverse(mat3 m);" "\n"
"@overload mat4 inverse(mat4 m);" "\n"
//vector relational functions //vector relational functions
bvec lessThan(vec x, vec y) SRC_LINE
bvec lessThan(ivec x, ivec y) "@vector(bool,@width(vec)) lessThan(vec x, vec y);" "\n"
bvec lessThan(uvec x, uvec y) "@vector(bool,@width(ivec)) lessThan(ivec x, ivec y);" "\n"
bvec lessThanEqual(vec x, vec y) "@vector(bool,@width(uvec)) lessThan(uvec x, uvec y);" "\n"
bvec lessThanEqual(ivec x, ivec y) "@vector(bool,@width(vec)) lessThanEqual(vec x, vec y);" "\n"
bvec lessThanEqual(uvec x, uvec y) "@vector(bool,@width(ivec)) lessThanEqual(ivec x, ivec y);" "\n"
bvec greaterThan(vec x, vec y) "@vector(bool,@width(uvec)) lessThanEqual(uvec x, uvec y);" "\n"
bvec greaterThan(ivec x, ivec y) "@vector(bool,@width(vec)) greaterThan(vec x, vec y);" "\n"
bvec greaterThan(uvec x, uvec y) "@vector(bool,@width(ivec)) greaterThan(ivec x, ivec y);" "\n"
bvec greaterThanEqual(vec x, vec y) "@vector(bool,@width(uvec)) greaterThan(uvec x, uvec y);" "\n"
bvec greaterThanEqual(ivec x, ivec y) "@vector(bool,@width(vec)) greaterThanEqual(vec x, vec y);" "\n"
bvec greaterThanEqual(uvec x, uvec y) "@vector(bool,@width(ivec)) greaterThanEqual(ivec x, ivec y);" "\n"
bvec equal(vec x, vec y) "@vector(bool,@width(uvec)) greaterThanEqual(uvec x, uvec y);" "\n"
bvec equal(ivec x, ivec y) "@vector(bool,@width(vec)) equal(vec x, vec y);" "\n"
bvec equal(uvec x, uvec y) "@vector(bool,@width(ivec)) equal(ivec x, ivec y);" "\n"
bvec equal(bvec x, bvec y) "@vector(bool,@width(uvec)) equal(uvec x, uvec y);" "\n"
bvec notEqual(vec x, vec y) "@vector(bool,@width(bvec)) equal(bvec x, bvec y);" "\n"
bvec notEqual(ivec x, ivec y) "@vector(bool,@width(vec)) notEqual(vec x, vec y);" "\n"
bvec notEqual(uvec x, uvec y) "@vector(bool,@width(ivec)) notEqual(ivec x, ivec y);" "\n"
bvec notEqual(bvec x, bvec y) "@vector(bool,@width(uvec)) notEqual(uvec x, uvec y);" "\n"
bool any(bvec x) "@vector(bool,@width(bvec)) notEqual(bvec x, bvec y);" "\n"
bool all(bvec x) "bool any(bvec x);" "\n"
bvec not(bvec x) "bool all(bvec x);" "\n"
"@vector(bool,@width(bvec)) not(bvec x);" "\n"
//integer functions //integer functions
genUType uaddCarry(highp genUType x, highp genUType y, out lowp genUType carry) SRC_LINE
genUType usubBorrow(highp genUType x, highp genUType y, out lowp genUType borrow) "genUType uaddCarry(highp genUType x, highp genUType y," "\n"
void umulExtended(highp genUType x, highp genUType y, out highp genUType msb, out highp genUType lsb) " out lowp genUType carry);" "\n"
void imulExtended(highp genIType x, highp genIType y, out highp genIType msb, out highp genIType lsb) "genUType usubBorrow(highp genUType x, highp genUType y," "\n"
genIType bitfieldExtract(genIType value, int offset, int bits) " out lowp genUType borrow);" "\n"
genUType bitfieldExtract(genUType value, int offset, int bits) "void umulExtended(highp genUType x, highp genUType y," "\n"
genIType bitfieldInsert(genIType base, genIType insert, int offset, int bits) " out highp genUType msb," "\n"
genUType bitfieldInsert(genUType base, genUType insert, int offset, int bits) " out highp genUType lsb);" "\n"
genIType bitfieldReverse(highp genIType value) "void imulExtended(highp genIType x, highp genIType y," "\n"
genUType bitfieldReverse(highp genUType value) " out highp genIType msb," "\n"
genIType bitCount(genIType value) " out highp genIType lsb);" "\n"
genIType bitCount(genUType value) "genIType bitfieldExtract(genIType value, int offset, int bits);" "\n"
genIType findLSB(genIType value) "genUType bitfieldExtract(genUType value, int offset, int bits);" "\n"
genIType findLSB(genUType value) "genIType bitfieldInsert(genIType base, genIType insert," "\n"
genIType findMSB(highp genIType value) " int offset, int bits);" "\n"
genIType findMSB(highp genUType value) "genUType bitfieldInsert(genUType base, genUType insert," "\n"
" int offset, int bits);" "\n"
"genIType bitfieldReverse(highp genIType value);" "\n"
"genUType bitfieldReverse(highp genUType value);" "\n"
"genIType bitCount(genIType value);" "\n"
"genIType bitCount(genUType value);" "\n"
"genIType findLSB(genIType value);" "\n"
"genIType findLSB(genUType value);" "\n"
"genIType findMSB(highp genIType value);" "\n"
"genIType findMSB(highp genUType value);" "\n"
"};" "\n"
"#undef out" "\n"
"#undef highp" "\n"
"#undef lowp" "\n"
"#undef uint" "\n"
"#undef uvec2" "\n";
#if 0
//texture functions //texture functions
//query //query
int textureSize(gsampler1D sampler, int lod) int textureSize(gsampler1D sampler, int lod)
@ -876,6 +915,7 @@ glsl_init_common (void)
{ {
current_language.initialized = true; current_language.initialized = true;
glsl_block_clear (); glsl_block_clear ();
qc_parse_string (glsl_general_functions);
glsl_parse_vars (glsl_system_constants); glsl_parse_vars (glsl_system_constants);
} }