pack_map.c revision a0d1e40cc56a54314af0a1a4b5e13905ffd78393
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync/* Copyright (c) 2001, Stanford University
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync * All rights reserved
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync *
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync * See the file LICENSE.txt for information on redistributing this software.
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync */
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync#include "packer.h"
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync#include "cr_opcodes.h"
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync#include "cr_error.h"
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync#include "cr_mem.h"
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync/* Note -- for these packets, the ustride and vstride are implicit,
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync * and are computed into the packet instead of copied.
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync */
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync
ca551aca153d6df494985b5281c573ba2e3eb474vboxsyncstatic int __gl_Map2NumComponents( GLenum target )
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync{
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync switch( target )
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync {
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_3:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_NORMAL:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_TEXTURE_COORD_3:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync return 3;
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_4:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_COLOR_4:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_TEXTURE_COORD_4:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB0_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB1_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB2_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB3_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB4_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB5_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB6_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB7_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB8_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB9_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB10_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB11_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB12_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB13_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB14_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_ATTRIB15_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB0_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB1_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB2_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB3_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB4_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB5_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB6_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB7_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB8_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB9_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB10_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB11_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB12_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB13_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB14_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_VERTEX_ATTRIB15_4_NV:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync return 4;
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_INDEX:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_TEXTURE_COORD_1:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync return 1;
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP2_TEXTURE_COORD_2:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync return 2;
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync default:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync return -1;
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync }
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync}
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync
ca551aca153d6df494985b5281c573ba2e3eb474vboxsyncstatic int __gl_Map1NumComponents( GLenum target )
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync{
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync switch( target )
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync {
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_3:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_NORMAL:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_TEXTURE_COORD_3:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync return 3;
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_VERTEX_4:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_COLOR_4:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync case GL_MAP1_TEXTURE_COORD_4:
ca551aca153d6df494985b5281c573ba2e3eb474vboxsync return 4;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync case GL_MAP1_INDEX:
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync case GL_MAP1_TEXTURE_COORD_1:
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync return 1;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync case GL_MAP1_TEXTURE_COORD_2:
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync return 2;
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync default:
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync return -1;
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync }
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync}
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsyncvoid PACK_APIENTRY crPackMap2d(GLenum target, GLdouble u1,
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2,
81b3101ea5e60964f67c97185bbd43dbf75c5ab5vboxsync GLint vstride, GLint vorder, const GLdouble *points)
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync{
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync unsigned char *data_ptr;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync int u,v;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync GLdouble *dest_data, *src_data;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync int packet_length =
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync sizeof( target ) +
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync sizeof( u1 ) +
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync sizeof( u2 ) +
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync sizeof( uorder ) +
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync sizeof( ustride ) +
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync sizeof( v1 ) +
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync sizeof( v2 ) +
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync sizeof( vorder ) +
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync sizeof( vstride );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync int num_components = __gl_Map2NumComponents( target );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync if (num_components < 0)
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync {
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync __PackError( __LINE__, __FILE__, GL_INVALID_ENUM,
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync "crPackMap2d(bad target)" );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync return;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync }
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync packet_length += num_components*uorder*vorder*sizeof( *points );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync data_ptr = (unsigned char *) crPackAlloc( packet_length );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync WRITE_DATA( 0, GLenum, target );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync WRITE_DOUBLE( 4, u1 );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync WRITE_DOUBLE( 12, u2 );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync WRITE_DATA( 20, GLint, num_components );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync WRITE_DATA( 24, GLint, uorder );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync WRITE_DOUBLE( 28, v1 );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync WRITE_DOUBLE( 36, v2 );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync WRITE_DATA( 44, GLint, num_components*uorder );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync WRITE_DATA( 48, GLint, vorder );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync dest_data = (GLdouble *) (data_ptr + 52);
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync src_data = (GLdouble *) points;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync for (v = 0 ; v < vorder ; v++)
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync {
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync for (u = 0 ; u < uorder ; u++)
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync {
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync crMemcpy( dest_data, src_data, num_components * sizeof( *points ) );
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync dest_data += num_components;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync src_data += ustride;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync }
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync src_data += vstride - ustride*uorder;
bd810d58866067df322ea7f4a4627d9bdebb70d3vboxsync }
crHugePacket( CR_MAP2D_OPCODE, data_ptr );
crPackFree( data_ptr );
}
void PACK_APIENTRY crPackMap2f(GLenum target, GLfloat u1,
GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2,
GLint vstride, GLint vorder, const GLfloat *points)
{
unsigned char *data_ptr;
int u,v;
GLfloat *dest_data, *src_data;
int packet_length =
sizeof( target ) +
sizeof( u1 ) +
sizeof( u2 ) +
sizeof( uorder ) +
sizeof( ustride ) +
sizeof( v1 ) +
sizeof( v2 ) +
sizeof( vorder ) +
sizeof( vstride );
int num_components = __gl_Map2NumComponents( target );
if (num_components < 0)
{
__PackError( __LINE__, __FILE__, GL_INVALID_ENUM,
"crPackMap2f(bad target)" );
return;
}
packet_length += num_components*uorder*vorder*sizeof( *points );
data_ptr = (unsigned char *) crPackAlloc( packet_length );
WRITE_DATA( 0, GLenum, target );
WRITE_DATA( 4, GLfloat, u1 );
WRITE_DATA( 8, GLfloat, u2 );
WRITE_DATA( 12, GLint, num_components );
WRITE_DATA( 16, GLint, uorder );
WRITE_DATA( 20, GLfloat, v1 );
WRITE_DATA( 24, GLfloat, v2 );
WRITE_DATA( 28, GLint, num_components*uorder );
WRITE_DATA( 32, GLint, vorder );
dest_data = (GLfloat *) (data_ptr + 36);
src_data = (GLfloat *) points;
for (v = 0 ; v < vorder ; v++)
{
for (u = 0 ; u < uorder ; u++)
{
crMemcpy( dest_data, src_data, num_components * sizeof( *points ) );
dest_data += num_components;
src_data += ustride;
}
src_data += vstride - ustride*uorder;
}
crHugePacket( CR_MAP2F_OPCODE, data_ptr );
crPackFree( data_ptr );
}
void PACK_APIENTRY crPackMap1d( GLenum target, GLdouble u1,
GLdouble u2, GLint stride, GLint order, const GLdouble *points )
{
unsigned char *data_ptr;
int packet_length =
sizeof( target ) +
sizeof( u1 ) +
sizeof( u2 ) +
sizeof( stride ) +
sizeof( order );
int num_components = __gl_Map1NumComponents( target );
GLdouble *src_data, *dest_data;
int u;
if (num_components < 0)
{
__PackError( __LINE__, __FILE__, GL_INVALID_ENUM,
"crPackMap1d(bad target)" );
return;
}
packet_length += num_components * order * sizeof( *points );
data_ptr = (unsigned char *) crPackAlloc( packet_length );
WRITE_DATA( 0, GLenum, target );
WRITE_DOUBLE( 4, u1 );
WRITE_DOUBLE( 12, u2 );
WRITE_DATA( 20, GLint, num_components );
WRITE_DATA( 24, GLint, order );
dest_data = (GLdouble *) (data_ptr + 28);
src_data = (GLdouble *) points;
for (u = 0 ; u < order ; u++)
{
crMemcpy( dest_data, src_data, num_components * sizeof( *points ) );
dest_data += num_components;
src_data += stride;
}
crHugePacket( CR_MAP1D_OPCODE, data_ptr );
crPackFree( data_ptr );
}
void PACK_APIENTRY crPackMap1f( GLenum target, GLfloat u1,
GLfloat u2, GLint stride, GLint order, const GLfloat *points )
{
unsigned char *data_ptr;
int packet_length =
sizeof( target ) +
sizeof( u1 ) +
sizeof( u2 ) +
sizeof( stride ) +
sizeof( order );
int num_components = __gl_Map1NumComponents( target );
GLfloat *src_data, *dest_data;
int u;
if (num_components < 0)
{
__PackError( __LINE__, __FILE__, GL_INVALID_ENUM,
"crPackMap1f(bad target)" );
return;
}
packet_length += num_components * order * sizeof( *points );
data_ptr = (unsigned char *) crPackAlloc( packet_length );
WRITE_DATA( 0, GLenum, target );
WRITE_DATA( 4, GLfloat, u1 );
WRITE_DATA( 8, GLfloat, u2 );
WRITE_DATA( 12, GLint, num_components );
WRITE_DATA( 16, GLint, order );
dest_data = (GLfloat *) (data_ptr + 20);
src_data = (GLfloat *) points;
for (u = 0 ; u < order ; u++)
{
crMemcpy( dest_data, src_data, num_components * sizeof( *points ) );
dest_data += num_components;
src_data += stride;
}
crHugePacket( CR_MAP1F_OPCODE, data_ptr );
crPackFree( data_ptr );
}