This commit is contained in:
Бранимир Караџић
2019-07-27 20:11:56 -07:00
parent 39b2ac8d6b
commit 49bd00e446
2 changed files with 125 additions and 23 deletions

View File

@@ -73,27 +73,76 @@ namespace bx
template<typename Ty>
constexpr bool isPowerOf2(Ty _a);
/// Copy memory block.
///
/// @param _dst Destination pointer.
/// @param _src Source pointer.
/// @param _numBytes Number of bytes to copy.
///
/// @remark Source and destination memory blocks must not overlap.
///
void memCopy(void* _dst, const void* _src, size_t _numBytes);
/// Copy strided memory block.
///
void memCopy(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _srcPitch, uint32_t _dstPitch);
/// @param _dst Destination pointer.
/// @param _dstStride Destination stride.
/// @param _src Source pointer.
/// @param _srcStride Source stride.
/// @param _stride Number of bytes per stride to copy.
/// @param _num Number of strides.
///
void gather(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _srcPitch);
/// @remark Source and destination memory blocks must not overlap.
///
void scatter(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _dstPitch);
void memCopy(
void* _dst
, uint32_t _dstStride
, const void* _src
, uint32_t _srcStride
, uint32_t _stride
, uint32_t _num
);
///
void memMove(void* _dst, const void* _src, size_t _numBytes);
///
void memMove(
void* _dst
, uint32_t _dstStride
, const void* _src
, uint32_t _srcStride
, uint32_t _stride
, uint32_t _num
);
///
void memSet(void* _dst, uint8_t _ch, size_t _numBytes);
///
void memSet(void* _dst, uint32_t _dstStride, uint8_t _ch, uint32_t _stride, uint32_t _num);
///
int32_t memCmp(const void* _lhs, const void* _rhs, size_t _numBytes);
///
void gather(
void* _dst
, const void* _src
, uint32_t _srcStride
, uint32_t _stride
, uint32_t _num
);
///
void scatter(
void* _dst
, uint32_t _dstStride
, const void* _src
, uint32_t _stride
, uint32_t _num
);
} // namespace bx
#include "inline/bx.inl"

View File

@@ -44,29 +44,29 @@ namespace bx
#endif // BX_CRT_NONE
}
void memCopy(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _srcPitch, uint32_t _dstPitch)
void memCopy(
void* _dst
, uint32_t _dstStride
, const void* _src
, uint32_t _srcStride
, uint32_t _stride
, uint32_t _num
)
{
const uint8_t* src = (const uint8_t*)_src;
uint8_t* dst = (uint8_t*)_dst;
for (uint32_t ii = 0; ii < _num; ++ii)
if (_stride == _srcStride
&& _stride == _dstStride)
{
memCopy(dst, src, _size);
src += _srcPitch;
dst += _dstPitch;
memCopy(_dst, _src, _stride*_num);
return;
}
}
///
void gather(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _srcPitch)
{
memCopy(_dst, _src, _size, _num, _srcPitch, _size);
}
const uint8_t* src = (const uint8_t*)_src;
uint8_t* dst = (uint8_t*)_dst;
///
void scatter(void* _dst, const void* _src, uint32_t _size, uint32_t _num, uint32_t _dstPitch)
{
memCopy(_dst, _src, _size, _num, _size, _dstPitch);
for (uint32_t ii = 0; ii < _num; ++ii, src += _srcStride, dst += _dstStride)
{
memCopy(dst, src, _stride);
}
}
void memMoveRef(void* _dst, const void* _src, size_t _numBytes)
@@ -102,6 +102,31 @@ namespace bx
#endif // BX_CRT_NONE
}
void memMove(
void* _dst
, uint32_t _dstStride
, const void* _src
, uint32_t _srcStride
, uint32_t _stride
, uint32_t _num
)
{
if (_stride == _srcStride
&& _stride == _dstStride)
{
memMove(_dst, _src, _stride*_num);
return;
}
const uint8_t* src = (const uint8_t*)_src;
uint8_t* dst = (uint8_t*)_dst;
for (uint32_t ii = 0; ii < _num; ++ii, src += _srcStride, dst += _dstStride)
{
memMove(dst, src, _stride);
}
}
void memSetRef(void* _dst, uint8_t _ch, size_t _numBytes)
{
uint8_t* dst = (uint8_t*)_dst;
@@ -121,6 +146,22 @@ namespace bx
#endif // BX_CRT_NONE
}
void memSet(void* _dst, uint32_t _dstStride, uint8_t _ch, uint32_t _stride, uint32_t _num)
{
if (_stride == _dstStride)
{
memSet(_dst, _ch, _stride*_num);
return;
}
uint8_t* dst = (uint8_t*)_dst;
for (uint32_t ii = 0; ii < _num; ++ii, dst += _dstStride)
{
memSet(dst, _ch, _stride);
}
}
int32_t memCmpRef(const void* _lhs, const void* _rhs, size_t _numBytes)
{
const char* lhs = (const char*)_lhs;
@@ -144,4 +185,16 @@ namespace bx
#endif // BX_CRT_NONE
}
///
void gather(void* _dst, const void* _src, uint32_t _srcStride, uint32_t _stride, uint32_t _num)
{
memMove(_dst, _stride, _src, _srcStride, _stride, _num);
}
///
void scatter(void* _dst, uint32_t _dstStride, const void* _src, uint32_t _stride, uint32_t _num)
{
memMove(_dst, _dstStride, _src, _stride, _num, _stride);
}
} // namespace bx