/** * This is used by the SPUs that do packing (such as Pack, Tilesort and * Replicate) to process ReadPixels messages. We can't call this directly * from the message loop below because the SPU's have other housekeeping * to do for ReadPixels (such as decrementing counters). */ void crNetRecvReadPixels( const CRMessageReadPixels *rp, unsigned int len ) { int payload_len = len - sizeof( *rp ); char *dest_ptr; const char *src_ptr = (const char *) rp + sizeof(*rp); /* set dest_ptr value */ crMemcpy( &(dest_ptr), &(rp->pixels), sizeof(dest_ptr)); /* store pixel data in app's memory */ if (rp->alignment == 1 && rp->skipRows == 0 && rp->skipPixels == 0 && (rp->rowLength == 0 || rp->rowLength == rp->width)) { /* no special packing is needed */ crMemcpy( dest_ptr, src_ptr, payload_len ); } else { /* need special packing */ CRPixelPackState packing; packing.skipRows = rp->skipRows; packing.skipPixels = rp->skipPixels; packing.alignment = rp->alignment; packing.rowLength = rp->rowLength; packing.imageHeight = 0; packing.skipImages = 0; packing.swapBytes = GL_FALSE; packing.psLSBFirst = GL_FALSE; crPixelCopy2D( rp->width, rp->height, dest_ptr, rp->format, rp->type, &packing, src_ptr, rp->format, rp->type, /*unpacking*/NULL); } }
int crdlm_pointers_DrawPixels( struct instanceDrawPixels *instance, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels, CRClientState *c ) { unsigned int size = crImageSize(format, type, width, height); if (instance && size > 0) { crPixelCopy2D(width, height, instance->pixels, format, type, NULL, pixels, format, type, &c->unpack); } return size; }
int crdlm_pointers_TexSubImage2D( struct instanceTexSubImage2D *instance, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels, CRClientState *c ) { unsigned int size = crImageSize(format, type, width, height); if (instance && size > 0) { crPixelCopy2D(width, height, instance->pixels, format, type, NULL, pixels, format, type, &c->unpack); } return size; }
void PACK_APIENTRY crPackTexImage2DSWAP(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels, const CRPixelPackState *unpackstate ) { unsigned char *data_ptr; int packet_length; int isnull = (pixels == NULL); packet_length = sizeof( target ) + sizeof( level ) + sizeof( internalformat ) + sizeof( width ) + sizeof( height ) + sizeof( border ) + sizeof( format ) + sizeof( type ) + sizeof( int ); if (pixels) { packet_length += crImageSize( format, type, width, height ); } data_ptr = (unsigned char *) crPackAlloc( packet_length ); WRITE_DATA( 0, GLenum, SWAP32(target) ); WRITE_DATA( 4, GLint, SWAP32(level) ); WRITE_DATA( 8, GLint, SWAP32(internalformat) ); WRITE_DATA( 12, GLsizei, SWAP32(width) ); WRITE_DATA( 16, GLsizei, SWAP32(height) ); WRITE_DATA( 20, GLint, SWAP32(border) ); WRITE_DATA( 24, GLenum, SWAP32(format) ); WRITE_DATA( 28, GLenum, SWAP32(type) ); WRITE_DATA( 32, int, SWAP32(isnull) ); if (pixels) { CRPixelPackState tmpUnpackState = *unpackstate; /* flip application-requested swapBytes state */ tmpUnpackState.swapBytes = unpackstate->swapBytes ? GL_FALSE : GL_TRUE; crPixelCopy2D( width, height, (void *)(data_ptr + 36), format, type, NULL, /* dst */ pixels, format, type, &tmpUnpackState ); /* src */ } crHugePacket( CR_TEXIMAGE2D_OPCODE, data_ptr ); crPackFree( data_ptr ); }
void PACK_APIENTRY crPackDrawPixels(GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels, const CRPixelPackState *unpackstate ) { unsigned char *data_ptr; int packet_length, imagesize; int noimagedata = (pixels == NULL) || crStateIsBufferBound(GL_PIXEL_UNPACK_BUFFER_ARB); packet_length = sizeof( width ) + sizeof( height ) + sizeof( format ) + sizeof( type ) + sizeof(int) + sizeof(GLint); if (!noimagedata) { imagesize = crImageSize( format, type, width, height ); if (imagesize<=0) { crDebug("crPackDrawPixels: 0 image size, ignoring"); return; } packet_length += imagesize; } data_ptr = (unsigned char *) crPackAlloc( packet_length ); WRITE_DATA( 0, GLsizei, width ); WRITE_DATA( 4, GLsizei, height ); WRITE_DATA( 8, GLenum, format ); WRITE_DATA( 12, GLenum, type ); WRITE_DATA( 16, GLint, noimagedata ); WRITE_DATA( 20, GLint, (GLint) (uintptr_t) pixels ); if (!noimagedata) { crPixelCopy2D(width, height, (void *) (data_ptr + 24), format, type, NULL, /* dst */ pixels, format, type, unpackstate); /* src */ } crHugePacket( CR_DRAWPIXELS_OPCODE, data_ptr ); crPackFree( data_ptr ); }
void PACK_APIENTRY crPackTexSubImage2DSWAP (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels, const CRPixelPackState *unpackstate ) { unsigned char *data_ptr; int packet_length; CRPixelPackState tmpUnpackState = *unpackstate; packet_length = sizeof( target ) + sizeof( level ) + sizeof( xoffset ) + sizeof( yoffset ) + sizeof( width ) + sizeof( height ) + sizeof( format ) + sizeof( type ) + crImageSize( format, type, width, height ); data_ptr = (unsigned char *) crPackAlloc( packet_length ); WRITE_DATA( 0, GLenum, SWAP32(target) ); WRITE_DATA( 4, GLint, SWAP32(level) ); WRITE_DATA( 8, GLint, SWAP32(xoffset) ); WRITE_DATA( 12, GLint, SWAP32(yoffset) ); WRITE_DATA( 16, GLsizei, SWAP32(width) ); WRITE_DATA( 20, GLsizei, SWAP32(height) ); WRITE_DATA( 24, GLenum, SWAP32(format) ); WRITE_DATA( 28, GLenum, SWAP32(type) ); /* flip application-requested swapBytes state */ tmpUnpackState.swapBytes = unpackstate->swapBytes ? GL_FALSE : GL_TRUE; crPixelCopy2D( width, height, (GLvoid *) (data_ptr + 32), format, type, NULL, /* dst */ pixels, format, type, &tmpUnpackState ); /* src */ crHugePacket( CR_TEXSUBIMAGE2D_OPCODE, data_ptr ); crPackFree( data_ptr ); }