diff options
| author | Bryan Galdrikian <[email protected]> | 2017-02-24 09:32:20 -0800 |
|---|---|---|
| committer | Bryan Galdrikian <[email protected]> | 2017-02-24 09:32:20 -0800 |
| commit | e1bf674c16e3c8472b29574159c789cd3f0c64e0 (patch) | |
| tree | 9f0cfce09c71a2c27ff19589fcad6cd83504477c /sdk/common/NvBlastMemory.h | |
| parent | first commit (diff) | |
| download | blast-e1bf674c16e3c8472b29574159c789cd3f0c64e0.tar.xz blast-e1bf674c16e3c8472b29574159c789cd3f0c64e0.zip | |
Updating to [email protected] and [email protected] with a new directory structure.
NvBlast folder is gone, files have been moved to top level directory. README is changed to reflect this.
Diffstat (limited to 'sdk/common/NvBlastMemory.h')
| -rw-r--r-- | sdk/common/NvBlastMemory.h | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/sdk/common/NvBlastMemory.h b/sdk/common/NvBlastMemory.h new file mode 100644 index 0000000..0fb6a06 --- /dev/null +++ b/sdk/common/NvBlastMemory.h @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. + * + * NVIDIA CORPORATION and its licensors retain all intellectual property + * and proprietary rights in and to this software, related documentation + * and any modifications thereto. Any use, reproduction, disclosure or + * distribution of this software and related documentation without an express + * license agreement from NVIDIA CORPORATION is strictly prohibited. + */ + +#ifndef NVBLASTMEMORY_H +#define NVBLASTMEMORY_H + +#include <math.h> + +namespace Nv +{ +namespace Blast +{ + + +/** +Utility function to align the given value to the next 16-byte boundary. + +Returns the aligned value. +*/ +template<typename T> +NV_INLINE T align16(T value) +{ + return (value + 0xF)&~(T)0xF; +} + + +/** Offset void* pointer by 'offset' bytes helper-functions */ + +template <typename T> +NV_INLINE T pointerOffset(void* p, ptrdiff_t offset) +{ + return reinterpret_cast<T>(reinterpret_cast<char*>(p)+offset); +} + +template <typename T> +NV_INLINE T pointerOffset(const void* p, ptrdiff_t offset) +{ + return reinterpret_cast<T>(reinterpret_cast<const char*>(p)+offset); +} + +NV_INLINE const void* pointerOffset(const void* p, ptrdiff_t offset) +{ + return pointerOffset<const void*>(p, offset); +} + +NV_INLINE void* pointerOffset(void* p, ptrdiff_t offset) +{ + return pointerOffset<void*>(p, offset); +} + +} // namespace Blast +} // namespace Nv + + +/** Block data offset and accessor macro. */ +#define NvBlastBlockData(_dataType, _name, _accessor) \ +_dataType* _accessor() const \ +{ \ + return (_dataType*)((uintptr_t)this + _name); \ +} \ +uint32_t _name + + +/** Block data offset and accessor macro for an array (includes an _accessor##ArraySize() function which returns the last expression). */ +#define NvBlastBlockArrayData(_dataType, _name, _accessor, _sizeExpr) \ +_dataType* _accessor() const \ +{ \ + return (_dataType*)((uintptr_t)this + _name); \ +} \ +uint32_t _accessor##ArraySize() const \ +{ \ + return _sizeExpr; \ +} \ +uint32_t _name + + +/** Block data offset generation macros. */ + +/** Start offset generation with this. */ +#define NvBlastCreateOffsetStart(_baseOffset) \ +size_t _lastOffset = _baseOffset; \ +size_t _lastSize = 0 + +/** Create the next offset generation with this. The value will be aligned to a 16-byte boundary. */ +#define NvBlastCreateOffsetAlign16(_name, _size) \ +_name = align16(_lastOffset + _lastSize); \ +_lastOffset = _name; \ +_lastSize = _size + +/** End offset generation with this. It evaluates to the (16-byte aligned) total size of the data block. */ +#define NvBlastCreateOffsetEndAlign16() \ +align16(_lastOffset + _lastSize) + + +/** Stack allocation */ +#if NV_WINDOWS_FAMILY +#include <malloc.h> +#define NvBlastAlloca(x) _alloca(x) +#elif NV_LINUX || NV_ANDROID +#include <malloc.h> +#define NvBlastAlloca(x) alloca(x) +#elif NV_APPLE_FAMILY +#include <alloca.h> +#define NvBlastAlloca(x) alloca(x) +#elif NV_PS4 +#include <memory.h> +#define NvBlastAlloca(x) alloca(x) +#elif NV_XBOXONE +#include <malloc.h> +#define NvBlastAlloca(x) alloca(x) +#endif + +#define NvBlastAllocaAligned16(x) (void*)(((uintptr_t)PxAlloca(x + 0xF) + 0xF) & ~(uintptr_t)0xF) + + +#endif // #ifndef NVBLASTMEMORY_H |