|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once |
|
|
|
|
|
#define ENABLE_VERBOSE_OUTPUT 0 |
|
|
#define ENABLE_APIC_CAPTURE 0 |
|
|
#define ENABLE_PERFALYZE_CAPTURE 0 |
|
|
|
|
|
#if ENABLE_VERBOSE_OUTPUT |
|
|
#define VERBOSE(a) a##; |
|
|
#else |
|
|
#define VERBOSE(a) |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef UNUSED |
|
|
#define UNUSED(x) (void)x; |
|
|
#endif |
|
|
|
|
|
#define NOMINMAX |
|
|
|
|
|
#if !PLATFORM_OPENCL |
|
|
#include <cassert> |
|
|
#endif |
|
|
|
|
|
#include "types.h" |
|
|
|
|
|
#if !PLATFORM_SPU && !PLATFORM_OPENCL |
|
|
#include <string> |
|
|
#include <iostream> |
|
|
#include <fstream> |
|
|
#include <algorithm> |
|
|
#include <functional> |
|
|
#endif |
|
|
|
|
|
|
|
|
#if _WIN32 |
|
|
#pragma warning(disable: 4996) |
|
|
#pragma warning(disable: 4100) |
|
|
#pragma warning(disable: 4324) |
|
|
#endif |
|
|
|
|
|
|
|
|
#define DEFAULT_ALIGNMENT 16 |
|
|
|
|
|
#if PLATFORM_LINUX |
|
|
#define ALIGN_N(x) |
|
|
#define ENDALIGN_N(x) __attribute__ ((aligned (x))) |
|
|
#else |
|
|
#define ALIGN_N(x) __declspec(align(x)) |
|
|
#define END_ALIGN_N(x) |
|
|
#endif |
|
|
|
|
|
#define ALIGN ALIGN_N(DEFAULT_ALIGNMENT) |
|
|
#define END_ALIGN END_ALIGN_N(DEFAULT_ALIGNMENT) |
|
|
|
|
|
inline bool IsPowerOfTwo(int n) |
|
|
{ |
|
|
return (n&(n-1))==0; |
|
|
} |
|
|
|
|
|
|
|
|
template <typename T> |
|
|
inline T* AlignPtr(T* p, uint32_t alignment) |
|
|
{ |
|
|
assert(IsPowerOfTwo(alignment)); |
|
|
|
|
|
|
|
|
uintptr_t up = reinterpret_cast<uintptr_t>(p); |
|
|
return (T*)((up+(alignment-1)) & ~(alignment-1)); |
|
|
} |
|
|
|
|
|
|
|
|
inline uint32_t Align(uint32_t val, uint32_t alignment) |
|
|
{ |
|
|
assert(IsPowerOfTwo(alignment)); |
|
|
|
|
|
return (val+(alignment-1))& ~(alignment-1); |
|
|
} |
|
|
|
|
|
inline bool IsAligned(void* p, uint32_t alignment) |
|
|
{ |
|
|
return (((uintptr_t)p) & (alignment-1)) == 0; |
|
|
} |
|
|
|
|
|
|
|
|
template <typename T> |
|
|
T ByteSwap(const T& val) |
|
|
{ |
|
|
T copy = val; |
|
|
uint8_t* p = reinterpret_cast<uint8_t*>(©); |
|
|
|
|
|
std::reverse(p, p+sizeof(T)); |
|
|
|
|
|
return copy; |
|
|
} |
|
|
|
|
|
#ifndef LITTLE_ENDIAN |
|
|
#define LITTLE_ENDIAN WIN32 |
|
|
#endif |
|
|
|
|
|
#ifndef BIG_ENDIAN |
|
|
#define BIG_ENDIAN PLATFORM_PS3 || PLATFORM_SPU |
|
|
#endif |
|
|
|
|
|
#if BIG_ENDIAN |
|
|
#define ToLittleEndian(x) ByteSwap(x) |
|
|
#else |
|
|
#define ToLittleEndian(x) x |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
template <typename T, size_t N> |
|
|
size_t sizeof_array(const T (&)[N]) |
|
|
{ |
|
|
return N; |
|
|
} |
|
|
|
|
|
|
|
|
template <typename T> |
|
|
class free_ptr : public std::unary_function<T*, void> |
|
|
{ |
|
|
public: |
|
|
|
|
|
void operator()(const T* ptr) |
|
|
{ |
|
|
delete ptr; |
|
|
} |
|
|
}; |
|
|
|