blob: faaac2366703ec57cfd1d0bdbc775908f4dddda6 [file] [log] [blame]
#version 450
#extension GL_EXT_shader_explicit_arithmetic_types: enable
#extension GL_EXT_shader_explicit_arithmetic_types_int8: require
#extension GL_EXT_shader_explicit_arithmetic_types_int16: require
#extension GL_EXT_shader_explicit_arithmetic_types_int32: require
#extension GL_EXT_shader_explicit_arithmetic_types_int64: require
#extension GL_EXT_shader_explicit_arithmetic_types_float16: require
#extension GL_EXT_shader_explicit_arithmetic_types_float32: require
#extension GL_EXT_shader_explicit_arithmetic_types_float64: require
void main()
{
}
// Single float literals
void literal()
{
const float64_t f64c = 0.000001LF;
const f64vec2 f64cv = f64vec2(-0.25lF, 0.03Lf);
f64vec2 f64v;
f64v.x = f64c;
f64v += f64cv;
}
// Block memory layout
struct S
{
float64_t x;
f64vec2 y;
f64vec3 z;
};
layout(column_major, std140) uniform B1
{
float64_t a;
f64vec2 b;
f64vec3 c;
float64_t d[2];
f64mat2x3 e;
f64mat2x3 f[2];
S g;
S h[2];
};
// Specialization constant
layout(constant_id = 100) const float16_t sf16 = 0.125hf;
layout(constant_id = 101) const float32_t sf = 0.25;
layout(constant_id = 102) const float64_t sd = 0.5lf;
const float f16_to_f = float(sf16);
const double f16_to_d = float(sf16);
const float16_t f_to_f16 = float16_t(sf);
const float16_t d_to_f16 = float16_t(sd);
void operators()
{
float64_t f64;
f64vec2 f64v;
f64mat2x2 f64m;
bool b;
// Arithmetic
f64v += f64v;
f64v -= f64v;
f64v *= f64v;
f64v /= f64v;
f64v++;
f64v--;
++f64m;
--f64m;
f64v = -f64v;
f64m = -f64m;
f64 = f64v.x + f64v.y;
f64 = f64v.x - f64v.y;
f64 = f64v.x * f64v.y;
f64 = f64v.x / f64v.y;
// Relational
b = (f64v.x != f64);
b = (f64v.y == f64);
b = (f64v.x > f64);
b = (f64v.y < f64);
b = (f64v.x >= f64);
b = (f64v.y <= f64);
// Vector/matrix operations
f64v = f64v * f64;
f64m = f64m * f64;
f64v = f64m * f64v;
f64v = f64v * f64m;
f64m = f64m * f64m;
}
void typeCast()
{
bvec3 bv;
f32vec3 f32v;
f64vec3 f64v;
i8vec3 i8v;
u8vec3 u8v;
i16vec3 i16v;
u16vec3 u16v;
i32vec3 i32v;
u32vec3 u32v;
i64vec3 i64v;
u64vec3 u64v;
f16vec3 f16v;
f64v = f64vec3(bv); // bool -> float64
bv = bvec3(f64v); // float64 -> bool
f64v = f64vec3(f16v); // float16 -> float64
f16v = f16vec3(f64v); // float64 -> float16
i8v = i8vec3(f64v); // float64 -> int8
i16v = i16vec3(f64v); // float64 -> int16
i32v = i32vec3(f64v); // float64 -> int32
i64v = i64vec3(f64v); // float64 -> int64
u8v = u8vec3(f64v); // float64 -> uint8
u16v = u16vec3(f64v); // float64 -> uint16
u32v = u32vec3(f64v); // float64 -> uint32
u64v = u64vec3(f64v); // float64 -> uint64
}
void builtinAngleTrigFuncs()
{
f64vec4 f64v1, f64v2;
f64v2 = radians(f64v1);
f64v2 = degrees(f64v1);
f64v2 = sin(f64v1);
f64v2 = cos(f64v1);
f64v2 = tan(f64v1);
f64v2 = asin(f64v1);
f64v2 = acos(f64v1);
f64v2 = atan(f64v1, f64v2);
f64v2 = atan(f64v1);
f64v2 = sinh(f64v1);
f64v2 = cosh(f64v1);
f64v2 = tanh(f64v1);
f64v2 = asinh(f64v1);
f64v2 = acosh(f64v1);
f64v2 = atanh(f64v1);
}
void builtinExpFuncs()
{
f64vec2 f64v1, f64v2;
f64v2 = pow(f64v1, f64v2);
f64v2 = exp(f64v1);
f64v2 = log(f64v1);
f64v2 = exp2(f64v1);
f64v2 = log2(f64v1);
f64v2 = sqrt(f64v1);
f64v2 = inversesqrt(f64v1);
}
void builtinCommonFuncs()
{
f64vec3 f64v1, f64v2, f64v3;
float64_t f64;
bool b;
bvec3 bv;
ivec3 iv;
f64v2 = abs(f64v1);
f64v2 = sign(f64v1);
f64v2 = floor(f64v1);
f64v2 = trunc(f64v1);
f64v2 = round(f64v1);
f64v2 = roundEven(f64v1);
f64v2 = ceil(f64v1);
f64v2 = fract(f64v1);
f64v2 = mod(f64v1, f64v2);
f64v2 = mod(f64v1, f64);
f64v3 = modf(f64v1, f64v2);
f64v3 = min(f64v1, f64v2);
f64v3 = min(f64v1, f64);
f64v3 = max(f64v1, f64v2);
f64v3 = max(f64v1, f64);
f64v3 = clamp(f64v1, f64, f64v2.x);
f64v3 = clamp(f64v1, f64v2, f64vec3(f64));
f64v3 = mix(f64v1, f64v2, f64);
f64v3 = mix(f64v1, f64v2, f64v3);
f64v3 = mix(f64v1, f64v2, bv);
f64v3 = step(f64v1, f64v2);
f64v3 = step(f64, f64v3);
f64v3 = smoothstep(f64v1, f64v2, f64v3);
f64v3 = smoothstep(f64, f64v1.x, f64v2);
b = isnan(f64);
bv = isinf(f64v1);
f64v3 = fma(f64v1, f64v2, f64v3);
f64v2 = frexp(f64v1, iv);
f64v2 = ldexp(f64v1, iv);
}
void builtinGeometryFuncs()
{
float64_t f64;
f64vec3 f64v1, f64v2, f64v3;
f64 = length(f64v1);
f64 = distance(f64v1, f64v2);
f64 = dot(f64v1, f64v2);
f64v3 = cross(f64v1, f64v2);
f64v2 = normalize(f64v1);
f64v3 = faceforward(f64v1, f64v2, f64v3);
f64v3 = reflect(f64v1, f64v2);
f64v3 = refract(f64v1, f64v2, f64);
}
void builtinMatrixFuncs()
{
f64mat2x3 f64m1, f64m2, f64m3;
f64mat3x2 f64m4;
f64mat3 f64m5;
f64mat4 f64m6, f64m7;
f64vec3 f64v1;
f64vec2 f64v2;
float64_t f64;
f64m3 = matrixCompMult(f64m1, f64m2);
f64m1 = outerProduct(f64v1, f64v2);
f64m4 = transpose(f64m1);
f64 = determinant(f64m5);
f64m6 = inverse(f64m7);
}
void builtinVecRelFuncs()
{
f64vec3 f64v1, f64v2;
bvec3 bv;
bv = lessThan(f64v1, f64v2);
bv = lessThanEqual(f64v1, f64v2);
bv = greaterThan(f64v1, f64v2);
bv = greaterThanEqual(f64v1, f64v2);
bv = equal(f64v1, f64v2);
bv = notEqual(f64v1, f64v2);
}
in flat f64vec3 if64v;
void builtinFragProcFuncs()
{
f64vec3 f64v;
// Derivative
f64v.x = dFdx(if64v.x);
f64v.y = dFdy(if64v.y);
f64v.xy = dFdxFine(if64v.xy);
f64v.xy = dFdyFine(if64v.xy);
f64v = dFdxCoarse(if64v);
f64v = dFdxCoarse(if64v);
f64v.x = fwidth(if64v.x);
f64v.xy = fwidthFine(if64v.xy);
f64v = fwidthCoarse(if64v);
// Interpolation
f64v.x = interpolateAtCentroid(if64v.x);
f64v.xy = interpolateAtSample(if64v.xy, 1);
f64v = interpolateAtOffset(if64v, f64vec2(0.5f));
}