|
|
#ifndef __glbuffers_h_
#define __glbuffers_h_
/*
** Copyright 1991, 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 "render.h"
#include "parray.h"
#include "procs.h"
typedef struct __GLbufferMachineRec { /*
** GL_TRUE if store procs need to call gc->front->store and ** gc->back->store in order to store one fragment (only TRUE if ** drawBuffer is GL_FRONT_AND_BACK). This is needed because many ** frame buffers can draw to both front and back under some conditions ** (like when not blending), but not under other conditions. */ GLboolean doubleStore; } __GLbufferMachine;
/************************************************************************/
/*
** Generic buffer description. This description is used for software ** and hardware buffers of all kinds. */ struct __GLbufferRec { /*
** Which context is using this buffer. */ __GLcontext *gc;
/*
** Dimensions of the buffer. */ GLint width, height, depth;
/*
** Base of framebuffer. */ void* base;
/*
** Number of bytes consumed by the framebuffer. */ GLuint size;
/*
** Size of each element in the framebuffer. */ GLuint elementSize;
/*
** If this buffer is part of a larger (say full screen) buffer ** then this is the size of that larger buffer. Otherwise it is ** just a copy of width. */ GLint outerWidth;
/*
** If this buffer is part of a larger (say full screen) buffer ** then these are the location of this buffer in the larger ** buffer. */ GLint xOrigin, yOrigin;
/*
** Flags. */ GLuint flags; };
/*
** Generic address macro for a buffer. Coded to assume that ** the buffer is not part of a larger buffer. ** The input coordinates x,y are biased by the x & y viewport ** adjusts in gc->transform, and thus they need to be de-adjusted ** here. */ #define __GL_FB_ADDRESS(fb,cast,x,y) \
((cast (fb)->buf.base) \ + ((y) - (fb)->buf.gc->constants.viewportYAdjust) \ * (fb)->buf.outerWidth \ + (x) - (fb)->buf.gc->constants.viewportXAdjust)
extern void __glResizeBuffer(__GLGENbuffers *buffers, __GLbuffer *buf, GLint w, GLint h); extern void FASTCALL __glInitGenericCB(__GLcontext *gc, __GLcolorBuffer *cfb);
/************************************************************************/
struct __GLalphaBufferRec { __GLbuffer buf; __GLfloat alphaScale; void (FASTCALL *store) (__GLalphaBuffer *afb, GLint x, GLint y, const __GLcolor *color); void (FASTCALL *storeSpan) (__GLalphaBuffer *afb); void (FASTCALL *storeSpan2) (__GLalphaBuffer *afb, GLint x, GLint y, GLint w, __GLcolor *colors ); void (FASTCALL *fetch) (__GLalphaBuffer *afb, GLint x, GLint y, __GLcolor *result); void (FASTCALL *readSpan) (__GLalphaBuffer *afb, GLint x, GLint y, GLint w, __GLcolor *results); void (FASTCALL *clear)(__GLalphaBuffer *afb); };
/************************************************************************/
struct __GLcolorBufferRec { __GLbuffer buf; __GLalphaBuffer alphaBuf;
GLint redMax; GLint greenMax; GLint blueMax; GLint alphaMax; // XXX not used, just here for consistency with rgb
/*
** Color component scale factors. Given a component value between ** zero and one, this scales the component into a zero-N value ** which is suitable for usage in the color buffer. Note that these ** values are not necessarily the same as the max values above, ** which define precise bit ranges for the buffer. These values ** are never zero, for instance. **/ __GLfloat redScale; __GLfloat greenScale; __GLfloat blueScale;
/* Integer versions of above */ GLint iRedScale; GLint iGreenScale; GLint iBlueScale;
/* Used primarily by pixmap code */ GLint redShift; GLint greenShift; GLint blueShift; GLint alphaShift; #ifdef NT
GLuint allShifts; #endif
/*
** Alpha is treated a little bit differently. alphaScale and ** iAlphaScale are used to define a range of alpha values that are ** generated during various rendering steps. These values will then ** be used as indices into a lookup table to see if the alpha test ** passes or not. Because of this, the number should be fairly large ** (e.g., one is not good enough). */ __GLfloat alphaScale; GLint iAlphaScale;
__GLfloat oneOverRedScale; __GLfloat oneOverGreenScale; __GLfloat oneOverBlueScale; __GLfloat oneOverAlphaScale;
/*
** Color mask state for the buffer. When writemasking is enabled ** the source and dest mask will contain depth depedent masking. */ GLuint sourceMask, destMask;
/*
** This function updates the internal procedure pointers based ** on a state change in the context. */ void (FASTCALL *pick)(__GLcontext *gc, __GLcolorBuffer *cfb);
/*
** When the buffer needs resizing this procedure should be called. */ void (*resize)(__GLGENbuffers *buffers, __GLcolorBuffer *cfb, GLint w, GLint h);
/*
** Store a fragment into the buffer. For color buffers, the ** procedure will optionally dither, writemask, blend and logic op ** the fragment before final storage. */ void (FASTCALL *store)(__GLcolorBuffer *cfb, const __GLfragment *frag);
/*
** Fetch a color from the buffer. This returns the r, g, b and a ** values for an RGB buffer. For an index buffer the "r" value ** returned is the index. */ void (*fetch)(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result);
/*
** Similar to fetch, except that the data is always read from ** the current read buffer, not from the current draw buffer. */ void (*readColor)(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *result); void (*readSpan)(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *results, GLint w);
/*
** Return a span of data from the accumulation buffer into the ** color buffer(s), multiplying by "scale" before storage. */ void (*returnSpan)(__GLcolorBuffer *cfb, GLint x, GLint y, const __GLaccumCell *acbuf, __GLfloat scale, GLint w);
/*
** Store a span (line) of colors into the color buffer. A minimal ** implementation need only copy the values directly into ** the framebuffer, assuming that the PickSpanProcs is providing ** software implementations of all of the modes. */ __GLspanFunc storeSpan; __GLstippledSpanFunc storeStippledSpan; __GLspanFunc storeLine; __GLstippledSpanFunc storeStippledLine;
/*
** Read a span (line) of colors from the color buffer. The returned ** format is in the same format used for storage. */ __GLspanFunc fetchSpan; __GLstippledSpanFunc fetchStippledSpan; __GLspanFunc fetchLine; __GLstippledSpanFunc fetchStippledLine;
/*
** Clear the scissor area of the color buffer, clipped to ** the window size. Apply dithering if enabled. */ void (FASTCALL *clear)(__GLcolorBuffer *cfb);
/*
** Pointer to bitmap information. */ struct __GLGENbitmapRec *bitmap; };
/* generic span read routine */ extern GLboolean __glReadSpan(__GLcolorBuffer *cfb, GLint x, GLint y, __GLcolor *results, GLint w);
/* generic accum return span routine */ extern void __glReturnSpan(__GLcolorBuffer *cfb, GLint x, GLint y, const __GLaccumCell *ac, __GLfloat scale, GLint w);
/* generic span fetch routine */ extern GLboolean FASTCALL __glFetchSpan(__GLcontext *gc);
/************************************************************************/
struct __GLdepthBufferRec { __GLbuffer buf;
GLuint writeMask;
/*
** Scale factor used to convert users ZValues (0.0 to 1.0, inclusive) ** into this depth buffers range. */ GLuint scale;
/*
** This function updates the internal procedure pointers based ** on a state change in the context. */ void (FASTCALL *pick)(__GLcontext *gc, __GLdepthBuffer *dfb, GLint depthIndex );
/*
** Attempt to update the depth buffer using z. If the depth function ** passes then the depth buffer is updated and True is returned, ** otherwise False is returned. The caller is responsible for ** updating the stencil buffer. */
GLboolean (*store)(__GLdepthBuffer *dfb, GLint x, GLint y, __GLzValue z);
/*
** Clear the scissor area of the buffer clipped to the window ** area. No other modes apply. */ void (FASTCALL *clear)(__GLdepthBuffer *dfb);
/*
** Direct access routines used by ReadPixels(), WritePixels(), ** CopyPixels(). */ GLboolean (*store2)(__GLdepthBuffer *dfb, GLint x, GLint y, __GLzValue z); __GLzValue (FASTCALL *fetch)(__GLdepthBuffer *dfb, GLint x, GLint y);
/*
** When using MCD, depth values are passed to the MCD driver via a ** 32-bit depth scanline buffer. The normal store proc, for 16-bit ** MCD depth buffers, will translate an incoming 16-bit depth value ** into a 32-bit value before copying it into the scanline buffer. ** ** However, some code paths (such as the generic MCD line code) ** already do all computations in 32-bit no matter what the MCD ** depth buffer size. These code paths need a proc to write their ** values untranslated. ** ** The storeRaw proc will store the incoming z value without any ** translation. */
GLboolean (*storeRaw)(__GLdepthBuffer *dfb, GLint x, GLint y, __GLzValue z); };
#define __GL_DEPTH_ADDR(a,b,c,d) __GL_FB_ADDRESS(a,b,c,d)
/************************************************************************/
struct __GLstencilBufferRec { __GLbuffer buf;
/*
** Stencil test lookup table. The stencil buffer value is masked ** against the stencil mask and then used as an index into this ** table which contains either GL_TRUE or GL_FALSE for the ** index. */ GLboolean *testFuncTable;
/*
** Stencil op tables. These tables contain the new stencil buffer ** value given the old stencil buffer value as an index. */ __GLstencilCell *failOpTable; __GLstencilCell *depthFailOpTable; __GLstencilCell *depthPassOpTable;
/*
** This function updates the internal procedure pointers based ** on a state change in the context. */ void (FASTCALL *pick)(__GLcontext *gc, __GLstencilBuffer *sfb);
/*
** Store a fragment into the buffer. */ void (*store)(__GLstencilBuffer *sfb, GLint x, GLint y, GLint value);
/*
** Fetch a value. */ GLint (FASTCALL *fetch)(__GLstencilBuffer *sfb, GLint x, GLint y);
/*
** Return GL_TRUE if the stencil test passes. */ GLboolean (FASTCALL *testFunc)(__GLstencilBuffer *sfb, GLint x, GLint y);
/*
** Apply the stencil ops to this position. */ void (FASTCALL *failOp)(__GLstencilBuffer *sfb, GLint x, GLint y); void (FASTCALL *passDepthFailOp)(__GLstencilBuffer *sfb, GLint x, GLint y); void (FASTCALL *depthPassOp)(__GLstencilBuffer *sfb, GLint x, GLint y);
/*
** Clear the scissor area of the buffer clipped to the window ** area. No other modes apply. */ void (FASTCALL *clear)(__GLstencilBuffer *sfb); };
#define __GL_STENCIL_ADDR(a,b,c,d) __GL_FB_ADDRESS(a,b,c,d)
/************************************************************************/
struct __GLaccumBufferRec { __GLbuffer buf;
/*
** Scaling factors to convert from color buffer values to accum ** buffer values. */ __GLfloat redScale; __GLfloat greenScale; __GLfloat blueScale; __GLfloat alphaScale;
__GLfloat oneOverRedScale; __GLfloat oneOverGreenScale; __GLfloat oneOverBlueScale; __GLfloat oneOverAlphaScale;
__GLuicolor shift, mask, sign; // Cache of commonly used values
__GLcolor *colors; // Temporary scanline buffer ptr
/*
** This function updates the internal procedure pointers based ** on a state change in the context. */ void (FASTCALL *pick)(__GLcontext *gc, __GLaccumBuffer *afb);
/*
** Clear a rectangular region in the buffer. The scissor area is ** cleared. */ void (FASTCALL *clear)(__GLaccumBuffer *afb);
/*
** Accumulate data into the accum buffer. */ void (*accumulate)(__GLaccumBuffer *afb, __GLfloat value);
/*
** Load data into the accum buffer. */ void (*load)(__GLaccumBuffer *afb, __GLfloat value);
/*
** Return data from the accum buffer to the current framebuffer. */ void (*ret)(__GLaccumBuffer *afb, __GLfloat value);
/*
** Multiply the accum buffer by the value. */ void (*mult)(__GLaccumBuffer *afb, __GLfloat value);
/*
** Add the value to the accum buffer. */ void (*add)(__GLaccumBuffer *afb, __GLfloat value); };
#define __GL_ACCUM_ADDRESS(a,b,c,d) __GL_FB_ADDRESS(a,b,c,d)
/************************************************************************/
extern void FASTCALL __glInitAccum64(__GLcontext *gc, __GLaccumBuffer *afb); extern void FASTCALL __glFreeAccum64(__GLcontext *gc, __GLaccumBuffer *afb); extern void FASTCALL __glInitAccum32(__GLcontext *gc, __GLaccumBuffer *afb);
extern void FASTCALL __glInitCI4(__GLcontext *gc, __GLcolorBuffer *cfb); extern void FASTCALL __glInitCI8(__GLcontext *gc, __GLcolorBuffer *cfb); extern void FASTCALL __glInitCI16(__GLcontext *gc, __GLcolorBuffer *cfb);
extern void FASTCALL __glInitStencil8(__GLcontext *gc, __GLstencilBuffer *sfb); extern void FASTCALL __glInitAlpha(__GLcontext *gc, __GLcolorBuffer *cfb); extern void FASTCALL __glFreeStencil8(__GLcontext *gc, __GLstencilBuffer *sfb);
#ifdef NT
extern void FASTCALL __glInitDepth16(__GLcontext *gc, __GLdepthBuffer *dfb); #endif
extern void FASTCALL __glInitDepth32(__GLcontext *gc, __GLdepthBuffer *dfb); extern void FASTCALL __glFreeDepth32(__GLcontext *gc, __GLdepthBuffer *dfb);
extern void FASTCALL __glClearBuffers(__GLcontext *gc, GLuint mask);
#endif /* __glbuffers_h_ */
|