1#version 450 2 3#extension GL_EXT_shader_explicit_arithmetic_types: enable 4#extension GL_EXT_shader_explicit_arithmetic_types_int8: require 5#extension GL_EXT_shader_explicit_arithmetic_types_int16: require 6#extension GL_EXT_shader_explicit_arithmetic_types_int32: require 7#extension GL_EXT_shader_explicit_arithmetic_types_int64: require 8#extension GL_EXT_shader_explicit_arithmetic_types_float16: require 9#extension GL_EXT_shader_explicit_arithmetic_types_float32: require 10#extension GL_EXT_shader_explicit_arithmetic_types_float64: require 11 12void main() 13{ 14} 15 16// Single float literals 17void literal() 18{ 19 const float64_t f64c = 0.000001LF; 20 const f64vec2 f64cv = f64vec2(-0.25lF, 0.03Lf); 21 22 f64vec2 f64v; 23 f64v.x = f64c; 24 f64v += f64cv; 25} 26 27// Block memory layout 28struct S 29{ 30 float64_t x; 31 f64vec2 y; 32 f64vec3 z; 33}; 34 35layout(column_major, std140) uniform B1 36{ 37 float64_t a; 38 f64vec2 b; 39 f64vec3 c; 40 float64_t d[2]; 41 f64mat2x3 e; 42 f64mat2x3 f[2]; 43 S g; 44 S h[2]; 45}; 46 47// Specialization constant 48layout(constant_id = 100) const float16_t sf16 = 0.125hf; 49layout(constant_id = 101) const float32_t sf = 0.25; 50layout(constant_id = 102) const float64_t sd = 0.5lf; 51 52const float f16_to_f = float(sf16); 53const double f16_to_d = float(sf16); 54 55const float16_t f_to_f16 = float16_t(sf); 56const float16_t d_to_f16 = float16_t(sd); 57 58void operators() 59{ 60 float64_t f64; 61 f64vec2 f64v; 62 f64mat2x2 f64m; 63 bool b; 64 65 // Arithmetic 66 f64v += f64v; 67 f64v -= f64v; 68 f64v *= f64v; 69 f64v /= f64v; 70 f64v++; 71 f64v--; 72 ++f64m; 73 --f64m; 74 f64v = -f64v; 75 f64m = -f64m; 76 77 f64 = f64v.x + f64v.y; 78 f64 = f64v.x - f64v.y; 79 f64 = f64v.x * f64v.y; 80 f64 = f64v.x / f64v.y; 81 82 // Relational 83 b = (f64v.x != f64); 84 b = (f64v.y == f64); 85 b = (f64v.x > f64); 86 b = (f64v.y < f64); 87 b = (f64v.x >= f64); 88 b = (f64v.y <= f64); 89 90 // Vector/matrix operations 91 f64v = f64v * f64; 92 f64m = f64m * f64; 93 f64v = f64m * f64v; 94 f64v = f64v * f64m; 95 f64m = f64m * f64m; 96} 97 98void typeCast() 99{ 100 bvec3 bv; 101 f32vec3 f32v; 102 f64vec3 f64v; 103 i8vec3 i8v; 104 u8vec3 u8v; 105 i16vec3 i16v; 106 u16vec3 u16v; 107 i32vec3 i32v; 108 u32vec3 u32v; 109 i64vec3 i64v; 110 u64vec3 u64v; 111 f16vec3 f16v; 112 113 f64v = f64vec3(bv); // bool -> float64 114 bv = bvec3(f64v); // float64 -> bool 115 116 f64v = f64vec3(f16v); // float16 -> float64 117 f16v = f16vec3(f64v); // float64 -> float16 118 119 i8v = i8vec3(f64v); // float64 -> int8 120 i16v = i16vec3(f64v); // float64 -> int16 121 i32v = i32vec3(f64v); // float64 -> int32 122 i64v = i64vec3(f64v); // float64 -> int64 123 124 u8v = u8vec3(f64v); // float64 -> uint8 125 u16v = u16vec3(f64v); // float64 -> uint16 126 u32v = u32vec3(f64v); // float64 -> uint32 127 u64v = u64vec3(f64v); // float64 -> uint64 128} 129 130void builtinAngleTrigFuncs() 131{ 132 f64vec4 f64v1, f64v2; 133 134 f64v2 = radians(f64v1); 135 f64v2 = degrees(f64v1); 136 f64v2 = sin(f64v1); 137 f64v2 = cos(f64v1); 138 f64v2 = tan(f64v1); 139 f64v2 = asin(f64v1); 140 f64v2 = acos(f64v1); 141 f64v2 = atan(f64v1, f64v2); 142 f64v2 = atan(f64v1); 143 f64v2 = sinh(f64v1); 144 f64v2 = cosh(f64v1); 145 f64v2 = tanh(f64v1); 146 f64v2 = asinh(f64v1); 147 f64v2 = acosh(f64v1); 148 f64v2 = atanh(f64v1); 149} 150 151void builtinExpFuncs() 152{ 153 f64vec2 f64v1, f64v2; 154 155 f64v2 = pow(f64v1, f64v2); 156 f64v2 = exp(f64v1); 157 f64v2 = log(f64v1); 158 f64v2 = exp2(f64v1); 159 f64v2 = log2(f64v1); 160 f64v2 = sqrt(f64v1); 161 f64v2 = inversesqrt(f64v1); 162} 163 164void builtinCommonFuncs() 165{ 166 f64vec3 f64v1, f64v2, f64v3; 167 float64_t f64; 168 bool b; 169 bvec3 bv; 170 ivec3 iv; 171 172 f64v2 = abs(f64v1); 173 f64v2 = sign(f64v1); 174 f64v2 = floor(f64v1); 175 f64v2 = trunc(f64v1); 176 f64v2 = round(f64v1); 177 f64v2 = roundEven(f64v1); 178 f64v2 = ceil(f64v1); 179 f64v2 = fract(f64v1); 180 f64v2 = mod(f64v1, f64v2); 181 f64v2 = mod(f64v1, f64); 182 f64v3 = modf(f64v1, f64v2); 183 f64v3 = min(f64v1, f64v2); 184 f64v3 = min(f64v1, f64); 185 f64v3 = max(f64v1, f64v2); 186 f64v3 = max(f64v1, f64); 187 f64v3 = clamp(f64v1, f64, f64v2.x); 188 f64v3 = clamp(f64v1, f64v2, f64vec3(f64)); 189 f64v3 = mix(f64v1, f64v2, f64); 190 f64v3 = mix(f64v1, f64v2, f64v3); 191 f64v3 = mix(f64v1, f64v2, bv); 192 f64v3 = step(f64v1, f64v2); 193 f64v3 = step(f64, f64v3); 194 f64v3 = smoothstep(f64v1, f64v2, f64v3); 195 f64v3 = smoothstep(f64, f64v1.x, f64v2); 196 b = isnan(f64); 197 bv = isinf(f64v1); 198 f64v3 = fma(f64v1, f64v2, f64v3); 199 f64v2 = frexp(f64v1, iv); 200 f64v2 = ldexp(f64v1, iv); 201} 202 203void builtinGeometryFuncs() 204{ 205 float64_t f64; 206 f64vec3 f64v1, f64v2, f64v3; 207 208 f64 = length(f64v1); 209 f64 = distance(f64v1, f64v2); 210 f64 = dot(f64v1, f64v2); 211 f64v3 = cross(f64v1, f64v2); 212 f64v2 = normalize(f64v1); 213 f64v3 = faceforward(f64v1, f64v2, f64v3); 214 f64v3 = reflect(f64v1, f64v2); 215 f64v3 = refract(f64v1, f64v2, f64); 216} 217 218void builtinMatrixFuncs() 219{ 220 f64mat2x3 f64m1, f64m2, f64m3; 221 f64mat3x2 f64m4; 222 f64mat3 f64m5; 223 f64mat4 f64m6, f64m7; 224 225 f64vec3 f64v1; 226 f64vec2 f64v2; 227 228 float64_t f64; 229 230 f64m3 = matrixCompMult(f64m1, f64m2); 231 f64m1 = outerProduct(f64v1, f64v2); 232 f64m4 = transpose(f64m1); 233 f64 = determinant(f64m5); 234 f64m6 = inverse(f64m7); 235} 236 237void builtinVecRelFuncs() 238{ 239 f64vec3 f64v1, f64v2; 240 bvec3 bv; 241 242 bv = lessThan(f64v1, f64v2); 243 bv = lessThanEqual(f64v1, f64v2); 244 bv = greaterThan(f64v1, f64v2); 245 bv = greaterThanEqual(f64v1, f64v2); 246 bv = equal(f64v1, f64v2); 247 bv = notEqual(f64v1, f64v2); 248} 249 250in flat f64vec3 if64v; 251 252void builtinFragProcFuncs() 253{ 254 f64vec3 f64v; 255 256 // Derivative 257 f64v.x = dFdx(if64v.x); 258 f64v.y = dFdy(if64v.y); 259 f64v.xy = dFdxFine(if64v.xy); 260 f64v.xy = dFdyFine(if64v.xy); 261 f64v = dFdxCoarse(if64v); 262 f64v = dFdxCoarse(if64v); 263 264 f64v.x = fwidth(if64v.x); 265 f64v.xy = fwidthFine(if64v.xy); 266 f64v = fwidthCoarse(if64v); 267 268 // Interpolation 269 f64v.x = interpolateAtCentroid(if64v.x); 270 f64v.xy = interpolateAtSample(if64v.xy, 1); 271 f64v = interpolateAtOffset(if64v, f64vec2(0.5f)); 272} 273