diff options
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/packer/pack_bufferobject.c')
-rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/pack_bufferobject.c | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_bufferobject.c b/src/VBox/GuestHost/OpenGL/packer/pack_bufferobject.c new file mode 100644 index 00000000..d7bb275a --- /dev/null +++ b/src/VBox/GuestHost/OpenGL/packer/pack_bufferobject.c @@ -0,0 +1,121 @@ +/* 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 ); +} |