cr_unpack.h revision 66c14dd42d5cc3f7cc1a06db62c37e87602bcac0
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync/* Copyright (c) 2001, Stanford University
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync * All rights reserved.
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync *
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync * See the file LICENSE.txt for information on redistributing this software.
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync */
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync#ifndef CR_UNPACK_H
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#define CR_UNPACK_H
78f327ee942771169c65c91baf789fd10e72b01avboxsync
78f327ee942771169c65c91baf789fd10e72b01avboxsync#include "cr_compiler.h"
78f327ee942771169c65c91baf789fd10e72b01avboxsync#include "cr_spu.h"
78f327ee942771169c65c91baf789fd10e72b01avboxsync#include "cr_protocol.h"
78f327ee942771169c65c91baf789fd10e72b01avboxsync#include "cr_mem.h"
78f327ee942771169c65c91baf789fd10e72b01avboxsync#include "cr_opcodes.h"
78f327ee942771169c65c91baf789fd10e72b01avboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#include <iprt/types.h>
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync#ifdef __cplusplus
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsyncextern "C" {
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#endif
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsyncextern SPUDispatchTable cr_unpackDispatch;
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync/*extern DLLDATA(const unsigned char *) cr_unpackData;*/
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsyncextern DECLEXPORT(const unsigned char *) cr_unpackData;
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsyncDECLEXPORT(void) crUnpackSetReturnPointer( CRNetworkPointer *ptr );
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsyncDECLEXPORT(void) crUnpackSetWritebackPointer( CRNetworkPointer *ptr );
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsyncDECLEXPORT(void) crUnpack( const void *data, const void *opcodes, unsigned int num_opcodes, SPUDispatchTable *table );
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsyncDECLEXPORT(void) crUnpackPush(void);
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsyncDECLEXPORT(void) crUnpackPop(void);
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsynctypedef enum
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync{
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync CR_UNPACK_BUFFER_TYPE_GENERIC = 0,
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync CR_UNPACK_BUFFER_TYPE_CMDBLOCK_BEGIN,
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync CR_UNPACK_BUFFER_TYPE_CMDBLOCK_FLUSH,
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync CR_UNPACK_BUFFER_TYPE_CMDBLOCK_END
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync} CR_UNPACK_BUFFER_TYPE;
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsyncDECLEXPORT(CR_UNPACK_BUFFER_TYPE) crUnpackGetBufferType(const void *opcodes, unsigned int num_opcodes);
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
49a647dcc3bdb0fb4191eab66b617044c8e105b3vboxsyncextern CRNetworkPointer * return_ptr;
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsyncextern CRNetworkPointer * writeback_ptr;
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#if defined(LINUX) || defined(WINDOWS)
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync#define CR_UNALIGNED_ACCESS_OKAY
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#else
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#undef CR_UNALIGNED_ACCESS_OKAY
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync#endif
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsyncDECLEXPORT(double) crReadUnalignedDouble( const void *buffer );
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#define READ_DATA( offset, type ) \
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync *( (const type *) (cr_unpackData + (offset)))
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#ifdef CR_UNALIGNED_ACCESS_OKAY
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#define READ_DOUBLE( offset ) \
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync READ_DATA( offset, GLdouble )
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#else
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync#define READ_DOUBLE( offset ) \
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync crReadUnalignedDouble( cr_unpackData + (offset) )
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync#endif
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync#define READ_NETWORK_POINTER( offset ) \
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync ( cr_unpackData + (offset) )
dee9e52b1688c0617890cbbd8a8488f9f315d1b7vboxsync
7e37c6180f8e3d8ce94f29fcaaaa046d2466e6a3vboxsync/* XXX make this const */
#define DATA_POINTER( offset, type ) \
( (type *) (cr_unpackData + (offset)) )
#define INCR_DATA_PTR( delta ) \
cr_unpackData += (delta)
#define INCR_DATA_PTR_NO_ARGS() \
INCR_DATA_PTR( 4 )
#define INCR_VAR_PTR() \
INCR_DATA_PTR( *((int *) cr_unpackData ) )
#define SET_RETURN_PTR( offset ) do { \
CRDBGPTR_CHECKZ(return_ptr); \
crMemcpy( return_ptr, cr_unpackData + (offset), sizeof( *return_ptr ) ); \
} while (0);
#define SET_WRITEBACK_PTR( offset ) do { \
CRDBGPTR_CHECKZ(writeback_ptr); \
crMemcpy( writeback_ptr, cr_unpackData + (offset), sizeof( *writeback_ptr ) ); \
} while (0);
#ifdef __cplusplus
}
#endif
#endif /* CR_UNPACK_H */