|
|
/*
** Copyright 1991-1993, Silicon Graphics, Inc. ** All Rights Reserved. ** ** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.; ** the contents of this file may not be disclosed to third parties, copied or ** duplicated in any form, in whole or in part, without the prior written ** permission of Silicon Graphics, Inc. ** ** RESTRICTED RIGHTS LEGEND: ** Use, duplication or disclosure by the Government is subject to restrictions ** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data ** and Computer Software clause at DFARS 252.227-7013, and/or in similar or ** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished - ** rights reserved under the Copyright Laws of the United States. */
#include "precomp.h"
#pragma hdrstop
#include <imfuncs.h>
#include "glsbmsg.h"
#include "glsbmsgh.h"
#include "srvsize.h"
/********************************************************************/
VOID * FASTCALL sbs_glRenderMode( __GLcontext *gc, IN GLMSG_RENDERMODE *pMsg) { GLint Result;
/*
* Make the call * * When exiting Selection mode, RenderMode returns the number of hit * records or -1 if an overflow occured. * * When exiting Feedback mode, RenderMode returns the number of values * placed in the feedback buffer or -1 if an overflow occured. */
Result = __glim_RenderMode ( pMsg->mode );
GLTEB_RETURNVALUE() = (ULONG)Result;
return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glFeedbackBuffer( __GLcontext *gc, IN GLMSG_FEEDBACKBUFFER *pMsg ) { __GLGENcontext *gengc; GLint PreviousError; GLfloat *Buffer; GLuint SizeInBytes;
gengc = (__GLGENcontext *)gc;
/*
* Save the current error code so that we can determine * if the call was successful. */
PreviousError = gc->error; gc->error = GL_NO_ERROR; /* clear the error code */
/*
* Figure out the size of the buffer in bytes */
SizeInBytes = pMsg->size * sizeof(GLfloat);
/*
* Allocate the server side buffer * Use GenMalloc() because it may be used indefinitely. */
if ( NULL == (Buffer = (GLfloat *) pMsg->bufferOff) ) { __glSetError(GL_OUT_OF_MEMORY); DBGERROR("GenMalloc failed\n"); } else { /*
* Make the call */
__glim_FeedbackBuffer( pMsg->size, pMsg->type, Buffer );
/*
* If the call was successful, save the parameters */
if ( GL_NO_ERROR == gc->error ) { gc->error = PreviousError; /* Restore the error code */
gengc->RenderState.SrvFeedbackBuffer = Buffer; gengc->RenderState.CltFeedbackBuffer = (GLfloat *)pMsg->bufferOff; gengc->RenderState.FeedbackBufferSize = SizeInBytes; gengc->RenderState.FeedbackType = pMsg->type; } } return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glSelectBuffer( __GLcontext *gc, IN GLMSG_SELECTBUFFER *pMsg) { __GLGENcontext *gengc; GLint PreviousError; GLuint *Buffer; GLuint SizeInBytes;
gengc = (__GLGENcontext *)gc;
/*
* Save the current error code so that we can determine * if the call was successful. */
PreviousError = gc->error; gc->error = GL_NO_ERROR; /* clear the error code */
/*
* Figure out the size of the buffer in bytes */
SizeInBytes = pMsg->size * sizeof(GLuint);
/*
* Allocate the server side buffer * Use GenMalloc() because it may be used indefinitely. */
if ( NULL == (Buffer = (GLuint *) pMsg->bufferOff) ) { __glSetError(GL_OUT_OF_MEMORY); DBGERROR("GenMalloc failed\n"); } else { /*
* Make the call */
__glim_SelectBuffer (pMsg->size, Buffer );
/*
* If the call was successful, save the parameters */
if ( GL_NO_ERROR == gc->error ) { gc->error = PreviousError; /* Restore the error code */
gengc->RenderState.SrvSelectBuffer = Buffer; gengc->RenderState.CltSelectBuffer = (GLuint *)pMsg->bufferOff; gengc->RenderState.SelectBufferSize = SizeInBytes; } } return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
/******************* Pixel Functions ********************************/
VOID * FASTCALL sbs_glReadPixels ( __GLcontext *gc, IN GLMSG_READPIXELS *pMsg ) { VOID *Data; VOID *NextOffset;
#ifdef _MCD_
if (((__GLGENcontext *)gc)->pMcdState) { // This function potentially touches the framebuffer memory. Since,
// this function is not going to first pass through the MCD driver
// (which would give the MCD driver the oportunity to sync to the HW),
// we need to do this synchronization explicitly.
GenMcdSynchronize((__GLGENcontext *)gc); } #endif
NextOffset = (VOID *) ( ((BYTE *)pMsg) + GLMSG_ALIGN(sizeof(*pMsg)) ); Data = (VOID *) pMsg->pixelsOff;
__glim_ReadPixels ( pMsg->x, pMsg->y, pMsg->width, pMsg->height, pMsg->format, pMsg->type, Data );
return( NextOffset ); }
VOID * FASTCALL sbs_glGetPolygonStipple ( __GLcontext *gc, IN GLMSG_GETPOLYGONSTIPPLE *pMsg ) { VOID *Data; VOID *NextOffset;
NextOffset = (VOID *) ( ((BYTE *)pMsg) + GLMSG_ALIGN(sizeof(*pMsg)) ); Data = (VOID *) pMsg->maskOff;
__glim_GetPolygonStipple ( Data );
return( NextOffset ); }
/*
* XXXX From Ptar: * * This code is very similar to __glCheckReadPixelArgs() in * pixel/px_api.c, and could possibly replace it. */
VOID * FASTCALL sbs_glGetTexImage ( __GLcontext *gc, IN GLMSG_GETTEXIMAGE *pMsg ) { VOID *Data; VOID *NextOffset;
NextOffset = (VOID *) ( ((BYTE *)pMsg) + GLMSG_ALIGN(sizeof(*pMsg)) ); Data = (VOID *) pMsg->pixelsOff;
__glim_GetTexImage ( pMsg->target, pMsg->level, pMsg->format, pMsg->type, Data );
return( NextOffset ); }
VOID * FASTCALL sbs_glDrawPixels ( __GLcontext *gc, IN GLMSG_DRAWPIXELS *pMsg ) { VOID *Data; VOID *NextOffset;
#ifdef _MCD_
if (((__GLGENcontext *)gc)->pMcdState) { // This function potentially touches the framebuffer memory. Since,
// this function is not going to first pass through the MCD driver
// (which would give the MCD driver the oportunity to sync to the HW),
// we need to do this synchronization explicitly.
GenMcdSynchronize((__GLGENcontext *)gc); } #endif
NextOffset = (VOID *) ( ((BYTE *)pMsg) + GLMSG_ALIGN(sizeof(*pMsg)) ); Data = (VOID *) pMsg->pixelsOff;
__glim_DrawPixels ( pMsg->width, pMsg->height, pMsg->format, pMsg->type, #ifdef NT
Data, pMsg->_IsDlist); #else
Data ); #endif
return( NextOffset ); }
VOID * FASTCALL sbs_glPolygonStipple ( __GLcontext *gc, IN GLMSG_POLYGONSTIPPLE *pMsg ) { VOID *Data; VOID *NextOffset;
NextOffset = (VOID *) ( ((BYTE *)pMsg) + GLMSG_ALIGN(sizeof(*pMsg)) ); Data = (VOID *) pMsg->maskOff;
__glim_PolygonStipple #ifdef NT
( Data, pMsg->_IsDlist ); #else
( Data ); #endif
return( NextOffset ); }
/*
* XXXX from Ptar: * * The whole bitmap is copied, the server (not the client) * could be modified so that only the data starting at * xorig and yorig is copied, then width and height probably * need to be modified. * Note that __glBitmap_size() will also need to be modified * */
VOID * FASTCALL sbs_glBitmap ( __GLcontext *gc, IN GLMSG_BITMAP *pMsg ) { VOID *Data; VOID *NextOffset;
#ifdef _MCD_
if (((__GLGENcontext *)gc)->pMcdState) { // This function potentially touches the framebuffer memory. Since,
// this function is not going to first pass through the MCD driver
// (which would give the MCD driver the oportunity to sync to the HW),
// we need to do this synchronization explicitly.
GenMcdSynchronize((__GLGENcontext *)gc); } #endif
NextOffset = (VOID *) ( ((BYTE *)pMsg) + GLMSG_ALIGN(sizeof(*pMsg)) ); Data = (VOID *) pMsg->bitmapOff;
__glim_Bitmap ( pMsg->width , pMsg->height, pMsg->xorig , pMsg->yorig , pMsg->xmove , pMsg->ymove , #ifdef NT
Data , pMsg->_IsDlist #else
Data #endif
);
return( NextOffset ); }
VOID * FASTCALL sbs_glTexImage1D ( __GLcontext *gc, IN GLMSG_TEXIMAGE1D *pMsg ) { VOID *Data; VOID *NextOffset;
NextOffset = (VOID *) ( ((BYTE *)pMsg) + GLMSG_ALIGN(sizeof(*pMsg)) ); Data = (VOID *) pMsg->pixelsOff;
__glim_TexImage1D ( pMsg->target , pMsg->level , pMsg->components , pMsg->width , pMsg->border , pMsg->format , pMsg->type , #ifdef NT
Data , pMsg->_IsDlist #else
Data #endif
);
return( NextOffset ); }
VOID * FASTCALL sbs_glTexImage2D ( __GLcontext *gc, IN GLMSG_TEXIMAGE2D *pMsg ) { VOID *Data; VOID *NextOffset;
NextOffset = (VOID *) ( ((BYTE *)pMsg) + GLMSG_ALIGN(sizeof(*pMsg)) );
Data = (VOID *) pMsg->pixelsOff;
__glim_TexImage2D ( pMsg->target , pMsg->level , pMsg->components , pMsg->width , pMsg->height , pMsg->border , pMsg->format , pMsg->type , #ifdef NT
Data , pMsg->_IsDlist #else
Data #endif
);
return( NextOffset ); }
VOID * FASTCALL sbs_glAreTexturesResident( __GLcontext *gc, IN GLMSG_ARETEXTURESRESIDENT *pMsg) { GLboolean retval; retval = __glim_AreTexturesResident ( pMsg->n, pMsg->textures, pMsg->residences ); GLTEB_RETURNVALUE() = (ULONG)retval; return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glBindTexture( __GLcontext *gc, IN GLMSG_BINDTEXTURE *pMsg) { __glim_BindTexture ( pMsg->target, pMsg->texture ); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glCopyTexImage1D( __GLcontext *gc, IN GLMSG_COPYTEXIMAGE1D *pMsg) { __glim_CopyTexImage1D ( pMsg->target, pMsg->level, pMsg->internalformat, pMsg->x, pMsg->y, pMsg->width, pMsg->border); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glCopyTexImage2D( __GLcontext *gc, IN GLMSG_COPYTEXIMAGE2D *pMsg) { __glim_CopyTexImage2D ( pMsg->target, pMsg->level, pMsg->internalformat, pMsg->x, pMsg->y, pMsg->width, pMsg->height, pMsg->border); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glCopyTexSubImage1D( __GLcontext *gc, IN GLMSG_COPYTEXSUBIMAGE1D *pMsg) { __glim_CopyTexSubImage1D ( pMsg->target, pMsg->level, pMsg->xoffset, pMsg->x, pMsg->y, pMsg->width); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glCopyTexSubImage2D( __GLcontext *gc, IN GLMSG_COPYTEXSUBIMAGE2D *pMsg) { __glim_CopyTexSubImage2D ( pMsg->target, pMsg->level, pMsg->xoffset, pMsg->yoffset, pMsg->x, pMsg->y, pMsg->width, pMsg->height); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glDeleteTextures( __GLcontext *gc, IN GLMSG_DELETETEXTURES *pMsg) { __glim_DeleteTextures ( pMsg->n, pMsg->textures ); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glGenTextures( __GLcontext *gc, IN GLMSG_GENTEXTURES *pMsg) { __glim_GenTextures ( pMsg->n, pMsg->textures ); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glIsTexture( __GLcontext *gc, IN GLMSG_ISTEXTURE *pMsg) { GLboolean retval; retval = __glim_IsTexture ( pMsg->texture ); GLTEB_RETURNVALUE() = (ULONG)retval; return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glPrioritizeTextures( __GLcontext *gc, IN GLMSG_PRIORITIZETEXTURES *pMsg) { __glim_PrioritizeTextures ( pMsg->n, pMsg->textures, pMsg->priorities ); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glTexSubImage1D( __GLcontext *gc, IN GLMSG_TEXSUBIMAGE1D *pMsg) { __glim_TexSubImage1D (pMsg->target, pMsg->level, pMsg->xoffset, pMsg->width, pMsg->format, pMsg->type, #ifdef NT
(const GLvoid *)pMsg->pixelsOff, pMsg->_IsDlist); #else
(const GLvoid *)pMsg->pixelsOff); #endif
return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glTexSubImage2D( __GLcontext *gc, IN GLMSG_TEXSUBIMAGE2D *pMsg) { __glim_TexSubImage2D (pMsg->target, pMsg->level, pMsg->xoffset, pMsg->yoffset, pMsg->width, pMsg->height, pMsg->format, pMsg->type, #ifdef NT
(const GLvoid *)pMsg->pixelsOff, pMsg->_IsDlist); #else
(const GLvoid *)pMsg->pixelsOff); #endif
return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glColorTableEXT( __GLcontext *gc, IN GLMSG_COLORTABLEEXT *pMsg) { __glim_ColorTableEXT (pMsg->target, pMsg->internalFormat, pMsg->width, pMsg->format, pMsg->type, pMsg->data, pMsg->_IsDlist); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glColorSubTableEXT( __GLcontext *gc, IN GLMSG_COLORSUBTABLEEXT *pMsg) { __glim_ColorSubTableEXT (pMsg->target, pMsg->start, pMsg->count, pMsg->format, pMsg->type, pMsg->data, pMsg->_IsDlist); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glGetColorTableEXT( __GLcontext *gc, IN GLMSG_GETCOLORTABLEEXT *pMsg) { __glim_GetColorTableEXT (pMsg->target, pMsg->format, pMsg->type, pMsg->data); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glGetColorTableParameterivEXT( __GLcontext *gc, IN GLMSG_GETCOLORTABLEPARAMETERIVEXT *pMsg) { __glim_GetColorTableParameterivEXT (pMsg->target, pMsg->pname, pMsg->params); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glGetColorTableParameterfvEXT( __GLcontext *gc, IN GLMSG_GETCOLORTABLEPARAMETERFVEXT *pMsg) { __glim_GetColorTableParameterfvEXT (pMsg->target, pMsg->pname, pMsg->params); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glPolygonOffset( __GLcontext *gc, IN GLMSG_POLYGONOFFSET *pMsg) { __glim_PolygonOffset (pMsg->factor, pMsg->units); return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
#ifdef GL_WIN_multiple_textures
VOID * FASTCALL sbs_glCurrentTextureIndexWIN( __GLcontext *gc, IN GLMSG_CURRENTTEXTUREINDEXWIN *pMsg) { __glim_CurrentTextureIndexWIN (pMsg->index);
return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glBindNthTextureWIN( __GLcontext *gc, IN GLMSG_BINDNTHTEXTUREWIN *pMsg) { __glim_BindNthTextureWIN (pMsg->index, pMsg->target, pMsg->texture);
return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); }
VOID * FASTCALL sbs_glNthTexCombineFuncWIN( __GLcontext *gc, IN GLMSG_NTHTEXCOMBINEFUNCWIN *pMsg) { __glim_NthTexCombineFuncWIN (pMsg->index, pMsg->leftColorFactor, pMsg->colorOp, pMsg->rightColorFactor, pMsg->leftAlphaFactor, pMsg->alphaOp, pMsg->rightAlphaFactor);
return ( (BYTE *)pMsg + GLMSG_ALIGN(sizeof(*pMsg)) ); } #endif // GL_WIN_multiple_textures
|