diff options
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/packer/pack_swap_map.c')
-rw-r--r-- | src/VBox/GuestHost/OpenGL/packer/pack_swap_map.c | 278 |
1 files changed, 278 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/packer/pack_swap_map.c b/src/VBox/GuestHost/OpenGL/packer/pack_swap_map.c new file mode 100644 index 00000000..241f899e --- /dev/null +++ b/src/VBox/GuestHost/OpenGL/packer/pack_swap_map.c @@ -0,0 +1,278 @@ +/* Copyright (c) 2001, Stanford University + * All rights reserved + * + * See the file LICENSE.txt for information on redistributing this software. + */ + +#include "packer.h" +#include "cr_opcodes.h" +#include "cr_error.h" + + +/* Note -- for these packets, the ustride and vstride are implicit, + * and are computed into the packet instead of copied. + */ + +static int __gl_Map2NumComponents(GLenum target) +{ + switch(target) + { + case GL_MAP2_VERTEX_3: + case GL_MAP2_NORMAL: + case GL_MAP2_TEXTURE_COORD_3: + return 3; + case GL_MAP2_VERTEX_4: + case GL_MAP2_COLOR_4: + case GL_MAP2_TEXTURE_COORD_4: + return 4; + case GL_MAP2_INDEX: + case GL_MAP2_TEXTURE_COORD_1: + return 1; + case GL_MAP2_TEXTURE_COORD_2: + return 2; + default: + return -1; + } +} + +static int __gl_Map1NumComponents(GLenum target) +{ + switch(target) + { + case GL_MAP1_VERTEX_3: + case GL_MAP1_NORMAL: + case GL_MAP1_TEXTURE_COORD_3: + return 3; + case GL_MAP1_VERTEX_4: + case GL_MAP1_COLOR_4: + case GL_MAP1_TEXTURE_COORD_4: + return 4; + case GL_MAP1_INDEX: + case GL_MAP1_TEXTURE_COORD_1: + return 1; + case GL_MAP1_TEXTURE_COORD_2: + return 2; + default: + return -1; + } +} + +void PACK_APIENTRY crPackMap2dSWAP(GLenum target, GLdouble u1, + GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, + GLint vstride, GLint vorder, const GLdouble *points) +{ + unsigned char *data_ptr; + int u,v; + int comp; + GLdouble *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, + "crPackMap2d(bad target)"); + return; + } + + packet_length += num_components*uorder*vorder*sizeof(*points); + + data_ptr = (unsigned char *) crPackAlloc(packet_length); + + WRITE_DATA(0, GLenum, SWAP32(target)); + WRITE_SWAPPED_DOUBLE(4, u1); + WRITE_SWAPPED_DOUBLE(12, u2); + WRITE_DATA(20, GLint, SWAP32(num_components)); + WRITE_DATA(24, GLint, SWAP32(uorder)); + WRITE_SWAPPED_DOUBLE(28, v1); + WRITE_SWAPPED_DOUBLE(36, v2); + WRITE_DATA(44, GLint, SWAP32(num_components*uorder)); + WRITE_DATA(48, GLint, SWAP32(vorder)); + + dest_data = (GLdouble *) (data_ptr + 52); + src_data = (GLdouble *) points; + for (v = 0 ; v < vorder ; v++) + { + for (u = 0 ; u < uorder ; u++) + { + for (comp = 0 ; comp < num_components ; comp++) + { + WRITE_SWAPPED_DOUBLE(((unsigned char *) dest_data + comp*sizeof(*points)) - data_ptr, *(src_data + comp)); + } + dest_data += num_components; + src_data += ustride; + } + src_data += vstride - ustride*uorder; + } + + crHugePacket(CR_MAP2D_OPCODE, data_ptr); + crPackFree(data_ptr); +} + +void PACK_APIENTRY crPackMap2fSWAP(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; + int comp; + 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, SWAP32(target)); + WRITE_DATA(4, GLuint, SWAPFLOAT(u1)); + WRITE_DATA(8, GLuint, SWAPFLOAT(u2)); + WRITE_DATA(12, GLint, SWAP32(num_components)); + WRITE_DATA(16, GLint, SWAP32(uorder)); + WRITE_DATA(20, GLuint, SWAPFLOAT(v1)); + WRITE_DATA(24, GLuint, SWAPFLOAT(v2)); + WRITE_DATA(28, GLint, SWAP32(num_components*uorder)); + WRITE_DATA(32, GLint, SWAP32(vorder)); + + dest_data = (GLfloat *) (data_ptr + 36); + src_data = (GLfloat *) points; + for (v = 0 ; v < vorder ; v++) + { + for (u = 0 ; u < uorder ; u++) + { + for (comp = 0 ; comp < num_components ; comp++) + { + WRITE_DATA((unsigned char *) dest_data + comp*sizeof(*points) - data_ptr, GLuint, SWAPFLOAT(*(src_data + comp))); + } + dest_data += num_components; + src_data += ustride; + } + src_data += vstride - ustride*uorder; + } + + crHugePacket(CR_MAP2F_OPCODE, data_ptr); + crPackFree(data_ptr); +} + +void PACK_APIENTRY crPackMap1dSWAP(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; + int comp; + + 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, SWAP32(target)); + WRITE_SWAPPED_DOUBLE(4, u1); + WRITE_SWAPPED_DOUBLE(12, u2); + WRITE_DATA(20, GLint, SWAP32(num_components)); + WRITE_DATA(24, GLint, SWAP32(order)); + + dest_data = (GLdouble *) (data_ptr + 28); + src_data = (GLdouble *) points; + for (u = 0 ; u < order ; u++) + { + for (comp = 0 ; comp < num_components ; comp++) + { + WRITE_SWAPPED_DOUBLE((unsigned char *) dest_data + comp*sizeof(*points) - data_ptr, *(src_data + comp)); + } + dest_data += num_components; + src_data += stride; + } + + crHugePacket(CR_MAP1D_OPCODE, data_ptr); + crPackFree(data_ptr); +} + +void PACK_APIENTRY crPackMap1fSWAP(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; + int comp; + + 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, SWAP32(target)); + WRITE_DATA(4, GLuint, SWAPFLOAT(u1)); + WRITE_DATA(8, GLuint, SWAPFLOAT(u2)); + WRITE_DATA(12, GLint, SWAP32(num_components)); + WRITE_DATA(16, GLint, SWAP32(order)); + + dest_data = (GLfloat *) (data_ptr + 20); + src_data = (GLfloat *) points; + for (u = 0 ; u < order ; u++) + { + for (comp = 0 ; comp < num_components ; comp++) + { + WRITE_DATA((unsigned char *) dest_data + comp*sizeof(*points) - data_ptr, GLuint, SWAPFLOAT(*(src_data + comp))); + } + dest_data += num_components; + src_data += stride; + } + + crHugePacket(CR_MAP1F_OPCODE, data_ptr); + crPackFree(data_ptr); +} |