#version 450 core #extension GL_ARB_gpu_shader_int64: enable #extension GL_AMD_gpu_shader_half_float: enable #extension GL_AMD_gpu_shader_int16: enable layout(binding = 0) uniform Uniforms { uint i; }; // int16/uint16 in block layout(std140, binding = 1) uniform Block { i16vec3 i16v; uint16_t u16; } block; // int16/uint16 for input layout(location = 0) in flat u16vec3 iu16v; layout(location = 1) in flat int16_t ii16; void literal() { const int16_t i16c[3] = { 0x111S, // Hex -2s, // Dec 0400s, // Oct }; const uint16_t u16c[] = { 0xFFFFus, // Hex 65535US, // Dec 0177777us, // Oct }; uint16_t u16 = i16c[i] + u16c[i]; } void operators() { u16vec3 u16v; int16_t i16; uint16_t u16; int i; uint u; bool b; // Unary u16v++; i16--; ++i16; --u16v; u16v = ~u16v; i16 = +i16; u16v = -u16v; // Arithmetic u16 += i16; u16v -= u16v; i16 *= i16; u16v /= u16v; u16v %= i16; u16v = u16v + u16v; u16 = i16 - u16; u16v = u16v * i16; i16 = i16 * i16; i16 = i16 % i16; // Shift u16v <<= i16; i16 >>= u16v.y; i16 = i16 << u16v.z; u16v = u16v << i16; // Relational b = (u16v.x != i16); b = (i16 == u16v.x); b = (u16v.x > u16v.y); b = (i16 < u); b = (u16v.y >= u16v.x); b = (i16 <= i); // Bitwise u16v |= i16; u16 = i16 | u16; i16 &= i16; u16v = u16v & u16v; u16v ^= i16; u16v = u16v ^ i16; } void typeCast() { bvec2 bv; ivec2 iv; uvec2 uv; vec2 fv; dvec2 dv; f16vec2 f16v; i64vec2 i64v; u64vec2 u64v; i16vec2 i16v; u16vec2 u16v; i16v = i16vec2(bv); // bool -> int16 u16v = u16vec2(bv); // bool -> uint16 bv = bvec2(i16v); // int16 -> bool bv = bvec2(u16v); // uint16 -> bool i16v = i16vec2(iv); // int -> int16 u16v = u16vec2(iv); // int -> uint16 iv = i16v; // int16 -> int iv = ivec2(u16v); // uint16 -> int i16v = i16vec2(uv); // uint -> int16 u16v = u16vec2(uv); // uint -> uint16 uv = i16v; // int16 -> uint uv = u16v; // uint16 -> uint i16v = i16vec2(fv); // float -> int16 u16v = u16vec2(fv); // float -> uint16 fv = i16v; // int16 -> float fv = u16v; // uint16 -> float i16v = i16vec2(dv); // double -> int16 u16v = u16vec2(dv); // double -> uint16 dv = i16v; // int16 -> double dv = u16v; // uint16 -> double i16v = i16vec2(f16v); // float16 -> int16 u16v = u16vec2(f16v); // float16 -> uint16 f16v = i16v; // int16 -> float16 f16v = u16v; // uint16 -> float16 i16v = i16vec2(i64v); // int64 -> int16 u16v = u16vec2(i64v); // int64 -> uint16 i64v = i16v; // int16 -> int64 i64v = i64vec2(u16v); // uint16 -> int64 i16v = i16vec2(u64v); // uint64 -> int16 u16v = u16vec2(u64v); // uint64 -> uint16 u64v = i16v; // int16 -> uint64 u64v = u16v; // uint16 -> uint64 i16v = i16vec2(u16v); // uint16 -> int16 u16v = i16v; // int16 -> uint16 } void builtinFuncs() { i16vec2 i16v; u16vec3 u16v; f16vec3 f16v; bvec3 bv; int16_t i16; uint16_t u16; // abs() i16v = abs(i16v); // sign() i16v = sign(i16v); // min() i16v = min(i16v, i16); i16v = min(i16v, i16vec2(-1s)); u16v = min(u16v, u16); u16v = min(u16v, u16vec3(0us)); // max() i16v = max(i16v, i16); i16v = max(i16v, i16vec2(-1s)); u16v = max(u16v, u16); u16v = max(u16v, u16vec3(0us)); // clamp() i16v = clamp(i16v, -i16, i16); i16v = clamp(i16v, -i16v, i16v); u16v = clamp(u16v, -u16, u16); u16v = clamp(u16v, -u16v, u16v); // mix() i16 = mix(i16v.x, i16v.y, true); i16v = mix(i16vec2(i16), i16vec2(-i16), bvec2(false)); u16 = mix(u16v.x, u16v.y, true); u16v = mix(u16vec3(u16), u16vec3(-u16), bvec3(false)); // frexp() i16vec3 exp; f16v = frexp(f16v, exp); // ldexp() f16v = ldexp(f16v, exp); // float16BitsToInt16() i16v = float16BitsToInt16(f16v.xy); // float16BitsToUint16() u16v.x = float16BitsToUint16(f16v.z); // int16BitsToFloat16() f16v.xy = int16BitsToFloat16(i16v); // uint16BitsToFloat16() f16v = uint16BitsToFloat16(u16v); // packInt2x16() int packi = packInt2x16(i16v); // unpackInt2x16() i16v = unpackInt2x16(packi); // packUint2x16() uint packu = packUint2x16(u16v.xy); // unpackUint2x16() u16v.xy = unpackUint2x16(packu); // packInt4x16() int64_t packi64 = packInt4x16(i16vec4(i16)); // unpackInt4x16() i16v = unpackInt4x16(packi64).xy; // packUint4x16() uint64_t packu64 = packUint4x16(u16vec4(u16)); // unpackUint4x16() u16v = unpackUint4x16(packu64).xyz; // lessThan() bv = lessThan(u16v, u16vec3(u16)); bv.xy = lessThan(i16v, i16vec2(i16)); // lessThanEqual() bv = lessThanEqual(u16v, u16vec3(u16)); bv.xy = lessThanEqual(i16v, i16vec2(i16)); // greaterThan() bv = greaterThan(u16v, u16vec3(u16)); bv.xy = greaterThan(i16v, i16vec2(i16)); // greaterThanEqual() bv = greaterThanEqual(u16v, u16vec3(u16)); bv.xy = greaterThanEqual(i16v, i16vec2(i16)); // equal() bv = equal(u16v, u16vec3(u16)); bv.xy = equal(i16v, i16vec2(i16)); // notEqual() bv = notEqual(u16v, u16vec3(u16)); bv.xy = notEqual(i16v, i16vec2(i16)); } // 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 int16_t si16 = -5S; layout(constant_id = 106) const uint16_t su16 = 4US; // bool <-> int16/uint16 const bool i16_to_b = bool(si16); const bool u16_to_b = bool(su16); const int16_t b_to_i16 = int16_t(sb); const uint16_t b_to_u16 = uint16_t(sb); // int <-> int16/uint16 const int i16_to_i = int(si16); const int u16_to_i = int(su16); const int16_t i_to_i16 = int16_t(si); const uint16_t i_to_u16 = uint16_t(si); // uint <-> int16/uint16 const uint i16_to_u = uint(si16); const uint u16_to_u = uint(su16); const int16_t u_to_i16 = int16_t(su); const uint16_t u_to_u16 = uint16_t(su); // int64 <-> int16/uint16 const int64_t i16_to_i64 = int64_t(si16); const int64_t u16_to_i64 = int64_t(su16); const int16_t i64_to_i16 = int16_t(si64); const uint16_t i64_to_u16 = uint16_t(si64); // uint64 <-> int16/uint16 const uint64_t i16_to_u64 = uint64_t(si16); const uint64_t u16_to_u64 = uint64_t(su16); const int16_t u64_to_i16 = int16_t(su64); const uint16_t u64_to_u16 = uint16_t(su64); // int16 <-> uint16 const uint16_t i16_to_u16 = uint16_t(si16); const int16_t u16_to_i16 = int16_t(su16); void main() { literal(); operators(); typeCast(); builtinFuncs(); }