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 "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)
{
return aligned_alloc(count, 16);

View file

@ -67,24 +67,37 @@ inline size_t GetNearestPowerOfTwoBelow(size_t v)
}
namespace util {
#ifdef _MSC_VER
#ifdef _MSC_VER
__declspec(align(16))
#endif
struct vec3a : public vec3 {
#endif
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 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))
#endif
struct vec4a : public vec4 {
#endif
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 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);
@ -122,19 +135,14 @@ namespace util {
{ \
return is_power_of_two_loop(v); \
}
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(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)
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(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
#pragma pop_macro("is_power_of_two_as_loop")
template<typename T>
inline uint64_t get_power_of_two_exponent_floor(T v)
template<typename T>
inline uint64_t get_power_of_two_exponent_floor(T v)
{
return uint64_t(floor(log10(T(v)) / log10(2.0)));
}