From ddb8e76add61c75d0c0b2a011abc8ba5b73ece8b Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 26 Jan 2018 09:59:29 +0000 Subject: [PATCH] Add EndianSwap function using platform intrinsics --- renderdoc/os/os_specific.h | 64 +++++++++++++++++++++++++++++ renderdoc/os/posix/posix_specific.h | 15 +++++++ renderdoc/os/win32/win32_specific.h | 5 +++ 3 files changed, 84 insertions(+) diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index 48f9ae9ca..6a4935b8b 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -422,6 +422,7 @@ inline uint64_t CountLeadingZeroes(uint64_t value); // std::string // OS_DEBUG_BREAK() - instruction that debugbreaks the debugger - define instead of function to // preserve callstacks +// EndianSwapXX() for XX = 16, 32, 64 #if ENABLED(RDOC_WIN32) #include "win32/win32_specific.h" @@ -430,3 +431,66 @@ inline uint64_t CountLeadingZeroes(uint64_t value); #else #error Undefined Platform! #endif + +inline uint64_t EndianSwap(uint64_t t) +{ + return EndianSwap64(t); +} + +inline uint32_t EndianSwap(uint32_t t) +{ + return EndianSwap32(t); +} + +inline uint16_t EndianSwap(uint16_t t) +{ + return EndianSwap16(t); +} + +inline int64_t EndianSwap(int64_t t) +{ + return (int64_t)EndianSwap(uint64_t(t)); +} + +inline int32_t EndianSwap(int32_t t) +{ + return (int32_t)EndianSwap(uint32_t(t)); +} + +inline int16_t EndianSwap(int16_t t) +{ + return (int16_t)EndianSwap(uint16_t(t)); +} + +inline double EndianSwap(double t) +{ + uint64_t u; + memcpy(&u, &t, sizeof(t)); + u = EndianSwap(u); + memcpy(&t, &u, sizeof(t)); + return t; +} + +inline float EndianSwap(float t) +{ + uint32_t u; + memcpy(&u, &t, sizeof(t)); + u = EndianSwap(u); + memcpy(&t, &u, sizeof(t)); + return t; +} + +inline char EndianSwap(char t) +{ + return t; +} + +inline byte EndianSwap(byte t) +{ + return t; +} + +inline bool EndianSwap(bool t) +{ + return t; +} diff --git a/renderdoc/os/posix/posix_specific.h b/renderdoc/os/posix/posix_specific.h index 792d0d4d6..9e1e0c6c7 100644 --- a/renderdoc/os/posix/posix_specific.h +++ b/renderdoc/os/posix/posix_specific.h @@ -32,6 +32,21 @@ #define OS_DEBUG_BREAK() raise(SIGTRAP) +#if ENABLED(RDOC_APPLE) + +#include +#define EndianSwap16(x) OSSwapInt16(x) +#define EndianSwap32(x) OSSwapInt32(x) +#define EndianSwap64(x) OSSwapInt64(x) + +#else + +#define EndianSwap16(x) __builtin_bswap16(x) +#define EndianSwap32(x) __builtin_bswap32(x) +#define EndianSwap64(x) __builtin_bswap64(x) + +#endif + struct EmbeddedResourceType { EmbeddedResourceType(const unsigned char *b, int l) : base(b), len(l) {} diff --git a/renderdoc/os/win32/win32_specific.h b/renderdoc/os/win32/win32_specific.h index 79c49e83e..39e826559 100644 --- a/renderdoc/os/win32/win32_specific.h +++ b/renderdoc/os/win32/win32_specific.h @@ -29,6 +29,7 @@ #define NOMINMAX #include +#include #include #include "data/resource.h" @@ -36,6 +37,10 @@ #define OS_DEBUG_BREAK() __debugbreak() +#define EndianSwap16(x) _byteswap_ushort(x) +#define EndianSwap32(x) _byteswap_ulong(x) +#define EndianSwap64(x) _byteswap_uint64(x) + #define EmbeddedResourceType int #define EmbeddedResource(filename) CONCAT(RESOURCE_, filename)