使用C++ 20/23的bit系列函数取代原先手写的一些位计算
This commit is contained in:
parent
22a5749e6f
commit
5fde4980e1
@ -1,8 +1,14 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include<hgl/platform/Platform.h>
|
#include<hgl/platform/Platform.h>
|
||||||
|
#include<bit>
|
||||||
#include<cmath>
|
#include<cmath>
|
||||||
#include<cstring>
|
#include<cstring>
|
||||||
|
#include<algorithm>
|
||||||
|
|
||||||
|
#if __cplusplus >= 202302L //C++23
|
||||||
|
#include <memory>
|
||||||
|
#endif//
|
||||||
|
|
||||||
namespace hgl
|
namespace hgl
|
||||||
{
|
{
|
||||||
@ -33,8 +39,6 @@ namespace hgl
|
|||||||
#define RANGE_CHECK_RETURN_FALSE(value) if(!RangeCheck(value))return(false);
|
#define RANGE_CHECK_RETURN_FALSE(value) if(!RangeCheck(value))return(false);
|
||||||
#define RANGE_CHECK_RETURN_NULLPTR(value) if(!RangeCheck(value))return(nullptr);
|
#define RANGE_CHECK_RETURN_NULLPTR(value) if(!RangeCheck(value))return(nullptr);
|
||||||
|
|
||||||
#define HGL_CONVER_TO_MEM_ALIGN(x) ((((x)+HGL_MEM_ALIGN-1)/HGL_MEM_ALIGN)*HGL_MEM_ALIGN) //内存对齐转换宏
|
|
||||||
|
|
||||||
#ifndef NULL
|
#ifndef NULL
|
||||||
#define NULL 0
|
#define NULL 0
|
||||||
#endif//
|
#endif//
|
||||||
@ -196,8 +200,7 @@ namespace hgl
|
|||||||
/**
|
/**
|
||||||
* 求数值对齐后的值
|
* 求数值对齐后的值
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T> constexpr const inline T hgl_align(const T value,const T alignment)
|
||||||
inline T hgl_align(const T value,const T alignment)
|
|
||||||
{
|
{
|
||||||
return ((value+alignment-1)/alignment)*alignment;
|
return ((value+alignment-1)/alignment)*alignment;
|
||||||
}
|
}
|
||||||
@ -205,19 +208,21 @@ namespace hgl
|
|||||||
/**
|
/**
|
||||||
* 求数值对齐后的值(仅支持2次幂)
|
* 求数值对齐后的值(仅支持2次幂)
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T> constexpr const inline T hgl_align_pow2(const T value,const T alignment)
|
||||||
inline T hgl_align_pow2(const T value,const T alignment)
|
|
||||||
{
|
{
|
||||||
|
#if defined(__cpp_lib_align) && __cpp_lib_align >= 202306L
|
||||||
|
return std::align_up(value,alignment);
|
||||||
|
#else
|
||||||
const T align_size=alignment-1;
|
const T align_size=alignment-1;
|
||||||
|
|
||||||
return (value+align_size)&(~align_size);
|
return (value+align_size)&(~align_size);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 取适合正巧大于当前数的2次幂值
|
* 取适合正巧大于当前数的2次幂值
|
||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T> constexpr const inline T power_to_2(T value)
|
||||||
inline T power_to_2(T value)
|
|
||||||
{
|
{
|
||||||
T result=1;
|
T result=1;
|
||||||
|
|
||||||
@ -227,10 +232,15 @@ namespace hgl
|
|||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename T> constexpr const inline T power_to_2_down(T value)
|
||||||
|
{
|
||||||
|
return std::bit_floor(value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 向上对齐
|
* 向上对齐
|
||||||
*/
|
*/
|
||||||
template<typename T> inline T align_up(T val, T alignment) // align val to the next multiple of alignment
|
template<typename T> constexpr const inline T align_up(T val, T alignment) // align val to the next multiple of alignment
|
||||||
{
|
{
|
||||||
return (val + alignment - (T)1) & ~(alignment - (T)1);
|
return (val + alignment - (T)1) & ~(alignment - (T)1);
|
||||||
}
|
}
|
||||||
@ -238,7 +248,7 @@ namespace hgl
|
|||||||
/**
|
/**
|
||||||
* 向下对齐
|
* 向下对齐
|
||||||
*/
|
*/
|
||||||
template<typename T> inline T align_down(T val, T alignment) // align val to the previous multiple of alignment
|
template<typename T> constexpr const inline T align_down(T val, T alignment) // align val to the previous multiple of alignment
|
||||||
{
|
{
|
||||||
return val & ~(alignment - (T)1);
|
return val & ~(alignment - (T)1);
|
||||||
}
|
}
|
||||||
@ -246,7 +256,7 @@ namespace hgl
|
|||||||
/**
|
/**
|
||||||
* 求对齐数量
|
* 求对齐数量
|
||||||
*/
|
*/
|
||||||
template<typename T> inline T divide_rounding_up(T x, T y)
|
template<typename T> constexpr const inline T divide_rounding_up(T x, T y)
|
||||||
{
|
{
|
||||||
return (x + y - (T)1) / y;
|
return (x + y - (T)1) / y;
|
||||||
}
|
}
|
||||||
@ -315,17 +325,18 @@ namespace hgl
|
|||||||
return(value);
|
return(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const uint GetMipLevel(const uint size)
|
inline constexpr const uint GetMipLevel(const uint size)
|
||||||
{
|
{
|
||||||
return static_cast<uint>(floor(log2(size)))+1;
|
//return static_cast<uint>(floor(log2(size)))+1;
|
||||||
|
return std::bit_width(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const uint GetMipLevel(const uint width,const uint height)
|
inline constexpr const uint GetMipLevel(const uint width,const uint height)
|
||||||
{
|
{
|
||||||
return GetMipLevel(hgl_max(width,height));
|
return GetMipLevel(hgl_max(width,height));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const uint GetMipLevel(const uint width,const uint height,const uint depth)
|
inline constexpr const uint GetMipLevel(const uint width,const uint height,const uint depth)
|
||||||
{
|
{
|
||||||
return GetMipLevel(hgl_max(hgl_max(width,height),depth));
|
return GetMipLevel(hgl_max(hgl_max(width,height),depth));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user