123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- /*
- ===========================================================================
- Doom 3 BFG Edition GPL Source Code
- Copyright (C) 1993-2012 id Software LLC, a ZeniMax Media company.
- This file is part of the Doom 3 BFG Edition GPL Source Code ("Doom 3 BFG Edition Source Code").
- Doom 3 BFG Edition Source Code is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- Doom 3 BFG Edition Source Code is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with Doom 3 BFG Edition Source Code. If not, see <http://www.gnu.org/licenses/>.
- In addition, the Doom 3 BFG Edition Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 BFG Edition Source Code. If not, please request a copy in writing from id Software at the address below.
- If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
- ===========================================================================
- */
- #ifndef __SNAPSHOT_JOBS_H__
- #define __SNAPSHOT_JOBS_H__
- #include "LightweightCompression.h"
- //#define SNAPSHOT_CHECKSUMS
- typedef int32 objectSize_t;
- static const objectSize_t SIZE_STALE = MAX_TYPE( objectSize_t ); // Special size to indicate object went stale
- static const objectSize_t SIZE_NOT_STALE = MAX_TYPE( objectSize_t ) - 1; // Special size to indicate object is no longer stale
- static const int RLE_COMPRESSION_PADDING = 16; // Padding to accommodate possible enlargement due to zlre compression
- // OBJ_DEST_SIZE_ALIGN16 returns the total space needed to store an object for reading/writing during jobs
- #define OBJ_DEST_SIZE_ALIGN16( s ) ( ( ( s ) + 15 ) & ~15 )
- static const uint32 OBJ_VIS_STALE = ( 1 << 0 ); // Object went stale
- static const uint32 OBJ_VIS_NOT_STALE = ( 1 << 1 ); // Object no longer stale
- static const uint32 OBJ_NEW = ( 1 << 2 ); // New object (not in the last snap)
- static const uint32 OBJ_DELETED = ( 1 << 3 ); // Object was deleted (not going to be in the new snap)
- static const uint32 OBJ_DIFFERENT = ( 1 << 4 ); // Objects are in both snaps, but different
- static const uint32 OBJ_SAME = ( 1 << 5 ); // Objects are in both snaps, and are the same (we don't send these, which means ack)
- // This struct is used to communicate data from the obj jobs to the lzw job
- struct ALIGNTYPE16 objHeader_t {
- int32 objID; // Id of object.
- int32 size; // Size data object holds (will be 0 if the obj is being deleted)
- int32 csize; // Size after zrle compression
- uint32 flags; // Flags used to communicate state from obj job to lzw delta job
- uint8 * data; // Data ptr to obj memory
- #ifdef SNAPSHOT_CHECKSUMS
- uint32 checksum; // Checksum before compression, used for sanity checking
- #endif
- };
- struct objJobState_t {
- uint8 valid;
- uint8 * data;
- uint16 size;
- uint16 objectNum;
- uint32 visMask;
- };
- // Input to initial jobs that produce delta'd zrle compressed versions of all the snap obj's
- struct ALIGNTYPE16 objParms_t {
- // Input
- uint8 visIndex;
- objJobState_t newState;
- objJobState_t oldState;
- // Output
- objHeader_t * destHeader;
- uint8 * dest;
- };
-
- // Output from the job that takes the results of the delta'd zrle obj's.
- // This struct contains the start of where the final delta packet data is within lzwMem
- struct ALIGNTYPE16 lzwDelta_t {
- int offset; // Offset into lzwMem
- int size;
- int snapSequence;
- };
-
- // Struct used to maintain state that needs to persist across lzw jobs
- struct ALIGNTYPE16 lzwInOutData_t {
- int numlzwDeltas; // Num pending deltas written
- bool fullSnap; // True if entire snap was written out in one delta
- lzwDelta_t * lzwDeltas; // Info about each final delta packet written out
- int maxlzwDeltas; // Max lzw deltas
- uint8 * lzwMem; // Resulting final lzw delta packet data
- int maxlzwMem; // Max size in bytes that can fit in lzwMem
- int lzwDmaOut; // How much of lzwMem needs to be DMA'ed back out
- int lzwBytes; // Final delta packet bytes written
- int optimalLength; // Optimal length of lzw streams
- int snapSequence;
- uint16 lastObjId; // Last obj id written out
- lzwCompressionData_t * lzwData;
- };
- // Input to the job that takes the results of the delta'd zrle obj's, and turns them into lzw delta packets
- struct ALIGNTYPE16 lzwParm_t {
- // Input
- int numObjects; // Number of objects this job needs to process
- objHeader_t * headers; // Object headers
- int curTime; // Cur snap time
- int baseTime; // Base snap time
- int baseSequence;
- bool saveDictionary;
- bool fragmented; // This lzw stream should continue where the last one left off
- // In/Out
- lzwInOutData_t * ioData; // In/Out
- };
- extern void SnapshotObjectJob( objParms_t * parms );
- extern void LZWJob( lzwParm_t * parm );
- #endif // __SNAPSHOT_JOBS_H__
|