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#include "packer.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_opcodes.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_mem.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_string.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* XXX duplicated in unpack_context.c */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define DISPLAY_NAME_LEN 256
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define WRITE_BYTES( offset, data, len ) \
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemcpy( data_ptr + (offset), data, len )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid PACK_APIENTRY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrPackCreateContext( const char *dpyName, GLint visual, GLint shareCtx,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint *return_value, int *writeback )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char displayName[DISPLAY_NAME_LEN];
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_GET_PACKER_CONTEXT(pc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned char *data_ptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int len = DISPLAY_NAME_LEN + 32;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* clear the buffer, to silence valgrind */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemZero(displayName, DISPLAY_NAME_LEN);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dpyName) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStrncpy( displayName, dpyName, DISPLAY_NAME_LEN );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync displayName[DISPLAY_NAME_LEN - 1] = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync displayName[0] = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_GET_BUFFERED_POINTER(pc, len);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( 0, GLint, len );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( 4, GLenum, CR_CREATECONTEXT_EXTEND_OPCODE );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_BYTES( 8, displayName, DISPLAY_NAME_LEN );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( DISPLAY_NAME_LEN + 8, GLint, visual );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( DISPLAY_NAME_LEN + 12, GLint, shareCtx );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_NETWORK_POINTER( DISPLAY_NAME_LEN + 16, (void *) return_value );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_NETWORK_POINTER( DISPLAY_NAME_LEN + 24, (void *) writeback );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
66c14dd42d5cc3f7cc1a06db62c37e87602bcac0vboxsync CR_CMDBLOCK_CHECK_FLUSH(pc);
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_UNLOCK_PACKER_CONTEXT(pc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid PACK_APIENTRY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrPackCreateContextSWAP( const char *dpyName, GLint visual, GLint shareCtx,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint *return_value, int *writeback )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char displayName[DISPLAY_NAME_LEN];
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_GET_PACKER_CONTEXT(pc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned char *data_ptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int len = DISPLAY_NAME_LEN + 32;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* clear the buffer, to silence valgrind */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemZero(displayName, DISPLAY_NAME_LEN);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dpyName) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStrncpy( displayName, dpyName, DISPLAY_NAME_LEN );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync displayName[DISPLAY_NAME_LEN - 1] = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync displayName[0] = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_GET_BUFFERED_POINTER(pc, len);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( 0, GLint, SWAP32(len) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( 4, GLenum, SWAP32(CR_CREATECONTEXT_EXTEND_OPCODE) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_BYTES( 8, displayName, DISPLAY_NAME_LEN );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( DISPLAY_NAME_LEN + 8, GLenum, SWAP32(visual) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( DISPLAY_NAME_LEN + 12, GLenum, SWAP32(shareCtx) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_NETWORK_POINTER( DISPLAY_NAME_LEN + 16, (void *) return_value );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_NETWORK_POINTER( DISPLAY_NAME_LEN + 24, (void *) writeback );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
66c14dd42d5cc3f7cc1a06db62c37e87602bcac0vboxsync CR_CMDBLOCK_CHECK_FLUSH(pc);
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_UNLOCK_PACKER_CONTEXT(pc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid PACK_APIENTRY crPackWindowCreate( const char *dpyName, GLint visBits, GLint *return_value, int *writeback )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char displayName[DISPLAY_NAME_LEN];
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_GET_PACKER_CONTEXT(pc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned char *data_ptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* clear the buffer, to silence valgrind */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemZero(displayName, DISPLAY_NAME_LEN);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dpyName) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStrncpy( displayName, dpyName, DISPLAY_NAME_LEN );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync displayName[DISPLAY_NAME_LEN - 1] = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync displayName[0] = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_GET_BUFFERED_POINTER(pc, DISPLAY_NAME_LEN + 28 );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( 0, GLint, 28 );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( 4, GLenum, CR_WINDOWCREATE_EXTEND_OPCODE );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_BYTES( 8, displayName, DISPLAY_NAME_LEN );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( DISPLAY_NAME_LEN + 8, GLint, visBits );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_NETWORK_POINTER( DISPLAY_NAME_LEN + 12, (void *) return_value );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_NETWORK_POINTER( DISPLAY_NAME_LEN + 20, (void *) writeback );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
66c14dd42d5cc3f7cc1a06db62c37e87602bcac0vboxsync CR_CMDBLOCK_CHECK_FLUSH(pc);
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_UNLOCK_PACKER_CONTEXT(pc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid PACK_APIENTRY crPackWindowCreateSWAP( const char *dpyName, GLint visBits, GLint *return_value, int *writeback )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync char displayName[DISPLAY_NAME_LEN];
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_GET_PACKER_CONTEXT(pc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync unsigned char *data_ptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* clear the buffer, to silence valgrind */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crMemZero(displayName, DISPLAY_NAME_LEN);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (dpyName) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStrncpy( displayName, dpyName, DISPLAY_NAME_LEN );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync displayName[DISPLAY_NAME_LEN - 1] = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync displayName[0] = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_GET_BUFFERED_POINTER(pc, DISPLAY_NAME_LEN + 28 );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( 0, GLint, SWAP32(28) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( 4, GLenum, SWAP32(CR_WINDOWCREATE_EXTEND_OPCODE) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_BYTES( 8, displayName, DISPLAY_NAME_LEN );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_DATA( DISPLAY_NAME_LEN + 8, GLint, SWAP32(visBits) );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_NETWORK_POINTER( DISPLAY_NAME_LEN + 12, (void *) return_value );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_NETWORK_POINTER( DISPLAY_NAME_LEN + 20, (void *) writeback );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
66c14dd42d5cc3f7cc1a06db62c37e87602bcac0vboxsync CR_CMDBLOCK_CHECK_FLUSH(pc);
2f44080df90cb90c1e524d97c8e327b40298f3c6vboxsync CR_UNLOCK_PACKER_CONTEXT(pc);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}