#version 450 #extension GL_EXT_shader_explicit_arithmetic_types: enable #extension GL_EXT_shader_explicit_arithmetic_types_int8: require #extension GL_EXT_shader_explicit_arithmetic_types_int16: require #extension GL_EXT_shader_explicit_arithmetic_types_int32: require #extension GL_EXT_shader_explicit_arithmetic_types_int64: require #extension GL_EXT_shader_explicit_arithmetic_types_float16: require #extension GL_EXT_shader_explicit_arithmetic_types_float32: require #extension GL_EXT_shader_explicit_arithmetic_types_float64: require layout(binding = 0) uniform Uniforms { uint index; }; layout(std140, binding = 1) uniform Block { int8_t i8; i8vec2 i8v2; i8vec3 i8v3; i8vec4 i8v4; uint8_t u8; u8vec2 u8v2; u8vec3 u8v3; u8vec4 u8v4; } block; void main() { } void literal() { const int8_t i8Const[3] = { int8_t(-0x11), // Hex int8_t(-1), // Dec int8_t(0400), // Oct }; int8_t i8 = i8Const[index]; const uint8_t u8Const[] = { uint8_t(0xFF), // Hex uint8_t(255), // Dec uint8_t(0177), // Oct }; uint8_t u8 = u8Const[index]; } void typeCast8() { i8vec2 i8v; u8vec2 u8v; i16vec2 i16v; u16vec2 u16v; i32vec2 i32v; u32vec2 u32v; i64vec2 i64v; u64vec2 u64v; f16vec2 f16v; f32vec2 f32v; f64vec2 f64v; bvec2 bv; u8v = i8v; // int8_t -> uint8_t i16v = i8v; // int8_t -> int16_t i16v = u8v; // uint8_t -> int16_t i32v = i8v; // int8_t -> int32_t i32v = u8v; // uint8_t -> int32_t u32v = i8v; // int8_t -> uint32_t i64v = i8v; // int8_t -> int64_t u64v = i8v; // int8_t -> uint64_t u32v = u8v; // uint8_t -> uint32_t i64v = u8v; // uint8_t -> int64_t u64v = u8v; // uint8_t -> uint64_t f16v = i8v; // int8_t -> float16_t f32v = i8v; // int8_t -> float32_t f64v = i8v; // int8_t -> float64_t f16v = u8v; // uint8_t -> float16_t f32v = u8v; // uint8_t -> float32_t f64v = u8v; // uint8_t -> float64_t i8v = i8vec2(u8v); // uint8_t -> int8_t i16v = i16vec2(i8v); // int8_t -> int16_t i16v = i16vec2(u8v); // uint8_t -> int16_t i32v = i32vec2(i8v); // int8_t -> int32_t i32v = i32vec2(u8v); // uint8_t -> int32_t i64v = i64vec2(i8v); // int8_t -> int64_t u64v = i64vec2(i8v); // int8_t -> uint64_t u16v = u16vec2(i8v); // int8_t -> uint16_t u16v = u16vec2(u8v); // uint8_t -> uint16_t u32v = u32vec2(u8v); // uint8_t -> uint32_t i64v = i64vec2(u8v); // uint8_t -> int64_t u64v = i64vec2(u8v); // uint8_t -> uint64_t f16v = f16vec2(i8v); // int8_t -> float16_t f32v = f32vec2(i8v); // int8_t -> float32_t f64v = f64vec2(i8v); // int8_t -> float64_t f16v = f16vec2(u8v); // uint8_t -> float16_t f32v = f32vec2(u8v); // uint8_t -> float32_t f64v = f64vec2(u8v); // uint8_t -> float64_t i8v = i8vec2(bv); // bool -> int8 u8v = u8vec2(bv); // bool -> uint8 bv = bvec2(i8v); // int8 -> bool bv = bvec2(u8v); // uint8 -> bool } void operators() { u8vec3 u8v; int8_t i8; uvec3 uv; int32_t i; int16_t i16; bool b; // Unary u8v++; i8--; ++i8; --u8v; u8v = ~u8v; i8 = +i8; u8v = -u8v; // Arithmetic i8 += i8; u8v -= u8v; i *= i8; uv /= u8v; uv %= i8; uv = u8v + uv; i16 = i8 - i16; uv = u8v * uv; i16 = i8 * i16; i = i8 % i; // Shift u8v <<= i8; i8 >>= u8v.y; i8 = i8 << u8v.z; u8v = u8v << i8; // Relational b = (u8v.x != i8); b = (i8 == u8v.x); b = (u8v.x > uv.y); b = (i8 < i); b = (u8v.y >= uv.x); b = (i8 <= i); // Bitwise uv |= i8; i = i8 | i; i16 &= i8; uv = u8v & uv; uv ^= i8; u8v = u8v ^ i8; } void builtinFuncs() { i8vec2 i8v; i8vec4 i8v4; u8vec3 u8v; u8vec2 u8v2; u8vec4 u8v4; bvec3 bv; int16_t i16; int32_t i32; uint16_t u16; uint32_t u32; int8_t i8; uint8_t u8; // abs() i8v = abs(i8v); // sign() i8 = sign(i8); // min() i8v = min(i8v, i8); i8v = min(i8v, i8vec2(-1)); u8v = min(u8v, u8); u8v = min(u8v, u8vec3(0)); // max() i8v = max(i8v, i8); i8v = max(i8v, i8vec2(-1)); u8v = max(u8v, u8); u8v = max(u8v, u8vec3(0)); // clamp() i8v = clamp(i8v, -i8, i8); i8v = clamp(i8v, -i8v, i8v); u8v = clamp(u8v, -u8, u8); u8v = clamp(u8v, -u8v, u8v); // mix() i8 = mix(i8v.x, i8v.y, true); i8v = mix(i8vec2(i8), i8vec2(-i8), bvec2(false)); u8 = mix(u8v.x, u8v.y, true); u8v = mix(u8vec3(u8), u8vec3(-u8), bvec3(false)); //pack i16 = pack16(i8v); i32 = pack32(i8v4); u16 = pack16(u8v2); u32 = pack32(u8v4); i8v = unpack8(i16); i8v4 = unpack8(i32); u8v2 = unpack8(u16); u8v4 = unpack8(u32); // lessThan() bv = lessThan(u8v, u8vec3(u8)); bv.xy = lessThan(i8v, i8vec2(i8)); // lessThanEqual() bv = lessThanEqual(u8v, u8vec3(u8)); bv.xy = lessThanEqual(i8v, i8vec2(i8)); // greaterThan() bv = greaterThan(u8v, u8vec3(u8)); bv.xy = greaterThan(i8v, i8vec2(i8)); // greaterThanEqual() bv = greaterThanEqual(u8v, u8vec3(u8)); bv.xy = greaterThanEqual(i8v, i8vec2(i8)); // equal() bv = equal(u8v, u8vec3(u8)); bv.xy = equal(i8v, i8vec2(i8)); // notEqual() bv = notEqual(u8v, u8vec3(u8)); bv.xy = notEqual(i8v, i8vec2(i8)); } // Type conversion for specialization constant layout(constant_id = 100) const int8_t si8 = int8_t(-10); layout(constant_id = 101) const uint8_t su8 = uint8_t(20);