/* * 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 namespace Nv { namespace Blast { /** Utility function to align the given value to the next 16-byte boundary. Returns the aligned value. */ template NV_INLINE T align16(T value) { return (value + 0xF)&~(T)0xF; } /** Offset void* pointer by 'offset' bytes helper-functions */ template NV_INLINE T pointerOffset(void* p, ptrdiff_t offset) { return reinterpret_cast(reinterpret_cast(p)+offset); } template NV_INLINE T pointerOffset(const void* p, ptrdiff_t offset) { return reinterpret_cast(reinterpret_cast(p)+offset); } NV_INLINE const void* pointerOffset(const void* p, ptrdiff_t offset) { return pointerOffset(p, offset); } NV_INLINE void* pointerOffset(void* p, ptrdiff_t offset) { return pointerOffset(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 #define NvBlastAlloca(x) _alloca(x) #elif NV_LINUX || NV_ANDROID #include #define NvBlastAlloca(x) alloca(x) #elif NV_APPLE_FAMILY #include #define NvBlastAlloca(x) alloca(x) #elif NV_PS4 #include #define NvBlastAlloca(x) alloca(x) #elif NV_XBOXONE #include #define NvBlastAlloca(x) alloca(x) #endif #define NvBlastAllocaAligned16(x) (void*)(((uintptr_t)PxAlloca(x + 0xF) + 0xF) & ~(uintptr_t)0xF) #endif // #ifndef NVBLASTMEMORY_H