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 float32_t f32c = 0.000001f; 20 const f32vec2 f32cv = f32vec2(-0.25F, 0.03f); 21 22 f32vec2 f32v; 23 f32v.x = f32c; 24 f32v += f32cv; 25} 26 27// Block memory layout 28struct S 29{ 30 float32_t x; 31 f32vec2 y; 32 f32vec3 z; 33}; 34 35layout(column_major, std140) uniform B1 36{ 37 float32_t a; 38 f32vec2 b; 39 f32vec3 c; 40 float32_t d[2]; 41 f32mat2x3 e; 42 f32mat2x3 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 float32_t f32; 61 f32vec2 f32v; 62 f32mat2x2 f32m; 63 bool b; 64 65 // Arithmetic 66 f32v += f32v; 67 f32v -= f32v; 68 f32v *= f32v; 69 f32v /= f32v; 70 f32v++; 71 f32v--; 72 ++f32m; 73 --f32m; 74 f32v = -f32v; 75 f32m = -f32m; 76 77 f32 = f32v.x + f32v.y; 78 f32 = f32v.x - f32v.y; 79 f32 = f32v.x * f32v.y; 80 f32 = f32v.x / f32v.y; 81 82 // Relational 83 b = (f32v.x != f32); 84 b = (f32v.y == f32); 85 b = (f32v.x > f32); 86 b = (f32v.y < f32); 87 b = (f32v.x >= f32); 88 b = (f32v.y <= f32); 89 90 // Vector/matrix operations 91 f32v = f32v * f32; 92 f32m = f32m * f32; 93 f32v = f32m * f32v; 94 f32v = f32v * f32m; 95 f32m = f32m * f32m; 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 = f32v; // float32_t -> float64_t 114 115 f32v = f32vec3(bv); // bool -> float32 116 bv = bvec3(f32v); // float32 -> bool 117 118 f32v = f32vec3(f64v); // double -> float32 119 f64v = f64vec3(f32v); // float32 -> double 120 121 f32v = f32vec3(f16v); // float16 -> float32 122 f16v = f16vec3(f32v); // float32 -> float16 123 124 i8v = i8vec3(f32v); // float32 -> int8 125 i16v = i16vec3(f32v); // float32 -> int16 126 i32v = i32vec3(f32v); // float32 -> int32 127 i64v = i64vec3(f32v); // float32 -> int64 128 129 u8v = u8vec3(f32v); // float32 -> uint8 130 u16v = u16vec3(f32v); // float32 -> uint16 131 u32v = u32vec3(f32v); // float32 -> uint32 132 u64v = u64vec3(f32v); // float32 -> uint64 133} 134 135void builtinAngleTrigFuncs() 136{ 137 f32vec4 f32v1, f32v2; 138 139 f32v2 = radians(f32v1); 140 f32v2 = degrees(f32v1); 141 f32v2 = sin(f32v1); 142 f32v2 = cos(f32v1); 143 f32v2 = tan(f32v1); 144 f32v2 = asin(f32v1); 145 f32v2 = acos(f32v1); 146 f32v2 = atan(f32v1, f32v2); 147 f32v2 = atan(f32v1); 148 f32v2 = sinh(f32v1); 149 f32v2 = cosh(f32v1); 150 f32v2 = tanh(f32v1); 151 f32v2 = asinh(f32v1); 152 f32v2 = acosh(f32v1); 153 f32v2 = atanh(f32v1); 154} 155 156void builtinExpFuncs() 157{ 158 f32vec2 f32v1, f32v2; 159 160 f32v2 = pow(f32v1, f32v2); 161 f32v2 = exp(f32v1); 162 f32v2 = log(f32v1); 163 f32v2 = exp2(f32v1); 164 f32v2 = log2(f32v1); 165 f32v2 = sqrt(f32v1); 166 f32v2 = inversesqrt(f32v1); 167} 168 169void builtinCommonFuncs() 170{ 171 f32vec3 f32v1, f32v2, f32v3; 172 float32_t f32; 173 bool b; 174 bvec3 bv; 175 ivec3 iv; 176 177 f32v2 = abs(f32v1); 178 f32v2 = sign(f32v1); 179 f32v2 = floor(f32v1); 180 f32v2 = trunc(f32v1); 181 f32v2 = round(f32v1); 182 f32v2 = roundEven(f32v1); 183 f32v2 = ceil(f32v1); 184 f32v2 = fract(f32v1); 185 f32v2 = mod(f32v1, f32v2); 186 f32v2 = mod(f32v1, f32); 187 f32v3 = modf(f32v1, f32v2); 188 f32v3 = min(f32v1, f32v2); 189 f32v3 = min(f32v1, f32); 190 f32v3 = max(f32v1, f32v2); 191 f32v3 = max(f32v1, f32); 192 f32v3 = clamp(f32v1, f32, f32v2.x); 193 f32v3 = clamp(f32v1, f32v2, f32vec3(f32)); 194 f32v3 = mix(f32v1, f32v2, f32); 195 f32v3 = mix(f32v1, f32v2, f32v3); 196 f32v3 = mix(f32v1, f32v2, bv); 197 f32v3 = step(f32v1, f32v2); 198 f32v3 = step(f32, f32v3); 199 f32v3 = smoothstep(f32v1, f32v2, f32v3); 200 f32v3 = smoothstep(f32, f32v1.x, f32v2); 201 b = isnan(f32); 202 bv = isinf(f32v1); 203 f32v3 = fma(f32v1, f32v2, f32v3); 204 f32v2 = frexp(f32v1, iv); 205 f32v2 = ldexp(f32v1, iv); 206} 207 208void builtinGeometryFuncs() 209{ 210 float32_t f32; 211 f32vec3 f32v1, f32v2, f32v3; 212 213 f32 = length(f32v1); 214 f32 = distance(f32v1, f32v2); 215 f32 = dot(f32v1, f32v2); 216 f32v3 = cross(f32v1, f32v2); 217 f32v2 = normalize(f32v1); 218 f32v3 = faceforward(f32v1, f32v2, f32v3); 219 f32v3 = reflect(f32v1, f32v2); 220 f32v3 = refract(f32v1, f32v2, f32); 221} 222 223void builtinMatrixFuncs() 224{ 225 f32mat2x3 f32m1, f32m2, f32m3; 226 f32mat3x2 f32m4; 227 f32mat3 f32m5; 228 f32mat4 f32m6, f32m7; 229 230 f32vec3 f32v1; 231 f32vec2 f32v2; 232 233 float32_t f32; 234 235 f32m3 = matrixCompMult(f32m1, f32m2); 236 f32m1 = outerProduct(f32v1, f32v2); 237 f32m4 = transpose(f32m1); 238 f32 = determinant(f32m5); 239 f32m6 = inverse(f32m7); 240} 241 242void builtinVecRelFuncs() 243{ 244 f32vec3 f32v1, f32v2; 245 bvec3 bv; 246 247 bv = lessThan(f32v1, f32v2); 248 bv = lessThanEqual(f32v1, f32v2); 249 bv = greaterThan(f32v1, f32v2); 250 bv = greaterThanEqual(f32v1, f32v2); 251 bv = equal(f32v1, f32v2); 252 bv = notEqual(f32v1, f32v2); 253} 254 255in f32vec3 if32v; 256 257void builtinFragProcFuncs() 258{ 259 f32vec3 f32v; 260 261 // Derivative 262 f32v.x = dFdx(if32v.x); 263 f32v.y = dFdy(if32v.y); 264 f32v.xy = dFdxFine(if32v.xy); 265 f32v.xy = dFdyFine(if32v.xy); 266 f32v = dFdxCoarse(if32v); 267 f32v = dFdxCoarse(if32v); 268 269 f32v.x = fwidth(if32v.x); 270 f32v.xy = fwidthFine(if32v.xy); 271 f32v = fwidthCoarse(if32v); 272 273 // Interpolation 274 f32v.x = interpolateAtCentroid(if32v.x); 275 f32v.xy = interpolateAtSample(if32v.xy, 1); 276 f32v = interpolateAtOffset(if32v, f32vec2(0.5f)); 277} 278