Name
pack - packs mutiple values into a single 32-bit result
Synopsis
float pack_2half(float2 a); float pack_2half(half2 a); float pack_2ushort(float2 a); float pack_2ushort(half2 a); float pack_4byte(float4 a); float pack_4byte(half4 a); float pack_4ubyte(float4 a); float pack_4ubyte(half4 a);Parameters
- a
- Value to pack
Description
pack_2half converts the components of a into a pair of 16-bit floating point values. The two converted components are then packed into a single 32-bit result.
pack_2ushort converts the components of a into a pair of 16-bit unsigned integers. The two converted components are then packed into a single 32-bit return value.
pack_4byte converts the four components of a into 8-bit signed integers. The signed integers are such that a representation with all bits set to 0 corresponds to the value -(128/127), and a representation with all bits set to 1 corresponds to +(127/127). The four signed integers are then packed into a single 32-bit result.
pack_4ubyte converts the four components of a into 8-bit unsigned integers. The unsigned integers are such that a representation with all bits set to 0 corresponds to 0.0, and a representation with all bits set to 1 corresponds to 1.0. The four unsigned integers are then packed into a single 32-bit result.
Reference Implementation
pack_2half could be implemented this way:
float pack_2half(float2 a) { float result; return result = (((half)a.y) << 16) | (half)a.x; }pack_2ushort could be implemented this way:
float pack_2ushort(float2 a) { float result; ushort.x = round(65535.0 * clamp(a.x, 0.0, 1.0)); ushort.y = round(65535.0 * clamp(a.y, 0.0, 1.0)); result = (ushort.y << 16) | ushort.y; return result; }pack_4byte could be implemented this way:
float pack_2half(half2 a) { float result; ub.y = round(127 * clamp(a.y, -128/127, 127/127) + 128); ub.z = round(127 * clamp(a.z, -128/127, 127/127) + 128); ub.w = round(127 * clamp(a.w, -128/127, 127/127) + 128); return result = (ub.w << 24) | (ub.z << 16) | (ub.y << 8) | ub.x; }pack_4ubyte could be implemented this way:
float pack_4ubyte(float4 a) { float result; ub.x = round(255.0 * clamp(a.x, 0.0, 1.0)); ub.y = round(255.0 * clamp(a.y, 0.0, 1.0)); ub.z = round(255.0 * clamp(a.z, 0.0, 1.0)); ub.w = round(255.0 * clamp(a.w, 0.0, 1.0)); result = (ub.w << 24) | (ub.z << 16) | (ub.y << 8) | ub.x; return result; }Profile Support
pack is supported in fp30, fp40, gp4, gp5
See Also