pack_swap_lists.c revision a0d1e40cc56a54314af0a1a4b5e13905ffd78393
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync/* Copyright (c) 2001, Stanford University
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * All rights reserved
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync *
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync * See the file LICENSE.txt for information on redistributing this software.
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync */
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync#include "packer.h"
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync#include "cr_error.h"
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync#include "cr_mem.h"
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncstatic int __gl_CallListsNumBytes( GLenum type )
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync{
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync switch( type )
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync {
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync case GL_BYTE:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync case GL_UNSIGNED_BYTE:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync case GL_2_BYTES:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync return 1;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync case GL_SHORT:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync case GL_UNSIGNED_SHORT:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync case GL_3_BYTES:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync return 2;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync case GL_INT:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync case GL_UNSIGNED_INT:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync case GL_FLOAT:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync case GL_4_BYTES:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync return 4;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync default:
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync return -1;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync }
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync}
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsyncvoid PACK_APIENTRY crPackCallListsSWAP(GLint n, GLenum type,
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync const GLvoid *lists )
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync{
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync unsigned char *data_ptr;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync int packet_length;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync GLshort *shortPtr;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync GLint *intPtr;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync int i;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync int bytesPerList = __gl_CallListsNumBytes( type );
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync int numBytes = bytesPerList * n;
14ea49401f3c8c61422aefbda43809e275f60c6cvboxsync
if (numBytes < 0)
{
__PackError( __LINE__, __FILE__, GL_INVALID_ENUM,
"crPackCallLists(bad type)" );
return;
}
packet_length = sizeof( n ) +
sizeof( type ) +
numBytes;
data_ptr = (unsigned char *) crPackAlloc( packet_length );
WRITE_DATA( 0, GLint, SWAP32(n) );
WRITE_DATA( 4, GLenum, SWAP32(type) );
crMemcpy( data_ptr + 8, lists, numBytes );
shortPtr = (GLshort *) (data_ptr + 8);
intPtr = (GLint *) (data_ptr + 8);
if (bytesPerList > 1)
{
for ( i = 0 ; i < n ; i++)
{
switch( bytesPerList )
{
case 2:
*shortPtr = SWAP16(*shortPtr);
shortPtr+=1;
break;
case 4:
*intPtr = SWAP32(*intPtr);
intPtr+=1;
break;
}
}
}
crHugePacket( CR_CALLLISTS_OPCODE, data_ptr );
crPackFree( data_ptr );
}
void PACK_APIENTRY crPackNewListSWAP( GLuint list, GLenum mode )
{
GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
(void) pc;
GET_BUFFERED_POINTER( pc, 16 );
WRITE_DATA( 0, GLint, SWAP32(16) );
WRITE_DATA( 4, GLenum, SWAP32(CR_NEWLIST_EXTEND_OPCODE) );
WRITE_DATA( 8, GLuint, SWAP32(list) );
WRITE_DATA( 12, GLenum, SWAP32(mode) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
pc->buffer.in_List = GL_TRUE;
pc->buffer.holds_List = GL_TRUE;
}
void PACK_APIENTRY crPackEndListSWAP( void )
{
GET_PACKER_CONTEXT(pc);
unsigned char *data_ptr;
(void) pc;
GET_BUFFERED_POINTER( pc, 8 );
WRITE_DATA( 0, GLint, SWAP32(8) );
WRITE_DATA( 4, GLenum, SWAP32(CR_ENDLIST_EXTEND_OPCODE) );
WRITE_OPCODE( pc, CR_EXTEND_OPCODE );
pc->buffer.in_List = GL_FALSE;
}