77 lines
2.5 KiB
Plaintext
77 lines
2.5 KiB
Plaintext
/**
|
|
******************************************************************************
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
******************************************************************************
|
|
* Copyright 2022 Ben Vanik. All rights reserved. *
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
******************************************************************************
|
|
*/
|
|
|
|
#ifndef XENIA_GPU_SHADERS_ENDIAN_XESLI_
|
|
#define XENIA_GPU_SHADERS_ENDIAN_XESLI_
|
|
|
|
#include "../../ui/shaders/xesl.xesli"
|
|
|
|
// 2-bit (xenos::Endian) and 3-bit (xenos::Endian128).
|
|
#define kXenosEndian_None 0u
|
|
#define kXenosEndian_8in16 1u
|
|
#define kXenosEndian_8in32 2u
|
|
#define kXenosEndian_16in32 3u
|
|
// 3-bit only.
|
|
#define kXenosEndian_8in64 4u
|
|
#define kXenosEndian_8in128 5u
|
|
|
|
// Can also swap two packed 16-bit values.
|
|
#define XE_ENDIAN_SWAP_16_OVERLOAD(XeEndianSwapType) \
|
|
XeEndianSwapType XeEndianSwap16(XeEndianSwapType value, uint endian) { \
|
|
if (endian == kXenosEndian_8in16) { \
|
|
value = ((value & 0x00FF00FFu) << 8u) | ((value & 0xFF00FF00u) >> 8u); \
|
|
} \
|
|
return value; \
|
|
}
|
|
XE_ENDIAN_SWAP_16_OVERLOAD(uint)
|
|
XE_ENDIAN_SWAP_16_OVERLOAD(xesl_uint2)
|
|
XE_ENDIAN_SWAP_16_OVERLOAD(xesl_uint3)
|
|
XE_ENDIAN_SWAP_16_OVERLOAD(xesl_uint4)
|
|
|
|
#define XE_ENDIAN_SWAP_32_OVERLOAD(XeEndianSwapType) \
|
|
XeEndianSwapType XeEndianSwap32(XeEndianSwapType value, uint endian) { \
|
|
if (endian == kXenosEndian_8in16 || endian == kXenosEndian_8in32) { \
|
|
value = ((value & 0x00FF00FFu) << 8u) | ((value & 0xFF00FF00u) >> 8u); \
|
|
} \
|
|
if (endian == kXenosEndian_8in32 || endian == kXenosEndian_16in32) { \
|
|
value = (value << 16u) | (value >> 16u); \
|
|
} \
|
|
return value; \
|
|
}
|
|
XE_ENDIAN_SWAP_32_OVERLOAD(uint)
|
|
XE_ENDIAN_SWAP_32_OVERLOAD(xesl_uint2)
|
|
XE_ENDIAN_SWAP_32_OVERLOAD(xesl_uint3)
|
|
XE_ENDIAN_SWAP_32_OVERLOAD(xesl_uint4)
|
|
|
|
xesl_uint2 XeEndianSwap64(xesl_uint2 value, uint endian) {
|
|
if (endian == kXenosEndian_8in64) {
|
|
value = value.yx;
|
|
endian = kXenosEndian_8in32;
|
|
}
|
|
return XeEndianSwap32(value, endian);
|
|
}
|
|
|
|
xesl_uint4 XeEndianSwap64(xesl_uint4 value, uint endian) {
|
|
if (endian == kXenosEndian_8in64) {
|
|
value = value.yxwz;
|
|
endian = kXenosEndian_8in32;
|
|
}
|
|
return XeEndianSwap32(value, endian);
|
|
}
|
|
|
|
xesl_uint4 XeEndianSwap128(xesl_uint4 value, uint endian) {
|
|
if (endian == kXenosEndian_8in128) {
|
|
value = value.wzyx;
|
|
endian = kXenosEndian_8in32;
|
|
}
|
|
return XeEndianSwap64(value, endian);
|
|
}
|
|
|
|
#endif // XENIA_GPU_SHADERS_ENDIAN_XESLI_
|