yum-mirror/glslang
git clone https://git.yummers.dev/yum-mirror/glslang
dd2fc1f3
main
1#version 450 core 2 3#extension GL_AMD_gpu_shader_half_float : enable 4#extension GL_ARB_gpu_shader_int64 : enable 5 6void main () 7{ 8} 9 10// Half float literals 11void literal () 12{ 13const float16_t f16c = 0.000001 hf ; 14const f16vec2 f16cv = f16vec2 (-0.25 HF ,0.03 HF ); 15 16f16vec2 f16v ; 17f16v .x = f16c ; 18f16v += f16cv ; 19} 20 21// Block memory layout 22struct S 23{ 24float16_t x ;// rule 1: align = 2, takes offsets 0-1 25f16vec2 y ;// rule 2: align = 4, takes offsets 4-7 26f16vec3 z ;// rule 3: align = 8, takes offsets 8-13 27}; 28 29layout (column_major ,std140 )uniform B1 30{ 31float16_t a ;// rule 1: align = 2, takes offsets 0-1 32f16vec2 b ;// rule 2: align = 4, takes offsets 4-7 33f16vec3 c ;// rule 3: align = 8, takes offsets 8-15 34float16_t d [2 ];// rule 4: align = 16, array stride = 16, 35// takes offsets 16-47 36f16mat2x3 e ;// rule 5: align = 16, matrix stride = 16, 37// takes offsets 48-79 38f16mat2x3 f [2 ];// rule 6: align = 16, matrix stride = 16, 39// array stride = 32, f[0] takes 40// offsets 80-111, f[1] takes offsets 41// 112-143 42S g ;// rule 9: align = 16, g.x takes offsets 43// 144-145, g.y takes offsets 148-151, 44// g.z takes offsets 152-159 45S h [2 ];// rule 10: align = 16, array stride = 16, h[0] 46// takes offsets 160-175, h[1] takes 47// offsets 176-191 48}; 49 50layout (row_major ,std430 )buffer B2 51{ 52float16_t o ;// rule 1: align = 2, takes offsets 0-1 53f16vec2 p ;// rule 2: align = 4, takes offsets 4-7 54f16vec3 q ;// rule 3: align = 8, takes offsets 8-13 55float16_t r [2 ];// rule 4: align = 2, array stride = 2, takes 56// offsets 14-17 57f16mat2x3 s ;// rule 7: align = 4, matrix stride = 4, takes 58// offsets 20-31 59f16mat2x3 t [2 ];// rule 8: align = 4, matrix stride = 4, array 60// stride = 12, t[0] takes offsets 61// 32-43, t[1] takes offsets 44-55 62S u ;// rule 9: align = 8, u.x takes offsets 63// 56-57, u.y takes offsets 60-63, u.z 64// takes offsets 64-69 65S v [2 ];// rule 10: align = 8, array stride = 16, v[0] 66// takes offsets 72-87, v[1] takes 67// offsets 88-103 68}; 69 70// Specialization constant 71layout (constant_id = 100 )const float16_t sf16 = 0.125 hf ; 72layout (constant_id = 101 )const float sf = 0.25 ; 73layout (constant_id = 102 )const double sd = 0.5lf ; 74 75const float f16_to_f = float (sf16 ); 76const double f16_to_d = float (sf16 ); 77 78const float16_t f_to_f16 = float16_t (sf ); 79const float16_t d_to_f16 = float16_t (sd ); 80 81void operators () 82{ 83float16_t f16 ; 84f16vec2 f16v ; 85f16mat2x2 f16m ; 86bool b ; 87 88// Arithmetic 89f16v += f16v ; 90f16v -= f16v ; 91f16v *=f16v ; 92f16v /=f16v ; 93f16v ++ ; 94f16v -- ; 95++ f16m ; 96-- f16m ; 97f16v = - f16v ; 98f16m = - f16m ; 99 100f16 = f16v .x + f16v .y ; 101f16 = f16v .x - f16v .y ; 102f16 = f16v .x * f16v .y ; 103f16 = f16v .x /f16v .y ; 104 105// Relational 106b = (f16v .x != f16 ); 107b = (f16v .y == f16 ); 108b = (f16v .x > f16 ); 109b = (f16v .y < f16 ); 110b = (f16v .x >=f16 ); 111b = (f16v .y <=f16 ); 112 113// Vector/matrix operations 114f16v = f16v * f16 ; 115f16m = f16m * f16 ; 116f16v = f16m * f16v ; 117f16v = f16v * f16m ; 118f16m = f16m * f16m ; 119} 120 121void typeCast () 122{ 123bvec3 bv ; 124vec3 fv ; 125dvec3 dv ; 126ivec3 iv ; 127uvec3 uv ; 128i64vec3 i64v ; 129u64vec3 u64v ; 130 131f16vec3 f16v ; 132 133f16v = f16vec3 (bv );// bool -> float16 134bv = bvec3 (f16v );// float16 -> bool 135 136f16v = f16vec3 (fv );// float -> float16 137fv = vec3 (f16v );// float16 -> float 138 139f16v = f16vec3 (dv );// double -> float16 140dv = dvec3 (dv );// float16 -> double 141 142f16v = f16vec3 (iv );// int -> float16 143iv = ivec3 (f16v );// float16 -> int 144 145f16v = f16vec3 (uv );// uint -> float16 146uv = uvec3 (f16v );// float16 -> uint 147 148f16v = f16vec3 (i64v );// int64 -> float16 149i64v = i64vec3 (f16v );// float16 -> int64 150 151f16v = f16vec3 (u64v );// uint64 -> float16 152u64v = u64vec3 (f16v );// float16 -> uint64 153} 154 155void builtinAngleTrigFuncs () 156{ 157f16vec4 f16v1 ,f16v2 ; 158 159f16v2 = radians (f16v1 ); 160f16v2 = degrees (f16v1 ); 161f16v2 = sin (f16v1 ); 162f16v2 = cos (f16v1 ); 163f16v2 = tan (f16v1 ); 164f16v2 = asin (f16v1 ); 165f16v2 = acos (f16v1 ); 166f16v2 = atan (f16v1 ,f16v2 ); 167f16v2 = atan (f16v1 ); 168f16v2 = sinh (f16v1 ); 169f16v2 = cosh (f16v1 ); 170f16v2 = tanh (f16v1 ); 171f16v2 = asinh (f16v1 ); 172f16v2 = acosh (f16v1 ); 173f16v2 = atanh (f16v1 ); 174} 175 176void builtinExpFuncs () 177{ 178f16vec2 f16v1 ,f16v2 ; 179 180f16v2 = pow (f16v1 ,f16v2 ); 181f16v2 = exp (f16v1 ); 182f16v2 = log (f16v1 ); 183f16v2 = exp2 (f16v1 ); 184f16v2 = log2 (f16v1 ); 185f16v2 = sqrt (f16v1 ); 186f16v2 = inversesqrt (f16v1 ); 187} 188 189void builtinCommonFuncs () 190{ 191f16vec3 f16v1 ,f16v2 ,f16v3 ; 192float16_t f16 ; 193bool b ; 194bvec3 bv ; 195ivec3 iv ; 196 197f16v2 = abs (f16v1 ); 198f16v2 = sign (f16v1 ); 199f16v2 = floor (f16v1 ); 200f16v2 = trunc (f16v1 ); 201f16v2 = round (f16v1 ); 202f16v2 = roundEven (f16v1 ); 203f16v2 = ceil (f16v1 ); 204f16v2 = fract (f16v1 ); 205f16v2 = mod (f16v1 ,f16v2 ); 206f16v2 = mod (f16v1 ,f16 ); 207f16v3 = modf (f16v1 ,f16v2 ); 208f16v3 = min (f16v1 ,f16v2 ); 209f16v3 = min (f16v1 ,f16 ); 210f16v3 = max (f16v1 ,f16v2 ); 211f16v3 = max (f16v1 ,f16 ); 212f16v3 = clamp (f16v1 ,f16 ,f16v2 .x ); 213f16v3 = clamp (f16v1 ,f16v2 ,f16vec3 (f16 )); 214f16v3 = mix (f16v1 ,f16v2 ,f16 ); 215f16v3 = mix (f16v1 ,f16v2 ,f16v3 ); 216f16v3 = mix (f16v1 ,f16v2 ,bv ); 217f16v3 = step (f16v1 ,f16v2 ); 218f16v3 = step (f16 ,f16v3 ); 219f16v3 = smoothstep (f16v1 ,f16v2 ,f16v3 ); 220f16v3 = smoothstep (f16 ,f16v1 .x ,f16v2 ); 221b = isnan (f16 ); 222bv = isinf (f16v1 ); 223f16v3 = fma (f16v1 ,f16v2 ,f16v3 ); 224f16v2 = frexp (f16v1 ,iv ); 225f16v2 = ldexp (f16v1 ,iv ); 226} 227 228void builtinPackUnpackFuncs () 229{ 230uint u ; 231f16vec2 f16v ; 232 233u = packFloat2x16 (f16v ); 234f16v = unpackFloat2x16 (u ); 235} 236 237void builtinGeometryFuncs () 238{ 239float16_t f16 ; 240f16vec3 f16v1 ,f16v2 ,f16v3 ; 241 242f16 = length (f16v1 ); 243f16 = distance (f16v1 ,f16v2 ); 244f16 = dot (f16v1 ,f16v2 ); 245f16v3 = cross (f16v1 ,f16v2 ); 246f16v2 = normalize (f16v1 ); 247f16v3 = faceforward (f16v1 ,f16v2 ,f16v3 ); 248f16v3 = reflect (f16v1 ,f16v2 ); 249f16v3 = refract (f16v1 ,f16v2 ,f16 ); 250} 251 252void builtinMatrixFuncs () 253{ 254f16mat2x3 f16m1 ,f16m2 ,f16m3 ; 255f16mat3x2 f16m4 ; 256f16mat3 f16m5 ; 257f16mat4 f16m6 ,f16m7 ; 258 259f16vec3 f16v1 ; 260f16vec2 f16v2 ; 261 262float16_t f16 ; 263 264f16m3 = matrixCompMult (f16m1 ,f16m2 ); 265f16m1 = outerProduct (f16v1 ,f16v2 ); 266f16m4 = transpose (f16m1 ); 267f16 = determinant (f16m5 ); 268f16m6 = inverse (f16m7 ); 269} 270 271void builtinVecRelFuncs () 272{ 273f16vec3 f16v1 ,f16v2 ; 274bvec3 bv ; 275 276bv = lessThan (f16v1 ,f16v2 ); 277bv = lessThanEqual (f16v1 ,f16v2 ); 278bv = greaterThan (f16v1 ,f16v2 ); 279bv = greaterThanEqual (f16v1 ,f16v2 ); 280bv = equal (f16v1 ,f16v2 ); 281bv = notEqual (f16v1 ,f16v2 ); 282} 283 284in f16vec3 if16v ; 285 286void builtinFragProcFuncs () 287{ 288f16vec3 f16v ; 289 290// Derivative 291f16v .x = dFdx (if16v .x ); 292f16v .y = dFdy (if16v .y ); 293f16v .xy = dFdxFine (if16v .xy ); 294f16v .xy = dFdyFine (if16v .xy ); 295f16v = dFdxCoarse (if16v ); 296f16v = dFdxCoarse (if16v ); 297 298f16v .x = fwidth (if16v .x ); 299f16v .xy = fwidthFine (if16v .xy ); 300f16v = fwidthCoarse (if16v ); 301 302// Interpolation 303f16v .x = interpolateAtCentroid (if16v .x ); 304f16v .xy = interpolateAtSample (if16v .xy ,1 ); 305f16v = interpolateAtOffset (if16v ,f16vec2 (0.5 hf )); 306}