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"
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync#include "cr_opcodes.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
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsynctypedef enum
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync{
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync CR_UNPACK_BUFFER_TYPE_GENERIC = 0,
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync CR_UNPACK_BUFFER_TYPE_CMDBLOCK_BEGIN,
66c14dd42d5cc3f7cc1a06db62c37e87602bcac0vboxsync CR_UNPACK_BUFFER_TYPE_CMDBLOCK_FLUSH,
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync CR_UNPACK_BUFFER_TYPE_CMDBLOCK_END
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync} CR_UNPACK_BUFFER_TYPE;
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync
916fa1ce1597c87cd10eb4b8077fe31f9089f000vboxsyncDECLEXPORT(CR_UNPACK_BUFFER_TYPE) crUnpackGetBufferType(const void *opcodes, unsigned int num_opcodes);
f3f69e0e8d6a713566e129aa3ab321b1e6b07fbcvboxsync
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
2609df5222cfcceb51ec536b2e3173b7227a232avboxsync#define SET_RETURN_PTR( offset ) do { \
2609df5222cfcceb51ec536b2e3173b7227a232avboxsync CRDBGPTR_CHECKZ(return_ptr); \
2609df5222cfcceb51ec536b2e3173b7227a232avboxsync crMemcpy( return_ptr, cr_unpackData + (offset), sizeof( *return_ptr ) ); \
2609df5222cfcceb51ec536b2e3173b7227a232avboxsync } while (0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
2609df5222cfcceb51ec536b2e3173b7227a232avboxsync
2609df5222cfcceb51ec536b2e3173b7227a232avboxsync#define SET_WRITEBACK_PTR( offset ) do { \
2609df5222cfcceb51ec536b2e3173b7227a232avboxsync CRDBGPTR_CHECKZ(writeback_ptr); \
2609df5222cfcceb51ec536b2e3173b7227a232avboxsync crMemcpy( writeback_ptr, cr_unpackData + (offset), sizeof( *writeback_ptr ) ); \
2609df5222cfcceb51ec536b2e3173b7227a232avboxsync } while (0);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef __cplusplus
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif /* CR_UNPACK_H */