#version 450 #extension GL_ARB_gpu_shader_int64: enable #extension GL_EXT_shader_explicit_arithmetic_types_int64: require layout(binding = 0) uniform Uniforms { uint index; }; layout(std140, binding = 1) uniform Block { i64vec3 i64v; uint64_t u64; } block; void main() { } void literal() { const int64_t i64Const[3] = { -0x1111111111111111l, // Hex -1l, // Dec 040000000000l, // Oct }; int64_t i64 = i64Const[index]; const uint64_t u64Const[] = { 0xFFFFFFFFFFFFFFFFul, // Hex 4294967296UL, // Dec 077777777777ul, // Oct }; uint64_t u64 = u64Const[index]; } void typeCast() { bvec2 bv; ivec2 iv; uvec2 uv; vec2 fv; dvec2 dv; i64vec2 i64v; u64vec2 u64v; i64v = i64vec2(bv); // bool -> int64 u64v = u64vec2(bv); // bool -> uint64 i64v = iv; // int -> int64 iv = ivec2(i64v); // int64 -> int u64v = uv; // uint -> uint64 uv = uvec2(u64v); // uint64 -> uint fv = vec2(i64v); // int64 -> float dv = i64v; // int64 -> double fv = vec2(u64v); // uint64 -> float dv = u64v; // uint64 -> double i64v = i64vec2(fv); // float -> int64 i64v = i64vec2(dv); // double -> int64 u64v = u64vec2(fv); // float -> uint64 u64v = u64vec2(dv); // double -> uint64 bv = bvec2(i64v); // int64 -> bool bv = bvec2(u64v); // uint64 -> bool u64v = i64v; // int64 -> uint64 i64v = i64vec2(u64v); // uint64 -> int64 uv = uvec2(i64v); // int64 -> uint i64v = i64vec2(uv); // uint -> int64 iv = ivec2(u64v); // uint64 -> int u64v = iv; // int -> uint64 } void operators() { u64vec3 u64v; int64_t i64; uvec3 uv; int i; bool b; // Unary u64v++; i64--; ++i64; --u64v; u64v = ~u64v; i64 = +i64; u64v = -u64v; // Arithmetic i64 += i64; u64v -= u64v; i64 *= i; u64v /= uv; u64v %= i; u64v = u64v + uv; i64 = i64 - i; u64v = u64v * uv; i64 = i64 * i; i64 = i64 % i; // Shift u64v = u64v << i; i64 = i64 >> uv.y; u64v <<= i; i64 >>= uv.y; i64 = i64 << u64v.z; u64v = u64v << i64; // Relational b = (u64v.x != i64); b = (i64 == u64v.x); b = (u64v.x > uv.y); b = (i64 < i); b = (u64v.y >= uv.x); b = (i64 <= i); // Bitwise u64v |= i; i64 = i64 | i; i64 &= i; u64v = u64v & uv; u64v ^= i64; u64v = u64v ^ i64; } void builtinFuncs() { i64vec2 i64v; u64vec3 u64v; dvec3 dv; bvec3 bv; int64_t i64; uint64_t u64; // abs() i64v = abs(i64v); // sign() i64 = sign(i64); // min() i64v = min(i64v, i64); i64v = min(i64v, i64vec2(-1)); u64v = min(u64v, u64); u64v = min(u64v, u64vec3(0)); // max() i64v = max(i64v, i64); i64v = max(i64v, i64vec2(-1)); u64v = max(u64v, u64); u64v = max(u64v, u64vec3(0)); // clamp() i64v = clamp(i64v, -i64, i64); i64v = clamp(i64v, -i64v, i64v); u64v = clamp(u64v, -u64, u64); u64v = clamp(u64v, -u64v, u64v); // mix() i64 = mix(i64v.x, i64v.y, true); i64v = mix(i64vec2(i64), i64vec2(-i64), bvec2(false)); u64 = mix(u64v.x, u64v.y, true); u64v = mix(u64vec3(u64), u64vec3(-u64), bvec3(false)); // doubleBitsToInt64() i64v = doubleBitsToInt64(dv.xy); // doubleBitsToUint64() u64v.x = doubleBitsToUint64(dv.z); // int64BitsToDouble() dv.xy = int64BitsToDouble(i64v); // uint64BitsToDouble() dv = uint64BitsToDouble(u64v); // packInt2x32() i64 = packInt2x32(ivec2(1, 2)); // unpackInt2x32() ivec2 iv = unpackInt2x32(i64); // packUint2x32() u64 = packUint2x32(uvec2(2, 3)); // unpackUint2x32() uvec2 uv = unpackUint2x32(u64); // lessThan() bv = lessThan(u64v, u64vec3(u64)); bv.xy = lessThan(i64v, i64vec2(i64)); // lessThanEqual() bv = lessThanEqual(u64v, u64vec3(u64)); bv.xy = lessThanEqual(i64v, i64vec2(i64)); // greaterThan() bv = greaterThan(u64v, u64vec3(u64)); bv.xy = greaterThan(i64v, i64vec2(i64)); // greaterThanEqual() bv = greaterThanEqual(u64v, u64vec3(u64)); bv.xy = greaterThanEqual(i64v, i64vec2(i64)); // equal() bv = equal(u64v, u64vec3(u64)); bv.xy = equal(i64v, i64vec2(i64)); // notEqual() bv = notEqual(u64v, u64vec3(u64)); bv.xy = notEqual(i64v, i64vec2(i64)); } // Type conversion for specialization constant layout(constant_id = 100) const int64_t si64 = -10L; layout(constant_id = 101) const uint64_t su64 = 20UL; layout(constant_id = 102) const int si = -5; layout(constant_id = 103) const uint su = 4; layout(constant_id = 104) const bool sb = true; layout(constant_id = 105) const uint64_t su64inc = su64 + 1UL; // bool <-> int64/uint64 const bool i64_to_b = bool(si64); const bool u64_to_b = bool(su64); const int64_t b_to_i64 = int64_t(sb); const uint64_t b_to_u64 = uint64_t(sb); // int <-> int64 const int i64_to_i = int(si64); const int64_t i_to_i64 = int64_t(si); // uint <-> uint64 const uint u64_to_u = uint(su64); const uint64_t u_to_u64 = uint64_t(su); // int64 <-> uint64 const int64_t u64_to_i64 = int64_t(su64); const uint64_t i64_to_u64 = uint64_t(si64); // int <-> uint64 const int u64_to_i = int(su64); const uint64_t i_to_u64 = uint64_t(si); // uint <-> int64 const uint i64_to_u = uint(si64); const int64_t u_to_i64 = int64_t(su); #define UINT64_MAX 18446744073709551615ul uint64_t u64Max = UINT64_MAX;