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/PlatformOutputStream.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/PlatformOutputStream.h')
| -rw-r--r-- | APEX_1.4/NvParameterized/include/PlatformOutputStream.h | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/APEX_1.4/NvParameterized/include/PlatformOutputStream.h b/APEX_1.4/NvParameterized/include/PlatformOutputStream.h new file mode 100644 index 00000000..821d7a10 --- /dev/null +++ b/APEX_1.4/NvParameterized/include/PlatformOutputStream.h @@ -0,0 +1,212 @@ +// 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_OUTPUT_STREAM_H_ +#define PLATFORM_OUTPUT_STREAM_H_ + +// WARNING: before doing any changes to this file +// check comments at the head of BinSerializer.cpp + +#include "PlatformStream.h" +#include "ApbDefinitions.h" + +#ifndef WITHOUT_APEX_SERIALIZATION + +namespace NvParameterized +{ + +class PlatformOutputStream; + +//Info about pointed data (and its subdata) +struct Reloc +{ + RelocType type; + uint32_t ptrPos; + PlatformOutputStream *ptrData; + Traits *traits; + + Reloc(RelocType type_, uint32_t ptrPos_, const PlatformOutputStream &parent); + + Reloc(const Reloc &cinfo); + + ~Reloc(); +}; + +//Info about pointed string +struct StringReloc +{ + uint32_t ptrPos; + const char *s; + + StringReloc(uint32_t ptrPos_, const char *s_): ptrPos(ptrPos_), s(s_) {} +}; + +//Info about reloc which was already merged +struct MergedReloc +{ + uint32_t ptrPos; + uint32_t targetPos; + RelocType type; + bool isExtern; +}; + +//ABI-aware output stream +class PlatformOutputStream: public PlatformStream +{ + void operator = (const PlatformOutputStream &); //Don't + + friend struct Reloc; +public: + PlatformOutputStream(const PlatformABI &targetParams, Traits *traits, Dictionary &dict_); + + //Array's copy constructor is broken so we implement it by hand + PlatformOutputStream(const PlatformOutputStream &s); + +#ifndef NDEBUG + void dump() const; +#endif + + PX_INLINE StringBuf &getData() { return data; } + + uint32_t size() const { return data.size(); } + + //Update uint32_t at given position + void storeU32At(uint32_t x, uint32_t i); + + uint32_t storeString(const char *s); + + //Serialize raw bytes + uint32_t storeBytes(const char *s, uint32_t n); + + //Serialize value of primitive type with proper alignment + //(this is overriden for bools below) + template <typename T> PX_INLINE uint32_t storeSimple(T x); + + PX_INLINE uint32_t storeSimple(float* x, uint32_t size); + + //Serialize array of primitive type with proper alignment (slow path) + template <typename T> PX_INLINE int32_t storeSimpleArraySlow(Handle &handle); + + //Serialize array of structs of primitive types with proper alignment + uint32_t storeSimpleStructArray(Handle &handle); + + //Serialize array of primitive type with proper alignment + template <typename T> PX_INLINE uint32_t storeSimpleArray(Handle &handle); + + //Serialize header of NvParameterized object (see wiki for details) + uint32_t storeObjHeader(const NvParameterized::Interface &obj, bool isIncluded = true); + + //Serialize NvParameters-part of NvParameterized object + uint32_t beginObject(const NvParameterized::Interface &obj, bool /*isRoot*/, const Definition *pd); + + //Insert tail padding bytes for NvParameterized object + void closeObject() { closeStruct(); } + + //Align current offset according to supplied alignment and padding + uint32_t beginStruct(uint32_t align_, uint32_t pad_); + + //Align current offset according to supplied alignment (padding = alignment) + uint32_t beginStruct(uint32_t align_); + + //Align current offset according to supplied DataType + uint32_t beginStruct(const Definition *pd); + + //Insert tail padding + void closeStruct(); + + //beginStruct for DummyStringStruct + uint32_t beginString(); + + //closeStruct for DummyStringStruct + void closeString(); + + //beginStruct for arrays + uint32_t beginArray(const Definition *pd); + + //beginStruct for arrays + uint32_t beginArray(uint32_t align_); + + //closeStruct for arrays + void closeArray(); + + void skipBytes(uint32_t nbytes); + + //Align offset to be n*border + void align(uint32_t border); + + //Align offset to be n * alignment of T + template <typename T> PX_INLINE void align(); + + //Add data (including relocations) from another stream + uint32_t merge(const PlatformOutputStream &mergee); + + //Merge pointed data (including strings) thus flattening the stream + void flatten(); + + //Create relocation table + uint32_t writeRelocs(); + + //Serialize dictionary data + void mergeDict(); + + uint32_t storeNullPtr(); + + Reloc &storePtr(RelocType type, const Definition *pd); + + Reloc &storePtr(RelocType type, uint32_t align); + + void storeStringPtr(const char *s); + + PX_INLINE uint32_t alignment() const { return mTotalAlign; } + + PX_INLINE void setAlignment(uint32_t newAlign) { mTotalAlign = newAlign; } + +private: + + //Byte stream + StringBuf data; + + //Generic relocations + physx::shdfnd::Array<Reloc, Traits::Allocator> mRelocs; + + //String relocations + physx::shdfnd::Array<StringReloc, Traits::Allocator> mStrings; + + //Keep info about relocations after flattening + physx::shdfnd::Array<MergedReloc, Traits::Allocator> mMerges; + + Dictionary &dict; + + uint32_t mTotalAlign; +}; + +#include "PlatformOutputStream.inl" + +} + +#endif +#endif |