yum-mirror/glslang
git clone https://git.yummers.dev/yum-mirror/glslang
ca70aa31
main
1#version 450 2 3#extension GL_ARB_gpu_shader_int64 : enable 4#extension GL_EXT_shader_explicit_arithmetic_types_int64 : require 5 6layout (binding = 0 )uniform Uniforms 7{ 8uint index ; 9}; 10 11layout (std140 ,binding = 1 )uniform Block 12{ 13i64vec3 i64v ; 14uint64_t u64 ; 15}block ; 16 17void main () 18{ 19} 20 21void literal () 22{ 23const int64_t i64Const [3 ]= 24 { 25-0x1111111111111111l ,// Hex 26-1l ,// Dec 27040000000000l ,// Oct 28 }; 29 30int64_t i64 = i64Const [index ]; 31 32const uint64_t u64Const []= 33 { 340xFFFFFFFFFFFFFFFFul ,// Hex 354294967296UL ,// Dec 36077777777777ul ,// Oct 37 }; 38 39uint64_t u64 = u64Const [index ]; 40} 41 42void typeCast () 43{ 44bvec2 bv ; 45ivec2 iv ; 46uvec2 uv ; 47vec2 fv ; 48dvec2 dv ; 49 50i64vec2 i64v ; 51u64vec2 u64v ; 52 53i64v = i64vec2 (bv );// bool -> int64 54u64v = u64vec2 (bv );// bool -> uint64 55 56i64v = iv ;// int -> int64 57iv = ivec2 (i64v );// int64 -> int 58 59u64v = uv ;// uint -> uint64 60uv = uvec2 (u64v );// uint64 -> uint 61 62fv = vec2 (i64v );// int64 -> float 63dv = i64v ;// int64 -> double 64 65fv = vec2 (u64v );// uint64 -> float 66dv = u64v ;// uint64 -> double 67 68i64v = i64vec2 (fv );// float -> int64 69i64v = i64vec2 (dv );// double -> int64 70 71u64v = u64vec2 (fv );// float -> uint64 72u64v = u64vec2 (dv );// double -> uint64 73 74bv = bvec2 (i64v );// int64 -> bool 75bv = bvec2 (u64v );// uint64 -> bool 76 77u64v = i64v ;// int64 -> uint64 78i64v = i64vec2 (u64v );// uint64 -> int64 79 80uv = uvec2 (i64v );// int64 -> uint 81i64v = i64vec2 (uv );// uint -> int64 82iv = ivec2 (u64v );// uint64 -> int 83u64v = iv ;// int -> uint64 84} 85 86void operators () 87{ 88u64vec3 u64v ; 89int64_t i64 ; 90uvec3 uv ; 91int i ; 92bool b ; 93 94// Unary 95u64v ++ ; 96i64 -- ; 97++ i64 ; 98-- u64v ; 99 100u64v = ~u64v ; 101 102i64 = + i64 ; 103u64v = - u64v ; 104 105// Arithmetic 106i64 += i64 ; 107u64v -= u64v ; 108i64 *=i ; 109u64v /=uv ; 110u64v %=i ; 111 112u64v = u64v + uv ; 113i64 = i64 - i ; 114u64v = u64v * uv ; 115i64 = i64 * i ; 116i64 = i64 %i ; 117 118// Shift 119u64v = u64v <<i ; 120i64 = i64 >>uv .y ; 121u64v <<=i ; 122i64 >>=uv .y ; 123 124i64 = i64 <<u64v .z ; 125u64v = u64v <<i64 ; 126 127// Relational 128b = (u64v .x != i64 ); 129b = (i64 == u64v .x ); 130b = (u64v .x > uv .y ); 131b = (i64 < i ); 132b = (u64v .y >=uv .x ); 133b = (i64 <=i ); 134 135// Bitwise 136u64v |=i ; 137i64 = i64 |i ; 138i64 &=i ; 139u64v = u64v & uv ; 140u64v ^=i64 ; 141u64v = u64v ^i64 ; 142} 143 144void builtinFuncs () 145{ 146i64vec2 i64v ; 147u64vec3 u64v ; 148dvec3 dv ; 149bvec3 bv ; 150 151int64_t i64 ; 152uint64_t u64 ; 153 154// abs() 155i64v = abs (i64v ); 156 157// sign() 158i64 = sign (i64 ); 159 160// min() 161i64v = min (i64v ,i64 ); 162i64v = min (i64v ,i64vec2 (-1 )); 163u64v = min (u64v ,u64 ); 164u64v = min (u64v ,u64vec3 (0 )); 165 166// max() 167i64v = max (i64v ,i64 ); 168i64v = max (i64v ,i64vec2 (-1 )); 169u64v = max (u64v ,u64 ); 170u64v = max (u64v ,u64vec3 (0 )); 171 172// clamp() 173i64v = clamp (i64v ,- i64 ,i64 ); 174i64v = clamp (i64v ,- i64v ,i64v ); 175u64v = clamp (u64v ,- u64 ,u64 ); 176u64v = clamp (u64v ,- u64v ,u64v ); 177 178// mix() 179i64 = mix (i64v .x ,i64v .y , true); 180i64v = mix (i64vec2 (i64 ),i64vec2 (- i64 ),bvec2 (false)); 181u64 = mix (u64v .x ,u64v .y , true); 182u64v = mix (u64vec3 (u64 ),u64vec3 (- u64 ),bvec3 (false)); 183 184// doubleBitsToInt64() 185i64v = doubleBitsToInt64 (dv .xy ); 186 187// doubleBitsToUint64() 188u64v .x = doubleBitsToUint64 (dv .z ); 189 190// int64BitsToDouble() 191dv .xy = int64BitsToDouble (i64v ); 192 193// uint64BitsToDouble() 194dv = uint64BitsToDouble (u64v ); 195 196// packInt2x32() 197i64 = packInt2x32 (ivec2 (1 ,2 )); 198 199// unpackInt2x32() 200ivec2 iv = unpackInt2x32 (i64 ); 201 202// packUint2x32() 203u64 = packUint2x32 (uvec2 (2 ,3 )); 204 205// unpackUint2x32() 206uvec2 uv = unpackUint2x32 (u64 ); 207 208// lessThan() 209bv = lessThan (u64v ,u64vec3 (u64 )); 210bv .xy = lessThan (i64v ,i64vec2 (i64 )); 211 212// lessThanEqual() 213bv = lessThanEqual (u64v ,u64vec3 (u64 )); 214bv .xy = lessThanEqual (i64v ,i64vec2 (i64 )); 215 216// greaterThan() 217bv = greaterThan (u64v ,u64vec3 (u64 )); 218bv .xy = greaterThan (i64v ,i64vec2 (i64 )); 219 220// greaterThanEqual() 221bv = greaterThanEqual (u64v ,u64vec3 (u64 )); 222bv .xy = greaterThanEqual (i64v ,i64vec2 (i64 )); 223 224// equal() 225bv = equal (u64v ,u64vec3 (u64 )); 226bv .xy = equal (i64v ,i64vec2 (i64 )); 227 228// notEqual() 229bv = notEqual (u64v ,u64vec3 (u64 )); 230bv .xy = notEqual (i64v ,i64vec2 (i64 )); 231 232// findLSB() 233i64 = findLSB (u64 ); 234i64v = findLSB (u64vec2 (u64 )); 235 236// bitCount() 237i64 = bitCount (u64 ); 238i64v = bitCount (u64vec2 (u64 )); 239} 240 241// Type conversion for specialization constant 242layout (constant_id = 100 )const int64_t si64 = -10L ; 243layout (constant_id = 101 )const uint64_t su64 = 20UL ; 244layout (constant_id = 102 )const int si = -5 ; 245layout (constant_id = 103 )const uint su = 4 ; 246layout (constant_id = 104 )const bool sb = true; 247const uint64_t su64inc = su64 + 1UL ; 248 249// bool <-> int64/uint64 250const bool i64_to_b = bool (si64 ); 251const bool u64_to_b = bool (su64 ); 252const int64_t b_to_i64 = int64_t (sb ); 253const uint64_t b_to_u64 = uint64_t (sb ); 254 255// int <-> int64 256const int i64_to_i = int (si64 ); 257const int64_t i_to_i64 = int64_t (si ); 258 259// uint <-> uint64 260const uint u64_to_u = uint (su64 ); 261const uint64_t u_to_u64 = uint64_t (su ); 262 263// int64 <-> uint64 264const int64_t u64_to_i64 = int64_t (su64 ); 265const uint64_t i64_to_u64 = uint64_t (si64 ); 266 267// int <-> uint64 268const int u64_to_i = int (su64 ); 269const uint64_t i_to_u64 = uint64_t (si ); 270 271// uint <-> int64 272const uint i64_to_u = uint (si64 ); 273const int64_t u_to_i64 = int64_t (su ); 274 275#define UINT64_MAX 18446744073709551615ul 276uint64_t u64Max = UINT64_MAX ;