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 "cr_spu.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "chromium.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_error.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_mem.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_net.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "server_dispatch.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "server.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic GLint __sizeQuery( GLenum map )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
af8d59d05d72f134aeea62712f1286b369807d52vboxsync GLint get_values;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync /* Windows compiler gets mad if variables might be uninitialized */
af8d59d05d72f134aeea62712f1286b369807d52vboxsync GLenum newmap = GL_PIXEL_MAP_I_TO_I_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync switch( map )
af8d59d05d72f134aeea62712f1286b369807d52vboxsync {
af8d59d05d72f134aeea62712f1286b369807d52vboxsync case GL_PIXEL_MAP_I_TO_I:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync newmap = GL_PIXEL_MAP_I_TO_I_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync case GL_PIXEL_MAP_S_TO_S:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync newmap = GL_PIXEL_MAP_S_TO_S_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync case GL_PIXEL_MAP_I_TO_R:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync newmap = GL_PIXEL_MAP_I_TO_R_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync case GL_PIXEL_MAP_I_TO_G:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync newmap = GL_PIXEL_MAP_I_TO_G_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync case GL_PIXEL_MAP_I_TO_B:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync newmap = GL_PIXEL_MAP_I_TO_B_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync case GL_PIXEL_MAP_I_TO_A:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync newmap = GL_PIXEL_MAP_I_TO_A_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync case GL_PIXEL_MAP_R_TO_R:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync newmap = GL_PIXEL_MAP_R_TO_R_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync case GL_PIXEL_MAP_G_TO_G:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync newmap = GL_PIXEL_MAP_G_TO_G_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync case GL_PIXEL_MAP_B_TO_B:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync newmap = GL_PIXEL_MAP_B_TO_B_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync case GL_PIXEL_MAP_A_TO_A:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync newmap = GL_PIXEL_MAP_A_TO_A_SIZE;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync default:
af8d59d05d72f134aeea62712f1286b369807d52vboxsync crError( "Bad map in crServerDispatchGetPixelMap: %d", map );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync break;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync }
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync cr_server.head_spu->dispatch_table.GetIntegerv( newmap, &get_values );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync return get_values;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchGetPixelMapfv( GLenum map, GLfloat *values )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#ifdef CR_ARB_pixel_buffer_object
af8d59d05d72f134aeea62712f1286b369807d52vboxsync if (crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
af8d59d05d72f134aeea62712f1286b369807d52vboxsync {
af8d59d05d72f134aeea62712f1286b369807d52vboxsync GLvoid *pbo_offset;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
e761514762c8705557b347266d54ade68888537cvboxsync pbo_offset = (GLfloat*) ((uintptr_t) *((GLint*)values));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync cr_server.head_spu->dispatch_table.GetPixelMapfv( map, pbo_offset );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync }
af8d59d05d72f134aeea62712f1286b369807d52vboxsync else
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#endif
af8d59d05d72f134aeea62712f1286b369807d52vboxsync {
af8d59d05d72f134aeea62712f1286b369807d52vboxsync int size = sizeof( GLfloat );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync int tabsize = __sizeQuery( map );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync GLfloat *local_values;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync size *= tabsize;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync local_values = (GLfloat*)crAlloc( size );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync cr_server.head_spu->dispatch_table.GetPixelMapfv( map, local_values );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync crServerReturnValue( local_values, size );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync crFree( local_values );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchGetPixelMapuiv( GLenum map, GLuint *values )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#ifdef CR_ARB_pixel_buffer_object
af8d59d05d72f134aeea62712f1286b369807d52vboxsync if (crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
af8d59d05d72f134aeea62712f1286b369807d52vboxsync {
af8d59d05d72f134aeea62712f1286b369807d52vboxsync GLvoid *pbo_offset;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e761514762c8705557b347266d54ade68888537cvboxsync pbo_offset = (GLuint*) ((uintptr_t) *((GLint*)values));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync cr_server.head_spu->dispatch_table.GetPixelMapuiv( map, pbo_offset );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync }
af8d59d05d72f134aeea62712f1286b369807d52vboxsync else
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#endif
af8d59d05d72f134aeea62712f1286b369807d52vboxsync {
af8d59d05d72f134aeea62712f1286b369807d52vboxsync int size = sizeof( GLuint );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync int tabsize = __sizeQuery( map );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync GLuint *local_values;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync size *= tabsize;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync local_values = (GLuint*)crAlloc( size );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync cr_server.head_spu->dispatch_table.GetPixelMapuiv( map, local_values );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync crServerReturnValue( local_values, size );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync crFree( local_values );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid SERVER_DISPATCH_APIENTRY crServerDispatchGetPixelMapusv( GLenum map, GLushort *values )
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#ifdef CR_ARB_pixel_buffer_object
af8d59d05d72f134aeea62712f1286b369807d52vboxsync if (crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
af8d59d05d72f134aeea62712f1286b369807d52vboxsync {
af8d59d05d72f134aeea62712f1286b369807d52vboxsync GLvoid *pbo_offset;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
e761514762c8705557b347266d54ade68888537cvboxsync pbo_offset = (GLushort*) ((uintptr_t) *((GLint*)values));
af8d59d05d72f134aeea62712f1286b369807d52vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync cr_server.head_spu->dispatch_table.GetPixelMapusv( map, pbo_offset );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync }
af8d59d05d72f134aeea62712f1286b369807d52vboxsync else
af8d59d05d72f134aeea62712f1286b369807d52vboxsync#endif
af8d59d05d72f134aeea62712f1286b369807d52vboxsync {
af8d59d05d72f134aeea62712f1286b369807d52vboxsync int size = sizeof( GLushort );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync int tabsize = __sizeQuery( map );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync GLushort *local_values;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync size *= tabsize;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync local_values = (GLushort*)crAlloc( size );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsync cr_server.head_spu->dispatch_table.GetPixelMapusv( map, local_values );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync crServerReturnValue( local_values, size );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync crFree( local_values );
af8d59d05d72f134aeea62712f1286b369807d52vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}