packspu_pixel.c revision 49ad08ab15f3b96d2d5ba5134a0506dd7b27fdf1
45e9809aff7304721fddb95654901b32195c9c7avboxsync/* Copyright (c) 2001, Stanford University
45e9809aff7304721fddb95654901b32195c9c7avboxsync All rights reserved.
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync See the file LICENSE.txt for information on redistributing this software. */
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync#include "cr_packfunctions.h"
45e9809aff7304721fddb95654901b32195c9c7avboxsync#include "cr_glstate.h"
45e9809aff7304721fddb95654901b32195c9c7avboxsync#include "cr_pixeldata.h"
45e9809aff7304721fddb95654901b32195c9c7avboxsync#include "cr_version.h"
45e9809aff7304721fddb95654901b32195c9c7avboxsync#include "packspu.h"
45e9809aff7304721fddb95654901b32195c9c7avboxsync#include "packspu_proto.h"
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncstatic GLboolean packspu_CheckTexImageFormat(GLenum format)
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (format!=GL_COLOR_INDEX
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_RED
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_GREEN
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_BLUE
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_ALPHA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_RGB
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_BGR
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_RGBA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_BGRA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_LUMINANCE
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_LUMINANCE_ALPHA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && format!=GL_DEPTH_COMPONENT)
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync /*crWarning("crPackCheckTexImageFormat FAILED format 0x%x isn't valid", format);*/
45e9809aff7304721fddb95654901b32195c9c7avboxsync return GL_FALSE;
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync return GL_TRUE;
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncstatic GLboolean packspu_CheckTexImageType(GLenum type)
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (type!=GL_UNSIGNED_BYTE
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_BYTE
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_BITMAP
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_SHORT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_SHORT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_INT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_INT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_FLOAT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_BYTE_3_3_2
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_BYTE_2_3_3_REV
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_SHORT_5_6_5
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_SHORT_5_6_5_REV
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_SHORT_4_4_4_4
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_SHORT_4_4_4_4_REV
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_SHORT_5_5_5_1
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_SHORT_1_5_5_5_REV
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_INT_8_8_8_8
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_INT_8_8_8_8_REV
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_INT_10_10_10_2
45e9809aff7304721fddb95654901b32195c9c7avboxsync && type!=GL_UNSIGNED_INT_2_10_10_10_REV)
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync /*crWarning("crPackCheckTexImageType FAILED type 0x%x isn't valid", type);*/
45e9809aff7304721fddb95654901b32195c9c7avboxsync return GL_FALSE;
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync return GL_TRUE;
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncstatic GLboolean packspu_CheckTexImageInternalFormat(GLint internalformat)
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (internalformat!=1
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=2
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=3
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=4
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_ALPHA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_ALPHA4
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_ALPHA8
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_ALPHA12
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_ALPHA16
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_ALPHA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_LUMINANCE
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_LUMINANCE_ALPHA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_INTENSITY
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_RGB
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_RGBA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_DEPTH_COMPONENT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_DEPTH_COMPONENT16
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_DEPTH_COMPONENT24
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_DEPTH_COMPONENT32
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE4
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE8
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE12
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE16
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE_ALPHA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE4_ALPHA4
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE6_ALPHA2
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE8_ALPHA8
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE12_ALPHA4
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE12_ALPHA12
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_LUMINANCE16_ALPHA16
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_INTENSITY
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_INTENSITY4
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_INTENSITY8
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_INTENSITY12
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_INTENSITY16
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_R3_G3_B2
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGB
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGB4
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGB5
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGB8
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGB10
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGB12
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGB16
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGBA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGBA2
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGBA4
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGB5_A1
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGBA8
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGB10_A2
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGBA12
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_RGBA16
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_SLUMINANCE
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_SLUMINANCE8
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_SLUMINANCE_ALPHA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_SLUMINANCE8_ALPHA8
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_SRGB
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_SRGB8
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_SRGB_ALPHA
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_SRGB8_ALPHA8
45e9809aff7304721fddb95654901b32195c9c7avboxsync#ifdef CR_EXT_texture_compression_s3tc
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_RGB_S3TC_DXT1_EXT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
45e9809aff7304721fddb95654901b32195c9c7avboxsync# ifdef CR_EXT_texture_sRGB
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_SRGB_S3TC_DXT1_EXT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
45e9809aff7304721fddb95654901b32195c9c7avboxsync && internalformat!=GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
45e9809aff7304721fddb95654901b32195c9c7avboxsync# endif
45e9809aff7304721fddb95654901b32195c9c7avboxsync#endif
45e9809aff7304721fddb95654901b32195c9c7avboxsync )
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync /*crWarning("crPackCheckTexImageInternalFormat FAILED internalformat 0x%x isn't valid", internalformat);*/
45e9809aff7304721fddb95654901b32195c9c7avboxsync return GL_FALSE;
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync return GL_TRUE;
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncstatic GLboolean packspu_CheckTexImageParams(GLint internalformat, GLenum format, GLenum type)
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync return packspu_CheckTexImageFormat(format)
45e9809aff7304721fddb95654901b32195c9c7avboxsync && packspu_CheckTexImageType(type)
45e9809aff7304721fddb95654901b32195c9c7avboxsync && packspu_CheckTexImageInternalFormat(internalformat);
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncstatic GLboolean packspu_CheckTexImageFormatType(GLenum format, GLenum type)
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync return packspu_CheckTexImageFormat(format)
45e9809aff7304721fddb95654901b32195c9c7avboxsync && packspu_CheckTexImageType(type);
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_PixelStoref( GLenum pname, GLfloat param )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync /* NOTE: we do not send pixel store parameters to the server!
45e9809aff7304721fddb95654901b32195c9c7avboxsync * When we pack a glDrawPixels or glTexImage2D image we interpret
45e9809aff7304721fddb95654901b32195c9c7avboxsync * the user's pixel store parameters at that time and pack the
45e9809aff7304721fddb95654901b32195c9c7avboxsync * image in a canonical layout (see util/pixel.c).
45e9809aff7304721fddb95654901b32195c9c7avboxsync */
45e9809aff7304721fddb95654901b32195c9c7avboxsync crStatePixelStoref( pname, param );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_PixelStorei( GLenum pname, GLint param )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync crStatePixelStorei( pname, param );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_DrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_THREAD(thread);
45e9809aff7304721fddb95654901b32195c9c7avboxsync ContextInfo *ctx = thread->currentContext;
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackDrawPixelsSWAP( width, height, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackDrawPixels( width, height, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_THREAD(thread);
45e9809aff7304721fddb95654901b32195c9c7avboxsync ContextInfo *ctx = thread->currentContext;
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync int writeback;
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackReadPixelsSWAP(x, y, width, height, format, type, pixels,
45e9809aff7304721fddb95654901b32195c9c7avboxsync &(clientState->pack), &writeback);
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackReadPixels(x, y, width, height, format, type, pixels,
45e9809aff7304721fddb95654901b32195c9c7avboxsync &(clientState->pack), &writeback);
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync#ifdef CR_ARB_pixel_buffer_object
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (!crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
45e9809aff7304721fddb95654901b32195c9c7avboxsync#endif
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync pack_spu.ReadPixels++;
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync packspuFlush((void *) thread);
45e9809aff7304721fddb95654901b32195c9c7avboxsync while (pack_spu.ReadPixels)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crNetRecv();
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_CopyPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_THREAD(thread);
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackCopyPixelsSWAP( x, y, width, height, type );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackCopyPixels( x, y, width, height, type );
45e9809aff7304721fddb95654901b32195c9c7avboxsync /* XXX why flush here? */
45e9809aff7304721fddb95654901b32195c9c7avboxsync packspuFlush( (void *) thread );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_Bitmap( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_CONTEXT(ctx);
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackBitmapSWAP( width, height, xorig, yorig, xmove, ymove, bitmap, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackBitmap( width, height, xorig, yorig, xmove, ymove, bitmap, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_TexImage1D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_CONTEXT(ctx);
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (!packspu_CheckTexImageParams(internalformat, format, type))
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pixels || crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync crWarning("packspu_TexImage1D invalid internalFormat(%x)/format(%x)/type(%x)", internalformat, format, type);
45e9809aff7304721fddb95654901b32195c9c7avboxsync return;
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync internalformat = packspu_CheckTexImageInternalFormat(internalformat) ? internalformat:GL_RGBA;
45e9809aff7304721fddb95654901b32195c9c7avboxsync format = packspu_CheckTexImageFormat(format) ? format:GL_RGBA;
45e9809aff7304721fddb95654901b32195c9c7avboxsync type = packspu_CheckTexImageType(type) ? type:GL_UNSIGNED_BYTE;
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexImage1DSWAP( target, level, internalformat, width, border, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexImage1D( target, level, internalformat, width, border, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_TexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_CONTEXT(ctx);
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (!packspu_CheckTexImageParams(internalformat, format, type))
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pixels || crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB))
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync crWarning("packspu_TexImage2D invalid internalFormat(%x)/format(%x)/type(%x)", internalformat, format, type);
45e9809aff7304721fddb95654901b32195c9c7avboxsync return;
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync internalformat = packspu_CheckTexImageInternalFormat(internalformat) ? internalformat:GL_RGBA;
45e9809aff7304721fddb95654901b32195c9c7avboxsync format = packspu_CheckTexImageFormat(format) ? format:GL_RGBA;
45e9809aff7304721fddb95654901b32195c9c7avboxsync type = packspu_CheckTexImageType(type) ? type:GL_UNSIGNED_BYTE;
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexImage2DSWAP( target, level, internalformat, width, height, border, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexImage2D( target, level, internalformat, width, height, border, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync#ifdef GL_EXT_texture3D
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_TexImage3DEXT( GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_CONTEXT(ctx);
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexImage3DEXTSWAP( target, level, internalformat, width, height, depth, border, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexImage3DEXT( target, level, internalformat, width, height, depth, border, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync#endif
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync#ifdef CR_OPENGL_VERSION_1_2
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_TexImage3D(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const GLvoid *pixels )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_CONTEXT(ctx);
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexImage3DSWAP( target, level, internalformat, width, height, depth, border, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexImage3D( target, level, internalformat, width, height, depth, border, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync#endif /* CR_OPENGL_VERSION_1_2 */
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_TexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_CONTEXT(ctx);
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (!packspu_CheckTexImageFormatType(format, type))
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync crWarning("packspu_TexSubImage1D invalid format(%x)/type(%x)", format, type);
45e9809aff7304721fddb95654901b32195c9c7avboxsync return;
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexSubImage1DSWAP( target, level, xoffset, width, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexSubImage1D( target, level, xoffset, width, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_TexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_CONTEXT(ctx);
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (!packspu_CheckTexImageFormatType(format, type))
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync crWarning("packspu_TexSubImage2D invalid format(%x)/type(%x)", format, type);
45e9809aff7304721fddb95654901b32195c9c7avboxsync return;
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexSubImage2DSWAP( target, level, xoffset, yoffset, width, height, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync#ifdef CR_OPENGL_VERSION_1_2
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_TexSubImage3D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const GLvoid *pixels )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_CONTEXT(ctx);
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexSubImage3DSWAP( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackTexSubImage3D( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync#endif /* CR_OPENGL_VERSION_1_2 */
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_ZPixCR( GLsizei width, GLsizei height, GLenum format, GLenum type, GLenum ztype, GLint zparm, GLint length, const GLvoid *pixels )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_CONTEXT(ctx);
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackZPixCRSWAP( width, height, format, type, ztype, zparm, length, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackZPixCR( width, height, format, type, ztype, zparm, length, pixels, &(clientState->unpack) );
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_GetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_THREAD(thread);
45e9809aff7304721fddb95654901b32195c9c7avboxsync ContextInfo *ctx = thread->currentContext;
45e9809aff7304721fddb95654901b32195c9c7avboxsync CRClientState *clientState = &(ctx->clientState->client);
45e9809aff7304721fddb95654901b32195c9c7avboxsync int writeback = 1;
45e9809aff7304721fddb95654901b32195c9c7avboxsync /* XXX note: we're not observing the pixel pack parameters here.
45e9809aff7304721fddb95654901b32195c9c7avboxsync * To do so, we'd have to allocate a temporary image buffer (how large???)
45e9809aff7304721fddb95654901b32195c9c7avboxsync * and copy the image to the user's buffer using the pixel pack params.
45e9809aff7304721fddb95654901b32195c9c7avboxsync */
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackGetTexImageSWAP( target, level, format, type, pixels, &(clientState->pack), &writeback );
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackGetTexImage( target, level, format, type, pixels, &(clientState->pack), &writeback );
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync#ifdef CR_ARB_pixel_buffer_object
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (!crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
45e9809aff7304721fddb95654901b32195c9c7avboxsync#endif
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync packspuFlush( (void *) thread );
45e9809aff7304721fddb95654901b32195c9c7avboxsync while (writeback)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crNetRecv();
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsyncvoid PACKSPU_APIENTRY packspu_GetCompressedTexImageARB( GLenum target, GLint level, GLvoid * img )
45e9809aff7304721fddb95654901b32195c9c7avboxsync{
45e9809aff7304721fddb95654901b32195c9c7avboxsync GET_THREAD(thread);
45e9809aff7304721fddb95654901b32195c9c7avboxsync int writeback = 1;
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (pack_spu.swap)
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackGetCompressedTexImageARBSWAP( target, level, img, &writeback );
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync else
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync crPackGetCompressedTexImageARB( target, level, img, &writeback );
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync
45e9809aff7304721fddb95654901b32195c9c7avboxsync#ifdef CR_ARB_pixel_buffer_object
45e9809aff7304721fddb95654901b32195c9c7avboxsync if (!crStateIsBufferBound(GL_PIXEL_PACK_BUFFER_ARB))
45e9809aff7304721fddb95654901b32195c9c7avboxsync#endif
45e9809aff7304721fddb95654901b32195c9c7avboxsync {
45e9809aff7304721fddb95654901b32195c9c7avboxsync packspuFlush( (void *) thread );
45e9809aff7304721fddb95654901b32195c9c7avboxsync while (writeback)
45e9809aff7304721fddb95654901b32195c9c7avboxsync crNetRecv();
45e9809aff7304721fddb95654901b32195c9c7avboxsync }
45e9809aff7304721fddb95654901b32195c9c7avboxsync}
45e9809aff7304721fddb95654901b32195c9c7avboxsync