util-math: Add 16-byte aligned version of vec2

This commit is contained in:
Michael Fabian 'Xaymar' Dirks 2019-01-24 05:14:17 +01:00
parent 98baa0d98b
commit 406326b378
2 changed files with 48 additions and 20 deletions

View file

@ -22,6 +22,26 @@
#include <cstdlib> #include <cstdlib>
#include "util-memory.hpp" #include "util-memory.hpp"
void* util::vec2a::operator new(size_t count)
{
return aligned_alloc(count, 16);
}
void* util::vec2a::operator new[](size_t count)
{
return aligned_alloc(count, 16);
}
void util::vec2a::operator delete(void* p)
{
aligned_free(p);
}
void util::vec2a::operator delete[](void* p)
{
aligned_free(p);
}
void* util::vec3a::operator new(size_t count) void* util::vec3a::operator new(size_t count)
{ {
return aligned_alloc(count, 16); return aligned_alloc(count, 16);

View file

@ -67,24 +67,37 @@ inline size_t GetNearestPowerOfTwoBelow(size_t v)
} }
namespace util { namespace util {
#ifdef _MSC_VER #ifdef _MSC_VER
__declspec(align(16)) __declspec(align(16))
#endif #endif
struct vec3a : public vec3 { struct vec2a : public vec2 {
// 16-byte Aligned version of vec2
static void* operator new(size_t count); static void* operator new(size_t count);
static void* operator new[](size_t count); static void* operator new[](size_t count);
static void operator delete(void* p); static void operator delete(void* p);
static void operator delete[](void* p); static void operator delete[](void* p);
}; };
#ifdef _MSC_VER #ifdef _MSC_VER
__declspec(align(16)) __declspec(align(16))
#endif #endif
struct vec4a : public vec4 { struct vec3a : public vec3 {
// 16-byte Aligned version of vec3
static void* operator new(size_t count); static void* operator new(size_t count);
static void* operator new[](size_t count); static void* operator new[](size_t count);
static void operator delete(void* p); static void operator delete(void* p);
static void operator delete[](void* p); static void operator delete[](void* p);
};
#ifdef _MSC_VER
__declspec(align(16))
#endif
struct vec4a : public vec4 {
// 16-byte Aligned version of vec4
static void* operator new(size_t count);
static void* operator new[](size_t count);
static void operator delete(void* p);
static void operator delete[](void* p);
}; };
std::pair<int64_t, int64_t> SizeFromString(std::string text, bool allowSquare = true); std::pair<int64_t, int64_t> SizeFromString(std::string text, bool allowSquare = true);
@ -122,19 +135,14 @@ namespace util {
{ \ { \
return is_power_of_two_loop(v); \ return is_power_of_two_loop(v); \
} }
is_power_of_two_as_loop(int8_t) is_power_of_two_as_loop(int8_t) is_power_of_two_as_loop(uint8_t) is_power_of_two_as_loop(int16_t)
is_power_of_two_as_loop(uint8_t) is_power_of_two_as_loop(uint16_t) is_power_of_two_as_loop(int32_t) is_power_of_two_as_loop(uint32_t)
is_power_of_two_as_loop(int16_t) is_power_of_two_as_loop(int64_t) is_power_of_two_as_loop(uint64_t)
is_power_of_two_as_loop(uint16_t)
is_power_of_two_as_loop(int32_t)
is_power_of_two_as_loop(uint32_t)
is_power_of_two_as_loop(int64_t)
is_power_of_two_as_loop(uint64_t)
#undef is_power_of_two_as_loop #undef is_power_of_two_as_loop
#pragma pop_macro("is_power_of_two_as_loop") #pragma pop_macro("is_power_of_two_as_loop")
template<typename T> template<typename T>
inline uint64_t get_power_of_two_exponent_floor(T v) inline uint64_t get_power_of_two_exponent_floor(T v)
{ {
return uint64_t(floor(log10(T(v)) / log10(2.0))); return uint64_t(floor(log10(T(v)) / log10(2.0)));
} }