diff options
| author | git perforce import user <a@b> | 2016-10-25 12:29:14 -0600 |
|---|---|---|
| committer | Sheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees> | 2016-10-25 18:56:37 -0500 |
| commit | 3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch) | |
| tree | fa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/NvParameterized/include/PlatformStream.h | |
| download | physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.tar.xz physx-3.4-3dfe2108cfab31ba3ee5527e217d0d8e99a51162.zip | |
Initial commit:
PhysX 3.4.0 Update @ 21294896
APEX 1.4.0 Update @ 21275617
[CL 21300167]
Diffstat (limited to 'APEX_1.4/NvParameterized/include/PlatformStream.h')
| -rw-r--r-- | APEX_1.4/NvParameterized/include/PlatformStream.h | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/APEX_1.4/NvParameterized/include/PlatformStream.h b/APEX_1.4/NvParameterized/include/PlatformStream.h new file mode 100644 index 00000000..c17bda66 --- /dev/null +++ b/APEX_1.4/NvParameterized/include/PlatformStream.h @@ -0,0 +1,151 @@ +// This code contains NVIDIA Confidential Information and is disclosed to you +// under a form of NVIDIA software license agreement provided separately to you. +// +// Notice +// NVIDIA Corporation and its licensors retain all intellectual property and +// proprietary rights in and to this software and 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. +// +// ALL NVIDIA DESIGN SPECIFICATIONS, CODE ARE PROVIDED "AS IS.". NVIDIA MAKES +// NO WARRANTIES, EXPRESSED, IMPLIED, STATUTORY, OR OTHERWISE WITH RESPECT TO +// THE MATERIALS, AND EXPRESSLY DISCLAIMS ALL IMPLIED WARRANTIES OF NONINFRINGEMENT, +// MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE. +// +// Information and code furnished is believed to be accurate and reliable. +// However, NVIDIA Corporation assumes no responsibility for the consequences of use of such +// information or for any infringement of patents or other rights of third parties that may +// result from its use. No license is granted by implication or otherwise under any patent +// or patent rights of NVIDIA Corporation. Details are subject to change without notice. +// This code supersedes and replaces all information previously supplied. +// NVIDIA Corporation products are not authorized for use as critical +// components in life support devices or systems without express written approval of +// NVIDIA Corporation. +// +// Copyright (c) 2008-2013 NVIDIA Corporation. All rights reserved. + +#ifndef PLATFORM_STREAM_H_ +#define PLATFORM_STREAM_H_ + +#include <stdio.h> + +#include "nvparameterized/NvParameterized.h" +#include "nvparameterized/NvSerializer.h" +#include "NvSerializerInternal.h" +#include "PlatformABI.h" + +namespace NvParameterized +{ + +// Base class for ABI-aware streams + +// TODO: +// PlatformInput/OutputStream should probably be visitors + +class PlatformStream +{ + void operator =(const PlatformStream &); //Don't + +protected: + Traits *mTraits; + + PlatformABI mTargetParams, mCurParams; + + struct Agregate + { + enum Type + { + STRUCT, + ARRAY + }; + + Type type; + uint32_t align; + + Agregate(Type t, uint32_t a): type(t), align(a) {} + }; + + //Agregate stack holds information about structs and their nesting (for automatic insertion of tail pad) + physx::shdfnd::Array<Agregate, Traits::Allocator> mStack; + +public: + PlatformStream(const PlatformABI &targetParams, Traits *traits) + : mTraits(traits), + mTargetParams(targetParams), + mStack(Traits::Allocator(traits)) + { + // TODO: constructors should not fail... + if( Serializer::ERROR_NONE != PlatformABI::GetPredefinedABI(GetCurrentPlatform(), mCurParams) ) + { + PX_ALWAYS_ASSERT(); + return; + } + } + + //Array's copy constructor is broken so we implement it by hand + PlatformStream(const PlatformStream &s) + : mTraits(s.mTraits), + mTargetParams(s.mTargetParams), + mCurParams(s.mCurParams), + mStack(Traits::Allocator(s.mTraits)) + { + mStack.reserve(s.mStack.size()); + for(uint32_t i = 0; i < s.mStack.size(); ++i) + mStack.pushBack(s.mStack[i]); + } + + void dump() const + { + printf("Dumping PlatformStream at %p:\n", this); + } + + const PlatformABI &getTargetABI() const + { + return mTargetParams; + } + + uint32_t getTargetSize(const Definition *pd) const + { + return mTargetParams.getSize(pd); + } + + uint32_t getTargetAlignment(const Definition *pd) const + { + return mTargetParams.getAlignment(pd); + } + + uint32_t getTargetPadding(const Definition *pd) const + { + return mTargetParams.getPadding(pd); + } + + //Align offset to be n*border + PX_INLINE uint32_t getAlign(uint32_t off, uint32_t border, bool &isAligned) const + { + PX_ASSERT(border <= 128); + + //Array members are not aligned + //See http://www.gamasutra.com/view/feature/3975/data_alignment_part_2_objects_on_.php + if( !mStack.empty() && Agregate::ARRAY == mStack.back().type ) + { + isAligned = false; + return off; + } + + isAligned = true; + const uint32_t mask = border - 1; + return (off + mask) & ~mask; + } + + //Align offset to be n*border + PX_INLINE uint32_t getAlign(uint32_t off, uint32_t border) const + { + bool tmp; + return getAlign(off, border, tmp); + } +}; + +} + +#endif |