cr_unpack.h revision e0e0c19eefceaf5d4ec40f9466b58a771f50e799
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifndef CR_UNPACK_H
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CR_UNPACK_H
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_compiler.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_spu.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_protocol.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_mem.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include <iprt/types.h>
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef __cplusplus
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern "C" {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern SPUDispatchTable cr_unpackDispatch;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*extern DLLDATA(const unsigned char *) cr_unpackData;*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern DECLEXPORT(const unsigned char *) cr_unpackData;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(void) crUnpackSetReturnPointer( CRNetworkPointer *ptr );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(void) crUnpackSetWritebackPointer( CRNetworkPointer *ptr );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(void) crUnpack( const void *data, const void *opcodes, unsigned int num_opcodes, SPUDispatchTable *table );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(void) crUnpackPush(void);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(void) crUnpackPop(void);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern CRNetworkPointer * return_ptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern CRNetworkPointer * writeback_ptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#if defined(LINUX) || defined(WINDOWS)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CR_UNALIGNED_ACCESS_OKAY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#undef CR_UNALIGNED_ACCESS_OKAY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncDECLEXPORT(double) crReadUnalignedDouble( const void *buffer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define READ_DATA( offset, type ) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *( (const type *) (cr_unpackData + (offset)))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef CR_UNALIGNED_ACCESS_OKAY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define READ_DOUBLE( offset ) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync READ_DATA( offset, GLdouble )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define READ_DOUBLE( offset ) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crReadUnalignedDouble( cr_unpackData + (offset) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define READ_NETWORK_POINTER( offset ) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ( cr_unpackData + (offset) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* XXX make this const */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define DATA_POINTER( offset, type ) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync ( (type *) (cr_unpackData + (offset)) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define INCR_DATA_PTR( delta ) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync cr_unpackData += (delta)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define INCR_DATA_PTR_NO_ARGS() \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync INCR_DATA_PTR( 4 )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define INCR_VAR_PTR() \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync INCR_DATA_PTR( *((int *) cr_unpackData ) )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define SET_RETURN_PTR( offset ) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy( return_ptr, cr_unpackData + (offset), sizeof( *return_ptr ) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define SET_WRITEBACK_PTR( offset ) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy( writeback_ptr, cr_unpackData + (offset), sizeof( *writeback_ptr ) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef __cplusplus
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif /* CR_UNPACK_H */