unpack_texture.c revision e761514762c8705557b347266d54ade68888537c
/* Copyright (c) 2001, Stanford University
* All rights reserved
*
* See the file LICENSE.txt for information on redistributing this software.
*/
#include "unpacker.h"
#include "cr_error.h"
#include "cr_protocol.h"
#include "cr_mem.h"
#include "cr_version.h"
#if defined( GL_EXT_texture3D )
void crUnpackTexImage3DEXT( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLint level = READ_DATA( sizeof( int ) + 4, GLint );
GLenum internalformat = READ_DATA( sizeof( int ) + 8, GLint );
GLsizei width = READ_DATA( sizeof( int ) + 12, GLsizei );
GLsizei height = READ_DATA( sizeof( int ) + 16, GLsizei );
GLsizei depth = READ_DATA( sizeof( int ) + 20, GLsizei );
GLint border = READ_DATA( sizeof( int ) + 24, GLint );
GLenum format = READ_DATA( sizeof( int ) + 28, GLenum );
GLenum type = READ_DATA( sizeof( int ) + 32, GLenum );
int noimagedata = READ_DATA( sizeof( int ) + 36, int );
GLvoid *pixels;
/*If there's no imagedata send, it's either that passed pointer was NULL or
there was GL_PIXEL_UNPACK_BUFFER_ARB bound, in both cases 4bytes of passed
pointer would convert to either NULL or offset in the bound buffer.
*/
if ( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(sizeof(int)+40, GLint);
else
pixels = DATA_POINTER( sizeof( int ) + 44, GLvoid );
cr_unpackDispatch.TexImage3DEXT(target, level, internalformat, width,
height, depth, border, format, type,
pixels);
INCR_VAR_PTR();
}
#endif /* GL_EXT_texture3D */
#if defined( CR_OPENGL_VERSION_1_2 )
void crUnpackTexImage3D( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLint level = READ_DATA( sizeof( int ) + 4, GLint );
GLint internalformat = READ_DATA( sizeof( int ) + 8, GLint );
GLsizei width = READ_DATA( sizeof( int ) + 12, GLsizei );
GLsizei height = READ_DATA( sizeof( int ) + 16, GLsizei );
GLsizei depth = READ_DATA( sizeof( int ) + 20, GLsizei );
GLint border = READ_DATA( sizeof( int ) + 24, GLint );
GLenum format = READ_DATA( sizeof( int ) + 28, GLenum );
GLenum type = READ_DATA( sizeof( int ) + 32, GLenum );
int noimagedata = READ_DATA( sizeof( int ) + 36, int );
GLvoid *pixels;
if ( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(sizeof(int)+40, GLint);
else
pixels = DATA_POINTER( sizeof( int ) + 44, GLvoid );
cr_unpackDispatch.TexImage3D( target, level, internalformat, width, height,
depth, border, format, type, pixels );
INCR_VAR_PTR();
}
#endif /* CR_OPENGL_VERSION_1_2 */
void crUnpackTexImage2D( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLint level = READ_DATA( sizeof( int ) + 4, GLint );
GLint internalformat = READ_DATA( sizeof( int ) + 8, GLint );
GLsizei width = READ_DATA( sizeof( int ) + 12, GLsizei );
GLsizei height = READ_DATA( sizeof( int ) + 16, GLsizei );
GLint border = READ_DATA( sizeof( int ) + 20, GLint );
GLenum format = READ_DATA( sizeof( int ) + 24, GLenum );
GLenum type = READ_DATA( sizeof( int ) + 28, GLenum );
int noimagedata = READ_DATA( sizeof( int ) + 32, int );
GLvoid *pixels;
if ( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(sizeof(int)+36, GLint);
else
pixels = DATA_POINTER( sizeof( int ) + 40, GLvoid );
cr_unpackDispatch.TexImage2D( target, level, internalformat, width, height,
border, format, type, pixels );
INCR_VAR_PTR();
}
void crUnpackTexImage1D( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLint level = READ_DATA( sizeof( int ) + 4, GLint );
GLint internalformat = READ_DATA( sizeof( int ) + 8, GLint );
GLsizei width = READ_DATA( sizeof( int ) + 12, GLsizei );
GLint border = READ_DATA( sizeof( int ) + 16, GLint );
GLenum format = READ_DATA( sizeof( int ) + 20, GLenum );
GLenum type = READ_DATA( sizeof( int ) + 24, GLenum );
int noimagedata = READ_DATA( sizeof( int ) + 28, int );
GLvoid *pixels;
if ( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(sizeof(int)+32, GLint);
else
pixels = DATA_POINTER( sizeof( int ) + 36, GLvoid );
cr_unpackDispatch.TexImage1D( target, level, internalformat, width, border,
format, type, pixels );
INCR_VAR_PTR();
}
void crUnpackDeleteTextures( void )
{
GLsizei n = READ_DATA( sizeof( int ) + 0, GLsizei );
GLuint *textures = DATA_POINTER( sizeof( int ) + 4, GLuint );
cr_unpackDispatch.DeleteTextures( n, textures );
INCR_VAR_PTR();
}
void crUnpackPrioritizeTextures( void )
{
GLsizei n = READ_DATA( sizeof( int ) + 0, GLsizei );
GLuint *textures = DATA_POINTER( sizeof( int ) + 4, GLuint );
GLclampf *priorities = DATA_POINTER( sizeof( int ) + 4 + n*sizeof( GLuint ),
GLclampf );
cr_unpackDispatch.PrioritizeTextures( n, textures, priorities );
INCR_VAR_PTR();
}
void crUnpackTexParameterfv( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLenum pname = READ_DATA( sizeof( int ) + 4, GLenum );
GLfloat *params = DATA_POINTER( sizeof( int ) + 8, GLfloat );
cr_unpackDispatch.TexParameterfv( target, pname, params );
INCR_VAR_PTR();
}
void crUnpackTexParameteriv( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLenum pname = READ_DATA( sizeof( int ) + 4, GLenum );
GLint *params = DATA_POINTER( sizeof( int ) + 8, GLint );
cr_unpackDispatch.TexParameteriv( target, pname, params );
INCR_VAR_PTR();
}
void crUnpackTexParameterf( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLenum pname = READ_DATA( sizeof( int ) + 4, GLenum );
GLfloat param = READ_DATA( sizeof( int ) + 8, GLfloat );
cr_unpackDispatch.TexParameterf( target, pname, param );
INCR_VAR_PTR();
}
void crUnpackTexParameteri( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLenum pname = READ_DATA( sizeof( int ) + 4, GLenum );
GLint param = READ_DATA( sizeof( int ) + 8, GLint );
cr_unpackDispatch.TexParameteri( target, pname, param );
INCR_VAR_PTR();
}
#if defined(CR_OPENGL_VERSION_1_2)
void crUnpackTexSubImage3D( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLint level = READ_DATA( sizeof( int ) + 4, GLint );
GLint xoffset = READ_DATA( sizeof( int ) + 8, GLint );
GLint yoffset = READ_DATA( sizeof( int ) + 12, GLint );
GLint zoffset = READ_DATA( sizeof( int ) + 16, GLint );
GLsizei width = READ_DATA( sizeof( int ) + 20, GLsizei );
GLsizei height = READ_DATA( sizeof( int ) + 24, GLsizei );
GLsizei depth = READ_DATA( sizeof( int ) + 28, GLsizei );
GLenum format = READ_DATA( sizeof( int ) + 32, GLenum );
GLenum type = READ_DATA( sizeof( int ) + 36, GLenum );
int noimagedata = READ_DATA( sizeof( int ) + 40, int );
GLvoid *pixels;
if ( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(sizeof(int)+44, GLint);
else
pixels = DATA_POINTER( sizeof( int ) + 48, GLvoid );
cr_unpackDispatch.PixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
cr_unpackDispatch.PixelStorei( GL_UNPACK_SKIP_PIXELS, 0 );
cr_unpackDispatch.PixelStorei( GL_UNPACK_SKIP_ROWS, 0 );
cr_unpackDispatch.PixelStorei( GL_UNPACK_ALIGNMENT, 1 );
cr_unpackDispatch.TexSubImage3D(target, level, xoffset, yoffset, zoffset,
width, height, depth, format, type, pixels);
INCR_VAR_PTR();
}
#endif /* CR_OPENGL_VERSION_1_2 */
void crUnpackTexSubImage2D( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLint level = READ_DATA( sizeof( int ) + 4, GLint );
GLint xoffset = READ_DATA( sizeof( int ) + 8, GLint );
GLint yoffset = READ_DATA( sizeof( int ) + 12, GLint );
GLsizei width = READ_DATA( sizeof( int ) + 16, GLsizei );
GLsizei height = READ_DATA( sizeof( int ) + 20, GLsizei );
GLenum format = READ_DATA( sizeof( int ) + 24, GLenum );
GLenum type = READ_DATA( sizeof( int ) + 28, GLenum );
int noimagedata = READ_DATA( sizeof( int ) + 32, int );
GLvoid *pixels;
if ( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(sizeof(int)+36, GLint);
else
pixels = DATA_POINTER( sizeof( int ) + 40, GLvoid );
cr_unpackDispatch.PixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
cr_unpackDispatch.PixelStorei( GL_UNPACK_SKIP_PIXELS, 0 );
cr_unpackDispatch.PixelStorei( GL_UNPACK_SKIP_ROWS, 0 );
cr_unpackDispatch.PixelStorei( GL_UNPACK_ALIGNMENT, 1 );
cr_unpackDispatch.TexSubImage2D( target, level, xoffset, yoffset, width,
height, format, type, pixels );
INCR_VAR_PTR();
}
void crUnpackTexSubImage1D( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLint level = READ_DATA( sizeof( int ) + 4, GLint );
GLint xoffset = READ_DATA( sizeof( int ) + 8, GLint );
GLsizei width = READ_DATA( sizeof( int ) + 12, GLsizei );
GLenum format = READ_DATA( sizeof( int ) + 16, GLenum );
GLenum type = READ_DATA( sizeof( int ) + 20, GLenum );
int noimagedata = READ_DATA( sizeof( int ) + 24, int );
GLvoid *pixels;
if ( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(sizeof(int)+28, GLint);
else
pixels = DATA_POINTER( sizeof( int ) + 32, GLvoid );
cr_unpackDispatch.PixelStorei( GL_UNPACK_ROW_LENGTH, 0 );
cr_unpackDispatch.PixelStorei( GL_UNPACK_SKIP_PIXELS, 0 );
cr_unpackDispatch.PixelStorei( GL_UNPACK_SKIP_ROWS, 0 );
cr_unpackDispatch.PixelStorei( GL_UNPACK_ALIGNMENT, 1 );
cr_unpackDispatch.TexSubImage1D( target, level, xoffset, width, format,
type, pixels );
INCR_VAR_PTR();
}
void crUnpackTexEnvfv( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLenum pname = READ_DATA( sizeof( int ) + 4, GLenum );
GLfloat *params = DATA_POINTER( sizeof( int ) + 8, GLfloat );
cr_unpackDispatch.TexEnvfv( target, pname, params );
INCR_VAR_PTR();
}
void crUnpackTexEnviv( void )
{
GLenum target = READ_DATA( sizeof( int ) + 0, GLenum );
GLenum pname = READ_DATA( sizeof( int ) + 4, GLenum );
GLint *params = DATA_POINTER( sizeof( int ) + 8, GLint );
cr_unpackDispatch.TexEnviv( target, pname, params );
INCR_VAR_PTR();
}
#define DATA_POINTER_DOUBLE( offset )
void crUnpackTexGendv( void )
{
GLenum coord = READ_DATA( sizeof( int ) + 0, GLenum );
GLenum pname = READ_DATA( sizeof( int ) + 4, GLenum );
GLdouble params[4];
unsigned int n_param = READ_DATA( 0, int ) - ( sizeof(int) + 8 );
if ( n_param > sizeof(params) )
crError( "crUnpackTexGendv: n_param=%d, expected <= %d\n", n_param,
(unsigned int)sizeof(params) );
crMemcpy( params, DATA_POINTER( sizeof( int ) + 8, GLdouble ), n_param );
cr_unpackDispatch.TexGendv( coord, pname, params );
INCR_VAR_PTR();
}
void crUnpackTexGenfv( void )
{
GLenum coord = READ_DATA( sizeof( int ) + 0, GLenum );
GLenum pname = READ_DATA( sizeof( int ) + 4, GLenum );
GLfloat *params = DATA_POINTER( sizeof( int ) + 8, GLfloat );
cr_unpackDispatch.TexGenfv( coord, pname, params );
INCR_VAR_PTR();
}
void crUnpackTexGeniv( void )
{
GLenum coord = READ_DATA( sizeof( int ) + 0, GLenum );
GLenum pname = READ_DATA( sizeof( int ) + 4, GLenum );
GLint *params = DATA_POINTER( sizeof( int ) + 8, GLint );
cr_unpackDispatch.TexGeniv( coord, pname, params );
INCR_VAR_PTR();
}
void crUnpackExtendAreTexturesResident( void )
{
GLsizei n = READ_DATA( 8, GLsizei );
const GLuint *textures = DATA_POINTER( 12, const GLuint );
SET_RETURN_PTR(12 + n * sizeof(GLuint));
SET_WRITEBACK_PTR(20 + n * sizeof(GLuint));
(void) cr_unpackDispatch.AreTexturesResident( n, textures, NULL );
}
void crUnpackExtendCompressedTexImage3DARB( void )
{
GLenum target = READ_DATA( 4 + sizeof(int) + 0, GLenum );
GLint level = READ_DATA( 4 + sizeof(int) + 4, GLint );
GLenum internalformat = READ_DATA( 4 + sizeof(int) + 8, GLenum );
GLsizei width = READ_DATA( 4 + sizeof(int) + 12, GLsizei );
GLsizei height = READ_DATA( 4 + sizeof(int) + 16, GLsizei );
GLsizei depth = READ_DATA( 4 + sizeof(int) + 20, GLsizei );
GLint border = READ_DATA( 4 + sizeof(int) + 24, GLint );
GLsizei imagesize = READ_DATA( 4 + sizeof(int) + 28, GLsizei );
int noimagedata = READ_DATA( 4 + sizeof(int) + 32, int );
GLvoid *pixels;
if( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(4+sizeof(int)+36, GLint);
else
pixels = DATA_POINTER( 4 + sizeof(int) + 40, GLvoid );
cr_unpackDispatch.CompressedTexImage3DARB(target, level, internalformat,
width, height, depth, border,
imagesize, pixels);
}
void crUnpackExtendCompressedTexImage2DARB( void )
{
GLenum target = READ_DATA( 4 + sizeof( int ) + 0, GLenum );
GLint level = READ_DATA( 4 + sizeof( int ) + 4, GLint );
GLenum internalformat = READ_DATA( 4 + sizeof( int ) + 8, GLenum );
GLsizei width = READ_DATA( 4 + sizeof( int ) + 12, GLsizei );
GLsizei height = READ_DATA( 4 + sizeof( int ) + 16, GLsizei );
GLint border = READ_DATA( 4 + sizeof( int ) + 20, GLint );
GLsizei imagesize = READ_DATA( 4 + sizeof( int ) + 24, GLsizei );
int noimagedata = READ_DATA( 4 + sizeof( int ) + 28, int );
GLvoid *pixels;
if ( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(4+sizeof(int)+32, GLint);
else
pixels = DATA_POINTER( 4 + sizeof( int ) + 36, GLvoid );
cr_unpackDispatch.CompressedTexImage2DARB( target, level, internalformat,
width, height, border, imagesize,
pixels );
}
void crUnpackExtendCompressedTexImage1DARB( void )
{
GLenum target = READ_DATA( 4 + sizeof(int) + 0, GLenum );
GLint level = READ_DATA( 4 + sizeof(int) + 4, GLint );
GLenum internalformat = READ_DATA( 4 + sizeof(int) + 8, GLenum );
GLsizei width = READ_DATA( 4 + sizeof(int) + 12, GLsizei );
GLint border = READ_DATA( 4 + sizeof(int) + 16, GLint );
GLsizei imagesize = READ_DATA( 4 + sizeof(int) + 20, GLsizei );
int noimagedata = READ_DATA( 4 + sizeof(int) + 24, int );
GLvoid *pixels;
if( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(4+sizeof(int)+28, GLint);
else
pixels = DATA_POINTER( 4 + sizeof(int) + 32, GLvoid );
cr_unpackDispatch.CompressedTexImage1DARB(target, level, internalformat,
width, border, imagesize, pixels);
}
void crUnpackExtendCompressedTexSubImage3DARB( void )
{
GLenum target = READ_DATA( 4 + sizeof(int) + 0, GLenum );
GLint level = READ_DATA( 4 + sizeof(int) + 4, GLint );
GLint xoffset = READ_DATA( 4 + sizeof(int) + 8, GLint );
GLint yoffset = READ_DATA( 4 + sizeof(int) + 12, GLint );
GLint zoffset = READ_DATA( 4 + sizeof(int) + 16, GLint );
GLsizei width = READ_DATA( 4 + sizeof(int) + 20, GLsizei );
GLsizei height = READ_DATA( 4 + sizeof(int) + 24, GLsizei );
GLsizei depth = READ_DATA( 4 + sizeof(int) + 28, GLsizei );
GLenum format = READ_DATA( 4 + sizeof(int) + 32, GLenum );
GLsizei imagesize = READ_DATA( 4 + sizeof(int) + 36, GLsizei );
int noimagedata = READ_DATA( 4 + sizeof(int) + 40, int );
GLvoid *pixels;
if( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(4+sizeof(int)+44, GLint);
else
pixels = DATA_POINTER( 4 + sizeof(int) + 48, GLvoid );
cr_unpackDispatch.CompressedTexSubImage3DARB(target, level, xoffset,
yoffset, zoffset, width,
height, depth, format,
imagesize, pixels);
}
void crUnpackExtendCompressedTexSubImage2DARB( void )
{
GLenum target = READ_DATA( 4 + sizeof(int) + 0, GLenum );
GLint level = READ_DATA( 4 + sizeof(int) + 4, GLint );
GLint xoffset = READ_DATA( 4 + sizeof(int) + 8, GLint );
GLint yoffset = READ_DATA( 4 + sizeof(int) + 12, GLint );
GLsizei width = READ_DATA( 4 + sizeof(int) + 16, GLsizei );
GLsizei height = READ_DATA( 4 + sizeof(int) + 20, GLsizei );
GLenum format = READ_DATA( 4 + sizeof(int) + 24, GLenum );
GLsizei imagesize = READ_DATA( 4 + sizeof(int) + 28, GLsizei );
int noimagedata = READ_DATA( 4 + sizeof(int) + 32, int );
GLvoid *pixels;
if( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(4+sizeof(int)+36, GLint);
else
pixels = DATA_POINTER( 4 + sizeof(int) + 40, GLvoid );
cr_unpackDispatch.CompressedTexSubImage2DARB(target, level, xoffset,
yoffset, width, height,
format, imagesize, pixels);
}
void crUnpackExtendCompressedTexSubImage1DARB( void )
{
GLenum target = READ_DATA( 4 + sizeof(int) + 0, GLenum );
GLint level = READ_DATA( 4 + sizeof(int) + 4, GLint );
GLint xoffset = READ_DATA( 4 + sizeof(int) + 8, GLint );
GLsizei width = READ_DATA( 4 + sizeof(int) + 12, GLsizei );
GLenum format = READ_DATA( 4 + sizeof(int) + 16, GLenum );
GLsizei imagesize = READ_DATA( 4 + sizeof(int) + 20, GLsizei );
int noimagedata = READ_DATA( 4 + sizeof(int) + 24, int );
GLvoid *pixels;
if( noimagedata )
pixels = (void*) (uintptr_t) READ_DATA(4+sizeof(int)+28, GLint);
else
pixels = DATA_POINTER( 4 + sizeof(int) + 32, GLvoid );
cr_unpackDispatch.CompressedTexSubImage1DARB(target, level, xoffset, width,
format, imagesize, pixels);
}
void crUnpackExtendGetTexImage(void)
{
GLenum target = READ_DATA( 8, GLenum );
GLint level = READ_DATA( 12, GLint );
GLenum format = READ_DATA( 16, GLenum );
GLenum type = READ_DATA( 20, GLenum );
GLvoid *pixels;
SET_RETURN_PTR(24);
SET_WRITEBACK_PTR(32);
pixels = DATA_POINTER(24, GLvoid);
cr_unpackDispatch.GetTexImage(target, level, format, type, pixels);
}
void crUnpackExtendGetCompressedTexImageARB(void)
{
GLenum target = READ_DATA( 8, GLenum );
GLint level = READ_DATA( 12, GLint );
GLvoid *img;
SET_RETURN_PTR( 16 );
SET_WRITEBACK_PTR( 24 );
img = DATA_POINTER(16, GLvoid);
cr_unpackDispatch.GetCompressedTexImageARB( target, level, img );
}