/* Copyright (c) 2001, Stanford University * All rights reserved * * See the file LICENSE.txt for information on redistributing this software. */ #include "packer.h" #include "cr_error.h" #include "cr_string.h" #include "cr_version.h" void PACK_APIENTRY crPackMapBufferARB( GLenum target, GLenum access, void * return_value, int * writeback ) { (void)writeback; (void)return_value; (void)target; (void)access; crWarning("Can't pack MapBufferARB command!"); } void PACK_APIENTRY crPackUnmapBufferARB( GLenum target, GLboolean* return_value, int * writeback ) { (void)target; (void)return_value; (void)writeback; crWarning("Can't pack UnmapBufferARB command!"); } void PACK_APIENTRY crPackBufferDataARB( GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage ) { unsigned char *data_ptr, *start_ptr; int packet_length; packet_length = sizeof(GLenum) + sizeof(target) + sizeof(GLuint) + sizeof(usage) + sizeof(GLint); /*Note: it's valid to pass a NULL pointer here, which tells GPU drivers to allocate memory for the VBO*/ if (data) packet_length += size; start_ptr = data_ptr = (unsigned char *) crPackAlloc( packet_length ); WRITE_DATA_AI(GLenum, CR_BUFFERDATAARB_EXTEND_OPCODE); WRITE_DATA_AI(GLenum, target); WRITE_DATA_AI(GLuint, (GLuint) size); WRITE_DATA_AI(GLenum, usage); WRITE_DATA_AI(GLint, (GLint) (data!=NULL)); if (data) crMemcpy(data_ptr, data, size); crHugePacket( CR_EXTEND_OPCODE, start_ptr ); crPackFree( start_ptr ); } void PACK_APIENTRY crPackBufferSubDataARB( GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data ) { unsigned char *data_ptr, *start_ptr; int packet_length; if (!data) return; packet_length = sizeof(GLenum) + sizeof(target) + sizeof(GLuint) + sizeof(GLuint) + size; start_ptr = data_ptr = (unsigned char *) crPackAlloc(packet_length); WRITE_DATA_AI(GLenum, CR_BUFFERSUBDATAARB_EXTEND_OPCODE); WRITE_DATA_AI(GLenum, target); WRITE_DATA_AI(GLuint, (GLuint) offset); WRITE_DATA_AI(GLuint, (GLuint) size); crMemcpy(data_ptr, data, size); crHugePacket(CR_EXTEND_OPCODE, start_ptr); crPackFree(start_ptr); } void PACK_APIENTRY crPackGetBufferSubDataARB( GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data, int * writeback ) { CR_GET_PACKER_CONTEXT(pc); unsigned char *data_ptr; (void) pc; CR_GET_BUFFERED_POINTER( pc, 36 ); WRITE_DATA( 0, GLint, 36 ); WRITE_DATA( 4, GLenum, CR_GETBUFFERSUBDATAARB_EXTEND_OPCODE ); WRITE_DATA( 8, GLenum, target ); WRITE_DATA( 12, GLuint, (GLuint) offset ); WRITE_DATA( 16, GLuint, (GLuint) size ); WRITE_NETWORK_POINTER( 20, (void *) data ); WRITE_NETWORK_POINTER( 28, (void *) writeback ); WRITE_OPCODE( pc, CR_EXTEND_OPCODE ); CR_CMDBLOCK_CHECK_FLUSH(pc); CR_UNLOCK_PACKER_CONTEXT(pc); } void PACK_APIENTRY crPackDeleteBuffersARB(GLsizei n, const GLuint * buffers) { unsigned char *data_ptr; int packet_length = sizeof(GLenum) + sizeof(n) + n * sizeof(*buffers); if (!buffers) return; data_ptr = (unsigned char *) crPackAlloc(packet_length); WRITE_DATA( 0, GLenum, CR_DELETEBUFFERSARB_EXTEND_OPCODE ); WRITE_DATA( 4, GLsizei, n ); crMemcpy( data_ptr + 8, buffers, n * sizeof(*buffers) ); crHugePacket( CR_EXTEND_OPCODE, data_ptr ); crPackFree( data_ptr ); }