472 lines
14 KiB
C
472 lines
14 KiB
C
#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_ */
|