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_error.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "unpack_extend.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "unpacker.h"
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync#include "cr_glstate.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/**
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * \mainpage Unpacker
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * \section UnpackerIntroduction Introduction
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Chromium consists of all the top-level files in the cr
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * directory. The unpacker module basically takes care of API dispatch,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * and OpenGL state management.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendVertexPointer(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLint size = READ_DATA( 8, GLint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLenum type = READ_DATA( 12, GLenum );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 16, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = (GLintptrARB) READ_DATA( 20, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.VertexPointer( size, type, stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendTexCoordPointer(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLint size = READ_DATA( 8, GLint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLenum type = READ_DATA( 12, GLenum );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 16, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = READ_DATA( 20, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.TexCoordPointer( size, type, stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendNormalPointer(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLenum type = READ_DATA( 8, GLenum );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 12, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = READ_DATA( 16, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.NormalPointer( type, stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendIndexPointer(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLenum type = READ_DATA( 8, GLenum );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 12, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = READ_DATA( 16, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.IndexPointer( type, stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendEdgeFlagPointer(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 8, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = READ_DATA( 12, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.EdgeFlagPointer( stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendColorPointer(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLint size = READ_DATA( 8, GLint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLenum type = READ_DATA( 12, GLenum );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 16, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = READ_DATA( 20, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.ColorPointer( size, type, stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendFogCoordPointerEXT(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLenum type = READ_DATA( 8, GLenum );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 12, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = READ_DATA( 16, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.FogCoordPointerEXT( type, stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendSecondaryColorPointerEXT(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLint size = READ_DATA( 8, GLint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLenum type = READ_DATA( 12, GLenum );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 16, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = READ_DATA( 20, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.SecondaryColorPointerEXT( size, type, stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendVertexAttribPointerARB(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLuint index = READ_DATA( 8, GLuint);
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLint size = READ_DATA( 12, GLint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLenum type = READ_DATA( 16, GLenum );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLboolean normalized = READ_DATA( 20, GLboolean );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 24, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = READ_DATA( 28, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.VertexAttribPointerARB( index, size, type, normalized, stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendVertexAttribPointerNV(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLuint index = READ_DATA( 8, GLuint);
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLint size = READ_DATA( 12, GLint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLenum type = READ_DATA( 16, GLenum );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 20, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = READ_DATA( 24, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.VertexAttribPointerNV( index, size, type, stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendInterleavedArrays(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLenum format = READ_DATA( 8, GLenum );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync GLsizei stride = READ_DATA( 12, GLsizei );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB pointer = READ_DATA( 16, GLuint );
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync cr_unpackDispatch.InterleavedArrays( format, stride, (void *) pointer );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendDrawElements(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync GLenum mode = READ_DATA( 8, GLenum );
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync GLsizei count = READ_DATA( 12, GLsizei );
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync GLenum type = READ_DATA( 16, GLenum );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB indices = READ_DATA( 20, GLuint );
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync void * indexptr;
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync#ifdef CR_ARB_vertex_buffer_object
521a799e2d6b107f295561fbb2d4c8852717dbf1vboxsync GLboolean hasidxdata = READ_DATA(24, GLint);
521a799e2d6b107f295561fbb2d4c8852717dbf1vboxsync indexptr = hasidxdata ? DATA_POINTER(28, void) : (void*)indices;
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync#else
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync indexptr = DATA_POINTER(24, void);
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync#endif
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync cr_unpackDispatch.DrawElements(mode, count, type, indexptr);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackExtendDrawRangeElements(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync GLenum mode = READ_DATA( 8, GLenum );
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync GLuint start = READ_DATA( 12, GLuint );
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync GLuint end = READ_DATA( 16, GLuint );
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync GLsizei count = READ_DATA( 20, GLsizei );
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync GLenum type = READ_DATA( 24, GLenum );
4aef33e90cfa798b2e6db5b45f02c2a6c8bbc4aevboxsync GLintptrARB indices = READ_DATA( 28, GLuint );
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync void * indexptr;
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync#ifdef CR_ARB_vertex_buffer_object
521a799e2d6b107f295561fbb2d4c8852717dbf1vboxsync GLboolean hasidxdata = READ_DATA(32, GLint);
521a799e2d6b107f295561fbb2d4c8852717dbf1vboxsync indexptr = hasidxdata ? DATA_POINTER(36, void) : (void*)indices;
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync#else
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync indexptr = DATA_POINTER(32, void);
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync#endif
236b6e0fdf652661ff4c655314fe488998c5c17dvboxsync cr_unpackDispatch.DrawRangeElements(mode, start, end, count, type, indexptr);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackMultiDrawArraysEXT(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync crError( "Can't decode MultiDrawArraysEXT" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crUnpackMultiDrawElementsEXT(void)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
54cdd2a4e7676bc8694fa8db62ece5a1447b3597vboxsync crError( "Can't decode MultiDrawElementsEXT" );
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsyncstatic void crUnpackSetClientPointerByIndex(int index, GLint size,
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync GLenum type, GLboolean normalized,
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync GLsizei stride, const GLvoid *pointer, CRClientState *c)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync{
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync /*crDebug("crUnpackSetClientPointerByIndex: %i(s=%i, t=0x%x, n=%i, str=%i) -> %p", index, size, type, normalized, stride, pointer);*/
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync if (index<7)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync {
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync switch (index)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync {
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync case 0:
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.VertexPointer(size, type, stride, pointer);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync break;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync case 1:
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.ColorPointer(size, type, stride, pointer);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync break;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync case 2:
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.FogCoordPointerEXT(type, stride, pointer);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync break;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync case 3:
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.SecondaryColorPointerEXT(size, type, stride, pointer);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync break;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync case 4:
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.EdgeFlagPointer(stride, pointer);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync break;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync case 5:
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.IndexPointer(type, stride, pointer);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync break;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync case 6:
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.NormalPointer(type, stride, pointer);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync break;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync }
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync }
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync else if (index<(7+CR_MAX_TEXTURE_UNITS))
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync {
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync int curTexUnit = c->curClientTextureUnit;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync if ((index-7)!=curTexUnit)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync {
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.ClientActiveTextureARB(GL_TEXTURE0_ARB+index-7);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync }
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.TexCoordPointer(size, type, stride, pointer);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync if ((index-7)!=curTexUnit)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync {
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.ClientActiveTextureARB(GL_TEXTURE0_ARB+curTexUnit);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync }
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync }
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync else
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync {
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.VertexAttribPointerARB(index-7-CR_MAX_TEXTURE_UNITS,
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync size, type, normalized, stride, pointer);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync }
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync}
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsyncvoid crUnpackExtendLockArraysEXT(void)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync{
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync GLint first = READ_DATA(sizeof(int) + 4, GLint);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync GLint count = READ_DATA(sizeof(int) + 8, GLint);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync int numenabled = READ_DATA(sizeof(int) + 12, int);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync CRContext *g = crStateGetCurrent();
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync CRClientState *c = &g->client;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync CRClientPointer *cp;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync int i, index, offset;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync unsigned char *data;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync offset = 2*sizeof(int)+12;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync /*crDebug("crUnpackExtendLockArraysEXT(%i, %i) ne=%i", first, count, numenabled);*/
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync for (i=0; i<numenabled; ++i)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync {
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync index = READ_DATA(offset, int);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync offset += sizeof(int);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cp = crStateGetClientPointerByIndex(index, &c->array);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync CRASSERT(cp && cp->enabled && (!cp->buffer || !cp->buffer->id));
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync data = crAlloc((first+count)*cp->bytesPerIndex);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync crMemcpy(data+first*cp->bytesPerIndex, DATA_POINTER(offset, GLvoid), count*cp->bytesPerIndex);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync offset += count*cp->bytesPerIndex;
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync /*crDebug("crUnpackExtendLockArraysEXT: old cp(%i): en/l=%i(%i) p=%p size=%i type=0x%x n=%i str=%i pp=%p pstr=%i",
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync index, cp->enabled, cp->locked, cp->p, cp->size, cp->type, cp->normalized, cp->stride, cp->prevPtr, cp->prevStride);*/
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync crUnpackSetClientPointerByIndex(index, cp->size, cp->type, cp->normalized, 0, data, c);
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync /*crDebug("crUnpackExtendLockArraysEXT: new cp(%i): en/l=%i(%i) p=%p size=%i type=0x%x n=%i str=%i pp=%p pstr=%i",
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync index, cp->enabled, cp->locked, cp->p, cp->size, cp->type, cp->normalized, cp->stride, cp->prevPtr, cp->prevStride);*/
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync }
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.LockArraysEXT(first, count);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync}
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsyncvoid crUnpackExtendUnlockArraysEXT(void)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync{
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync int i;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync CRContext *g = crStateGetCurrent();
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync CRClientState *c = &g->client;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync CRClientPointer *cp;
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync /*crDebug("crUnpackExtendUnlockArraysEXT");*/
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cr_unpackDispatch.UnlockArraysEXT();
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync for (i=0; i<CRSTATECLIENT_MAX_VERTEXARRAYS; ++i)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync {
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync cp = crStateGetClientPointerByIndex(i, &c->array);
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync if (cp->enabled)
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync {
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync /*crDebug("crUnpackExtendUnlockArraysEXT: old cp(%i): en/l=%i(%i) p=%p size=%i type=0x%x n=%i str=%i pp=%p pstr=%i",
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync i, cp->enabled, cp->locked, cp->p, cp->size, cp->type, cp->normalized, cp->stride, cp->prevPtr, cp->prevStride);*/
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync crUnpackSetClientPointerByIndex(i, cp->size, cp->type, cp->normalized, cp->prevStride, cp->prevPtr, c);
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync /*crDebug("crUnpackExtendUnlockArraysEXT: new cp(%i): en/l=%i(%i) p=%p size=%i type=0x%x n=%i str=%i pp=%p pstr=%i",
ede25793e6ce6c74f0622821ee2648849726a9ddvboxsync i, cp->enabled, cp->locked, cp->p, cp->size, cp->type, cp->normalized, cp->stride, cp->prevPtr, cp->prevStride);*/
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync }
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync }
10183353efa12aa94e0f3dc78e0f1c47f7928e8dvboxsync}