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_mem.h"
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#include "cr_glstate.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsyncstatic unsigned char * __gl_HandlePixelMapData(GLenum map, GLsizei mapsize, int size_of_value, const GLvoid *values)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
af8d59d05d72f134aeea62712f1286b369807d52vboxsync int nodata = (values == NULL) || crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB);
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync int packet_length =
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync sizeof( map ) +
e761514762c8705557b347266d54ade68888537cvboxsync sizeof( mapsize ) + sizeof(int) + sizeof(GLint);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync unsigned char *data_ptr;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync if (!nodata)
af8d59d05d72f134aeea62712f1286b369807d52vboxsync {
af8d59d05d72f134aeea62712f1286b369807d52vboxsync packet_length += mapsize*size_of_value;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync }
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync data_ptr = (unsigned char *) crPackAlloc( packet_length );
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync WRITE_DATA( 0, GLenum, map );
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync WRITE_DATA( 4, GLsizei, mapsize );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync WRITE_DATA( 8, int, nodata);
e761514762c8705557b347266d54ade68888537cvboxsync WRITE_DATA( 12, GLint, (GLint)(uintptr_t)values);
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync if (!nodata)
af8d59d05d72f134aeea62712f1286b369807d52vboxsync {
af8d59d05d72f134aeea62712f1286b369807d52vboxsync crMemcpy( data_ptr + 16, values, mapsize*size_of_value );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync }
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync return data_ptr;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid PACK_APIENTRY crPackPixelMapfv(GLenum map, GLsizei mapsize,
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync const GLfloat *values)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync unsigned char *data_ptr = __gl_HandlePixelMapData( map, mapsize, sizeof( *values ), values );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync crHugePacket( CR_PIXELMAPFV_OPCODE, data_ptr );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crPackFree( data_ptr );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid PACK_APIENTRY crPackPixelMapuiv(GLenum map, GLsizei mapsize,
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync const GLuint *values)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync unsigned char *data_ptr = __gl_HandlePixelMapData( map, mapsize, sizeof( *values ), values );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync crHugePacket( CR_PIXELMAPUIV_OPCODE, data_ptr );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crPackFree( data_ptr );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid PACK_APIENTRY crPackPixelMapusv(GLenum map, GLsizei mapsize,
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync const GLushort *values)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync unsigned char *data_ptr = __gl_HandlePixelMapData( map, mapsize, sizeof( *values ), values );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
67aa9dbb38bab2fcc7851b02546d7237be407d27vboxsync crHugePacket( CR_PIXELMAPUSV_OPCODE, data_ptr );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crPackFree( data_ptr );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}