packspu_pixel.c revision e0e0c19eefceaf5d4ec40f9466b58a771f50e799
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely/* Copyright (c) 2001, Stanford University
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely All rights reserved.
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely See the file LICENSE.txt for information on redistributing this software. */
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely#include "cr_packfunctions.h"
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely#include "cr_glstate.h"
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely#include "cr_pixeldata.h"
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely#include "cr_version.h"
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely#include "packspu.h"
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely#include "packspu_proto.h"
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidelyvoid PACKSPU_APIENTRY packspu_PixelStoref( GLenum pname, GLfloat param )
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely{
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely /* NOTE: we do not send pixel store parameters to the server!
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely * When we pack a glDrawPixels or glTexImage2D image we interpret
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely * the user's pixel store parameters at that time and pack the
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely * image in a canonical layout (see util/pixel.c).
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely */
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crStatePixelStoref( pname, param );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely}
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidelyvoid PACKSPU_APIENTRY packspu_PixelStorei( GLenum pname, GLint param )
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely{
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crStatePixelStorei( pname, param );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely}
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidelyvoid PACKSPU_APIENTRY packspu_DrawPixels( GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels )
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely{
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely GET_THREAD(thread);
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely ContextInfo *ctx = thread->currentContext;
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely CRClientState *clientState = &(ctx->clientState->client);
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely if (pack_spu.swap)
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crPackDrawPixelsSWAP( width, height, format, type, pixels, &(clientState->unpack) );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely else
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crPackDrawPixels( width, height, format, type, pixels, &(clientState->unpack) );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely}
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidelyvoid PACKSPU_APIENTRY packspu_ReadPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels )
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely{
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely GET_THREAD(thread);
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely ContextInfo *ctx = thread->currentContext;
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely CRClientState *clientState = &(ctx->clientState->client);
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely int writeback;
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely pack_spu.ReadPixels++;
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely if (pack_spu.swap)
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crPackReadPixelsSWAP( x, y, width, height, format, type, pixels,
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely &(clientState->pack), &writeback );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely else
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crPackReadPixels( x, y, width, height, format, type, pixels,
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely &(clientState->pack), &writeback );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely packspuFlush( (void *) thread );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely while (pack_spu.ReadPixels)
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crNetRecv();
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely}
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidelyvoid PACKSPU_APIENTRY packspu_CopyPixels( GLint x, GLint y, GLsizei width, GLsizei height, GLenum type )
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely{
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely GET_THREAD(thread);
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely if (pack_spu.swap)
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crPackCopyPixelsSWAP( x, y, width, height, type );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely else
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crPackCopyPixels( x, y, width, height, type );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely /* XXX why flush here? */
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely packspuFlush( (void *) thread );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely}
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidelyvoid PACKSPU_APIENTRY packspu_Bitmap( GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap )
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely{
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely GET_CONTEXT(ctx);
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely CRClientState *clientState = &(ctx->clientState->client);
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely if (pack_spu.swap)
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crPackBitmapSWAP( width, height, xorig, yorig, xmove, ymove, bitmap, &(clientState->unpack) );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely else
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely crPackBitmap( width, height, xorig, yorig, xmove, ymove, bitmap, &(clientState->unpack) );
24d6db06810f2ea747f6dff60d483e4fca3aaa13davidely}
void PACKSPU_APIENTRY packspu_TexImage1D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels )
{
GET_CONTEXT(ctx);
CRClientState *clientState = &(ctx->clientState->client);
if (pack_spu.swap)
crPackTexImage1DSWAP( target, level, internalformat, width, border, format, type, pixels, &(clientState->unpack) );
else
crPackTexImage1D( target, level, internalformat, width, border, format, type, pixels, &(clientState->unpack) );
}
void PACKSPU_APIENTRY packspu_TexImage2D( GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels )
{
GET_CONTEXT(ctx);
CRClientState *clientState = &(ctx->clientState->client);
if (pack_spu.swap)
crPackTexImage2DSWAP( target, level, internalformat, width, height, border, format, type, pixels, &(clientState->unpack) );
else
crPackTexImage2D( target, level, internalformat, width, height, border, format, type, pixels, &(clientState->unpack) );
}
#ifdef GL_EXT_texture3D
void 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 )
{
GET_CONTEXT(ctx);
CRClientState *clientState = &(ctx->clientState->client);
if (pack_spu.swap)
crPackTexImage3DEXTSWAP( target, level, internalformat, width, height, depth, border, format, type, pixels, &(clientState->unpack) );
else
crPackTexImage3DEXT( target, level, internalformat, width, height, depth, border, format, type, pixels, &(clientState->unpack) );
}
#endif
#ifdef CR_OPENGL_VERSION_1_2
void 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 )
{
GET_CONTEXT(ctx);
CRClientState *clientState = &(ctx->clientState->client);
if (pack_spu.swap)
crPackTexImage3DSWAP( target, level, internalformat, width, height, depth, border, format, type, pixels, &(clientState->unpack) );
else
crPackTexImage3D( target, level, internalformat, width, height, depth, border, format, type, pixels, &(clientState->unpack) );
}
#endif /* CR_OPENGL_VERSION_1_2 */
void PACKSPU_APIENTRY packspu_TexSubImage1D( GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels )
{
GET_CONTEXT(ctx);
CRClientState *clientState = &(ctx->clientState->client);
if (pack_spu.swap)
crPackTexSubImage1DSWAP( target, level, xoffset, width, format, type, pixels, &(clientState->unpack) );
else
crPackTexSubImage1D( target, level, xoffset, width, format, type, pixels, &(clientState->unpack) );
}
void PACKSPU_APIENTRY packspu_TexSubImage2D( GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels )
{
GET_CONTEXT(ctx);
CRClientState *clientState = &(ctx->clientState->client);
if (pack_spu.swap)
crPackTexSubImage2DSWAP( target, level, xoffset, yoffset, width, height, format, type, pixels, &(clientState->unpack) );
else
crPackTexSubImage2D( target, level, xoffset, yoffset, width, height, format, type, pixels, &(clientState->unpack) );
}
#ifdef CR_OPENGL_VERSION_1_2
void 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 )
{
GET_CONTEXT(ctx);
CRClientState *clientState = &(ctx->clientState->client);
if (pack_spu.swap)
crPackTexSubImage3DSWAP( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, &(clientState->unpack) );
else
crPackTexSubImage3D( target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels, &(clientState->unpack) );
}
#endif /* CR_OPENGL_VERSION_1_2 */
void PACKSPU_APIENTRY packspu_ZPixCR( GLsizei width, GLsizei height, GLenum format, GLenum type, GLenum ztype, GLint zparm, GLint length, const GLvoid *pixels )
{
GET_CONTEXT(ctx);
CRClientState *clientState = &(ctx->clientState->client);
if (pack_spu.swap)
crPackZPixCRSWAP( width, height, format, type, ztype, zparm, length, pixels, &(clientState->unpack) );
else
crPackZPixCR( width, height, format, type, ztype, zparm, length, pixels, &(clientState->unpack) );
}
void PACKSPU_APIENTRY packspu_GetTexImage (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)
{
GET_THREAD(thread);
ContextInfo *ctx = thread->currentContext;
CRClientState *clientState = &(ctx->clientState->client);
int writeback = 1;
/* XXX note: we're not observing the pixel pack parameters here.
* To do so, we'd have to allocate a temporary image buffer (how large???)
* and copy the image to the user's buffer using the pixel pack params.
*/
if (pack_spu.swap)
crPackGetTexImageSWAP( target, level, format, type, pixels, &(clientState->pack), &writeback );
else
crPackGetTexImage( target, level, format, type, pixels, &(clientState->pack), &writeback );
packspuFlush( (void *) thread );
while (writeback)
crNetRecv();
}