aboutsummaryrefslogtreecommitdiff
path: root/APEX_1.4/include/nvparameterized/NvSerializer.h
diff options
context:
space:
mode:
authorgit perforce import user <a@b>2016-10-25 12:29:14 -0600
committerSheikh Dawood Abdul Ajees <Sheikh Dawood Abdul Ajees>2016-10-25 18:56:37 -0500
commit3dfe2108cfab31ba3ee5527e217d0d8e99a51162 (patch)
treefa6485c169e50d7415a651bf838f5bcd0fd3bfbd /APEX_1.4/include/nvparameterized/NvSerializer.h
downloadphysx-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/include/nvparameterized/NvSerializer.h')
-rw-r--r--APEX_1.4/include/nvparameterized/NvSerializer.h461
1 files changed, 461 insertions, 0 deletions
diff --git a/APEX_1.4/include/nvparameterized/NvSerializer.h b/APEX_1.4/include/nvparameterized/NvSerializer.h
new file mode 100644
index 00000000..7c182eaf
--- /dev/null
+++ b/APEX_1.4/include/nvparameterized/NvSerializer.h
@@ -0,0 +1,461 @@
+// 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 NV_SERIALIZER_H
+#define NV_SERIALIZER_H
+
+/*!
+\file
+\brief NvParameterized serializer class
+*/
+
+
+#include <filebuf/PxFileBuf.h>
+
+
+namespace NvParameterized
+{
+
+PX_PUSH_PACK_DEFAULT
+
+/**
+\brief Platform descriptor
+
+This class describes target serialization platform which consists of processor architecture, compiler and OS.
+*/
+struct SerializePlatform
+{
+ /**
+ \brief Processor architectures enumeration
+ \warning Do not change values of enums!
+ */
+ typedef enum
+ {
+ ARCH_GEN = 0,
+ ARCH_X86 = 1,
+ ARCH_X86_64 = 2,
+ ARCH_PPC = 3,
+ ARCH_CELL = 4,
+ ARCH_ARM = 5,
+ ARCH_LAST
+ } ArchType;
+
+ /**
+ \brief Platform processor architecture
+ */
+ ArchType archType;
+
+ /**
+ \brief Compilers enumeration
+ \warning Do not change values of enums!
+ */
+ typedef enum
+ {
+ COMP_GEN = 0,
+ COMP_GCC = 1,
+ COMP_VC = 2,
+ COMP_MW = 3,
+ COMP_LAST
+ } CompilerType;
+
+ /**
+ \brief Platform compiler
+ */
+ CompilerType compilerType;
+
+ /**
+ \brief Platform compiler version
+ */
+ uint32_t compilerVer;
+
+ /**
+ \brief OSes enumeration
+ \warning Do not change values of enums!
+ */
+ typedef enum
+ {
+ OS_WINDOWS = 0,
+ OS_LINUX = 1,
+ OS_LV2 = 2, // PS3
+ OS_MACOSX = 3,
+ OS_XBOX = 4,
+ OS_GEN = 5,
+ OS_ANDROID = 6,
+ OS_XBOXONE = 7,
+ OS_PS4 = 8,
+ OS_LAST
+ } OsType;
+
+ /**
+ \brief Platform OS
+ */
+ OsType osType;
+
+ /**
+ \brief Platform OS version
+ */
+ uint32_t osVer;
+
+ /**
+ \brief This value identfies that version is unknown
+ */
+ static const uint32_t ANY_VERSION = (uint32_t)-1;
+
+ PX_INLINE SerializePlatform();
+
+ /**
+ \brief Constructor of SerializePlatform
+ */
+ PX_INLINE SerializePlatform(ArchType archType, CompilerType compType, uint32_t compVer, OsType osType, uint32_t osVer);
+
+ /**
+ \brief Checks if platforms are binary-compatible
+ */
+ PX_INLINE bool operator ==(const SerializePlatform &p) const;
+
+ /**
+ \brief Checks if platforms are binary-incompatible
+ */
+ PX_INLINE bool operator !=(const SerializePlatform &p) const;
+};
+
+class Interface;
+class Definition;
+class Traits;
+struct SerializePlatform;
+
+/**
+\brief Interface class for serializer-deserializer of NvParameterized objects
+
+Serializer serializes and deserializes one or more NvParameterized objects to file using various output formats
+(see SerializeType).
+*/
+class Serializer
+{
+public:
+
+ /**
+ \brief Status enums that the Serializer methods may return
+ */
+ enum ErrorType
+ {
+ ERROR_NONE = 0,
+
+ ERROR_UNKNOWN,
+ ERROR_NOT_IMPLEMENTED,
+
+ // File format related errors
+ ERROR_INVALID_PLATFORM,
+ ERROR_INVALID_PLATFORM_NAME,
+ ERROR_INVALID_FILE_VERSION,
+ ERROR_INVALID_FILE_FORMAT,
+ ERROR_INVALID_MAGIC,
+ ERROR_INVALID_CHAR,
+
+ // External errors
+ ERROR_STREAM_ERROR,
+ ERROR_MEMORY_ALLOCATION_FAILURE,
+ ERROR_UNALIGNED_MEMORY,
+ ERROR_PRESERIALIZE_FAILED,
+ ERROR_INTERNAL_BUFFER_OVERFLOW,
+ ERROR_OBJECT_CREATION_FAILED,
+ ERROR_CONVERSION_FAILED,
+
+ // Xml-specific errors
+ ERROR_VAL2STRING_FAILED,
+ ERROR_STRING2VAL_FAILED,
+ ERROR_INVALID_TYPE_ATTRIBUTE,
+ ERROR_UNKNOWN_XML_TAG,
+ ERROR_MISSING_DOCTYPE,
+ ERROR_MISSING_ROOT_ELEMENT,
+ ERROR_INVALID_NESTING,
+ ERROR_INVALID_ATTR,
+
+ // Other stuff
+ ERROR_INVALID_ARRAY,
+ ERROR_ARRAY_INDEX_OUT_OF_RANGE,
+ ERROR_INVALID_VALUE,
+ ERROR_INVALID_INTERNAL_PTR,
+ ERROR_INVALID_PARAM_HANDLE,
+ ERROR_INVALID_RELOC_TYPE,
+ ERROR_INVALID_DATA_TYPE,
+ ERROR_INVALID_REFERENCE
+ };
+
+ /**
+ \brief The supported serialization formats
+ */
+ enum SerializeType
+ {
+ /// serialize in XML format.
+ NST_XML = 0,
+
+ /// serialize in a binary format
+ NST_BINARY,
+
+ NST_LAST
+ };
+
+ /**
+ \brief Get type of stream (binary or xml)
+ \param [in] stream stream to be analyzed
+ */
+ static SerializeType peekSerializeType(physx::general_PxIOStream2::PxFileBuf &stream);
+
+ /**
+ \brief Get stream native platform
+ \param [in] stream stream to be analyzed
+ \param [out] platform stream native platform
+ */
+ static ErrorType peekPlatform(physx::general_PxIOStream2::PxFileBuf &stream, SerializePlatform &platform);
+
+ virtual ~Serializer() {}
+
+ /**
+ \brief Set platform to use in platform-dependent serialization
+ \param [in] platform target platform
+
+ \warning Currently this is used only in binary serializer
+
+ Application running on target platforms may potentially make use of extremely fast
+ inplace deserialization (using method deserializeInplace) on files which were serialized
+ for this platform.
+ */
+ virtual ErrorType setTargetPlatform(const SerializePlatform &platform) = 0;
+
+ /**
+ \brief Sets whether serializer will automatically update
+ objects after deserialization
+ \param [in] doUpdate should automatic update be done?
+
+ \warning Normally you will not need this
+ \warning This is true by default
+ */
+ virtual void setAutoUpdate(bool doUpdate) = 0;
+
+ /**
+ \brief Serialize array of NvParameterized-objects to a stream
+ \param [in] stream the stream to which the object will be serialized
+ \param [in] objs NvParameterized-objects which will be serialized
+ \param [in] nobjs number of objects
+ \param [in] doSerializeMetadata set this to store object metadata in file
+
+ \warning Serialized file may depend on selected target platform
+ */
+ virtual ErrorType serialize(
+ physx::general_PxIOStream2::PxFileBuf &stream,
+ const ::NvParameterized::Interface **objs,
+ uint32_t nobjs,
+ bool doSerializeMetadata = false) = 0;
+
+ /**
+ \brief Peek number of NvParameterized-objects in stream with serialized data
+ \param [in] stream the stream from which the object will be deserialized
+ \param [out] numObjects number of objects
+
+ \warning Not all streams support peeking
+ */
+ virtual ErrorType peekNumObjects(physx::general_PxIOStream2::PxFileBuf &stream, uint32_t &numObjects) = 0;
+
+ /**
+ \brief Peek number of NvParameterized-objects in stream with serialized data
+ \param [in] stream the stream from which objects will be deserialized
+ \param [in] classNames pointer to buffer for resulting names
+ \param [in,out] numClassNames limit on number of returned classNames; number of returned names
+
+ \warning User is responsible for releasing every element of classNames via Traits::strfree()
+ */
+ virtual ErrorType peekClassNames(physx::general_PxIOStream2::PxFileBuf &stream, char **classNames, uint32_t &numClassNames) = 0;
+
+ /**
+ \brief Peek number of NvParameterized-objects in memory buffer with serialized data
+ \param [in] data pointer to memory buffer
+ \param [in] dataLen length of memory buffer
+ \param [out] numObjects number of objects
+ */
+ virtual ErrorType peekNumObjectsInplace(const void *data, uint32_t dataLen, uint32_t &numObjects) = 0;
+
+ /// TODO
+ template < typename T, int bufSize = 8 > class DeserializedResults
+ {
+ T buf[bufSize]; //For small number of objects
+
+ T *objs;
+
+ uint32_t nobjs;
+
+ Traits *traits;
+
+ void clear();
+
+ public:
+
+ PX_INLINE DeserializedResults();
+
+ PX_INLINE ~DeserializedResults();
+
+ /**
+ \brief Copy constructor
+ */
+ PX_INLINE DeserializedResults(const DeserializedResults &data);
+
+ /**
+ \brief Assignment operator
+ */
+ PX_INLINE DeserializedResults &operator =(const DeserializedResults &rhs);
+
+ /**
+ \brief Allocate memory for values
+ */
+ PX_INLINE void init(Traits *traits_, uint32_t nobjs_);
+
+ /**
+ \brief Allocate memory and set values
+ */
+ PX_INLINE void init(Traits *traits_, T *objs_, uint32_t nobjs_);
+
+ /**
+ \brief Number of objects in a container
+ */
+ PX_INLINE uint32_t size() const;
+
+ /**
+ \brief Access individual object in container
+ */
+ PX_INLINE T &operator[](uint32_t i);
+
+ /**
+ \brief Const-access individual object in container
+ */
+ PX_INLINE const T &operator[](uint32_t i) const;
+
+ /**
+ \brief Read all NvParameterized objects in container to buffer outObjs
+ \warning outObjs must be large enough to hold all contained objects
+ */
+ PX_INLINE void getObjects(T *outObjs);
+
+ /**
+ \brief Release all objects
+ */
+ PX_INLINE void releaseAll();
+ };
+
+ /**
+ \brief Container for results of deserialization
+
+ DeserializedData holds array of NvParameterized objects obtained during deserialization.
+ */
+ typedef DeserializedResults< ::NvParameterized::Interface *> DeserializedData;
+
+ /// This class keeps metadata of a single NvParameterized class
+ struct MetadataEntry
+ {
+ /// Class name
+ const char *className;
+
+ /// Class version
+ uint32_t version;
+
+ /// Class metadata
+ Definition *def;
+ };
+
+ /**
+ \brief Container for results of metadata deserialization
+
+ DeserializedMetadata holds array of MetadataEntry obtained during metadata deserialization.
+ */
+ typedef DeserializedResults<MetadataEntry> DeserializedMetadata;
+
+ /**
+ \brief Deserialize metadata from a stream into one or more definitions
+ \param [in] stream the stream from which metadata will be deserialized
+ \param [out] desData storage for deserialized metadata
+ \warning This is a draft implementation!
+ */
+ virtual ErrorType deserializeMetadata(physx::general_PxIOStream2::PxFileBuf &stream, DeserializedMetadata &desData);
+
+ /**
+ \brief Deserialize a stream into one or more NvParameterized objects
+ \param [in] stream the stream from which objects will be deserialized
+ \param [out] desData storage for deserialized data
+ */
+ virtual ErrorType deserialize(physx::general_PxIOStream2::PxFileBuf &stream, DeserializedData &desData);
+
+ /**
+ \brief Deserialize a stream into one or more NvParameterized objects
+ \param [in] stream the stream from which objects will be deserialized
+ \param [out] desData storage for deserialized data
+ \param [out] isUpdated true if any legacy object was updated, false otherwise
+ */
+ virtual ErrorType deserialize(physx::general_PxIOStream2::PxFileBuf &stream, DeserializedData &desData, bool &isUpdated) = 0;
+
+ /**
+ \brief Deserialize memory buffer into one or more NvParameterized objects
+ \param [in] data pointer to serialized data. It should be allocated via Traits.
+ \param [in] dataLen length of serialized data
+ \param [out] desData storage for deserialized data
+
+ \warning Currently only binary serializer supports inplace deserialization
+ \warning Memory must be aligned to 8 byte boundary
+ */
+ virtual ErrorType deserializeInplace(void *data, uint32_t dataLen, DeserializedData &desData);
+
+ /**
+ \brief Deserialize memory buffer into one or more NvParameterized objects
+ \param [in] data pointer to serialized data
+ \param [in] dataLen length of serialized data
+ \param [out] desData storage for deserialized data
+ \param [out] isUpdated true if any legacy object was updated, false otherwise
+
+ \warning Currently only binary serializer supports inplace deserialization
+ \warning Memory must be aligned to the boundary required by the data (see getInplaceAlignment)
+ */
+ virtual ErrorType deserializeInplace(void *data, uint32_t dataLen, DeserializedData &desData, bool &isUpdated) = 0;
+
+ /**
+ \brief Get minimum alignment required for inplace deserialization of data in stream
+ \param [in] stream stream which will be inplace deserialized
+ \param [out] align alignment required for inplace deserialization of stream
+ \note For most of the objects this will return default alignment of 8 bytes
+ */
+ virtual ErrorType peekInplaceAlignment(physx::general_PxIOStream2::PxFileBuf& stream, uint32_t& align) = 0;
+
+ /**
+ \brief Release deserializer and any memory allocations associated with it
+ */
+ virtual void release() = 0;
+};
+
+PX_POP_PACK
+
+} // namespace NvParameterized
+
+#include "NvSerializer.inl"
+
+#endif // NV_SERIALIZER_H