windows-nt/Source/XPSP1/NT/multimedia/opengl/server/soft/so_depth.c
2020-09-26 16:20:57 +08:00

668 lines
14 KiB
C

/*
** Copyright 1991, 1992, 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
static __GLzValue FASTCALL Fetch(__GLdepthBuffer *fb, GLint x, GLint y)
{
__GLzValue *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
return fp[0];
}
static GLboolean StoreNEVER(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
#ifdef __GL_LINT
fb = fb;
x = y;
z = z;
#endif
return GL_FALSE;
}
static GLboolean StoreLESS(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "StoreLESS: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
if (z < fp[0]) {
fp[0] = z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean StoreEQUAL(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "StoreEQUAL: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
if (z == fp[0]) {
fp[0] = z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean StoreLEQUAL(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "StoreLEQUAL: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
if (z <= fp[0]) {
fp[0] = z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean StoreGREATER(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "StoreGREATER: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
if (z > fp[0]) {
fp[0] = z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean StoreNOTEQUAL(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "StoreNOTEQUAL: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
if (z != fp[0]) {
fp[0] = z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean StoreGEQUAL(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "StoreGEQUAL: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
if (z >= fp[0]) {
fp[0] = z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean StoreALWAYS(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "StoreALWAYS: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
fp[0] = z;
return GL_TRUE;
}
/************************************************************************/
static GLboolean StoreLESS_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
return z < fp[0];
}
static GLboolean StoreEQUAL_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
return z == fp[0];
}
static GLboolean StoreLEQUAL_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
return z <= fp[0];
}
static GLboolean StoreGREATER_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
return z > fp[0];
}
static GLboolean StoreNOTEQUAL_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
return z != fp[0];
}
static GLboolean StoreGEQUAL_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLzValue *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLzValue*), x, y);
return z >= fp[0];
}
static GLboolean StoreALWAYS_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
#ifdef __GL_LINT
fb = fb;
x = y;
z = z;
#endif
return GL_TRUE;
}
#ifdef NT
static __GLzValue FASTCALL Fetch16(__GLdepthBuffer *fb, GLint x, GLint y)
{
__GLz16Value *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
return (__GLzValue) fp[0];
}
static GLboolean Store16NEVER(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
#ifdef __GL_LINT
fb = fb;
x = y;
z = z;
#endif
return GL_FALSE;
}
static GLboolean Store16LESS(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "Store16LESS: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
if (z < fp[0]) {
fp[0] = (__GLz16Value)z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean Store16EQUAL(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "Store16EQUAL: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
if (z == fp[0]) {
fp[0] = (__GLz16Value)z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean Store16LEQUAL(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "Store16LEQUAL: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
if (z <= fp[0]) {
fp[0] = (__GLz16Value)z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean Store16GREATER(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "Store16GREATER: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
if (z > fp[0]) {
fp[0] = (__GLz16Value)z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean Store16NOTEQUAL(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "Store16NOTEQUAL: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
if (z != fp[0]) {
fp[0] = (__GLz16Value)z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean Store16GEQUAL(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "Store16GEQUAL: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
if (z >= fp[0]) {
fp[0] = (__GLz16Value)z;
return GL_TRUE;
}
return GL_FALSE;
}
static GLboolean Store16ALWAYS(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
#ifdef ASSERT_BUFFER
ASSERTOPENGL(fb->buf.base != NULL, "Store16ALWAYS: No depth buffer\n");
#endif
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
fp[0] = (__GLz16Value)z;
return GL_TRUE;
}
/************************************************************************/
static GLboolean Store16LESS_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
return z < fp[0];
}
static GLboolean Store16EQUAL_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
return z == fp[0];
}
static GLboolean Store16LEQUAL_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
return z <= fp[0];
}
static GLboolean Store16GREATER_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
return z > fp[0];
}
static GLboolean Store16NOTEQUAL_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
return z != fp[0];
}
static GLboolean Store16GEQUAL_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
__GLz16Value *fp;
fp = __GL_DEPTH_ADDR(fb, (__GLz16Value*), x, y);
return z >= fp[0];
}
static GLboolean Store16ALWAYS_W(__GLdepthBuffer *fb,
GLint x, GLint y, __GLzValue z)
{
#ifdef __GL_LINT
fb = fb;
x = y;
z = z;
#endif
return GL_TRUE;
}
#endif //NT
/************************************************************************/
static void FASTCALL Clear(__GLdepthBuffer *dfb)
{
__GLcontext *gc = dfb->buf.gc;
__GLzValue *fb;
GLint x, y, x1, y1;
GLint skip, w, w32, w4, w1;
__GLzValue z = (__GLzValue)(gc->state.depth.clear * dfb->scale);
#ifdef NT
if( !gc->state.depth.writeEnable )
return;
#endif
x = gc->transform.clipX0;
y = gc->transform.clipY0;
x1 = gc->transform.clipX1;
y1 = gc->transform.clipY1;
if (((w = x1 - x) == 0) || (y1 - y == 0)) {
return;
}
fb = __GL_DEPTH_ADDR(dfb, (__GLzValue*), x, y);
#ifdef NT
ASSERTOPENGL(sizeof(ULONG) == sizeof(__GLzValue),
"Incorrect __GLzValue size\n");
skip = dfb->buf.outerWidth;
if (skip == w)
{
w = w * (y1 - y) * sizeof(ULONG);
RtlFillMemoryUlong((PVOID) fb, (ULONG) w, (ULONG) z);
}
else
{
w = w * sizeof(ULONG); // convert to byte count
for (; y < y1; y++)
{
RtlFillMemoryUlong((PVOID) fb, (ULONG) w, (ULONG) z);
fb += skip;
}
}
#else
skip = dfb->buf.outerWidth - w;
w32 = w >> 5;
w4 = (w & 31) >> 2;
w1 = w & 3;
for (; y < y1; y++) {
w = w32;
while (--w >= 0) {
fb[0] = z; fb[1] = z; fb[2] = z; fb[3] = z;
fb[4] = z; fb[5] = z; fb[6] = z; fb[7] = z;
fb[8] = z; fb[9] = z; fb[10] = z; fb[11] = z;
fb[12] = z; fb[13] = z; fb[14] = z; fb[15] = z;
fb[16] = z; fb[17] = z; fb[18] = z; fb[19] = z;
fb[20] = z; fb[21] = z; fb[22] = z; fb[23] = z;
fb[24] = z; fb[25] = z; fb[26] = z; fb[27] = z;
fb[28] = z; fb[29] = z; fb[30] = z; fb[31] = z;
fb += 32;
}
w = w4;
while (--w >= 0) {
fb[0] = z; fb[1] = z; fb[2] = z; fb[3] = z;
fb += 4;
}
w = w1;
while (--w >= 0) {
*fb++ = z;
}
fb += skip;
}
#endif // NT
}
#ifdef NT
/************************************************************************/
static void FASTCALL Clear16(__GLdepthBuffer *dfb)
{
__GLcontext *gc = dfb->buf.gc;
__GLz16Value *fb;
GLint x, y, x1, y1;
GLint skip, w;
__GLz16Value z = (__GLz16Value)(gc->state.depth.clear * dfb->scale);
__GLzValue zz = (z << 16) | z;
#ifdef NT
if( !gc->state.depth.writeEnable )
return;
#endif
x = gc->transform.clipX0;
y = gc->transform.clipY0;
x1 = gc->transform.clipX1;
y1 = gc->transform.clipY1;
if (((w = x1 - x) == 0) || (y1 - y == 0)) {
return;
}
fb = __GL_DEPTH_ADDR(dfb, (__GLz16Value*), x, y);
skip = dfb->buf.outerWidth;
// handle word overhangs onto long boundaries
if( (ULONG_PTR)fb & 0x2 ) { // Left word overhang
int ysav = y;
__GLz16Value *fbsav = fb;
for( ; y < y1; y ++, fb+=skip ) {
*fb = z;
}
y = ysav;
fb = fbsav+1;
w--;
}
if( (ULONG)((ULONG_PTR)fb + w*sizeof(__GLz16Value)) & 0x2 ) { // Right overhang
int ysav = y;
__GLz16Value *fbsav = fb;
w--;
fb += w;
for( ; y < y1; y ++, fb+=skip ) {
*fb = z;
}
y = ysav;
fb = fbsav;
}
// Do 4byte-aligned stuff
if (skip == w)
{
w = w * (y1 - y) * sizeof(__GLz16Value);
RtlFillMemoryUlong((PVOID) fb, (ULONG) w, (ULONG) zz);
}
else
{
if( skip & 0x1 ) { // skip is odd - successive lines will NOT be
// quad-word aligned
int i;
for (; y < y1; y++)
{
for( i = 0; i < w; i ++ )
*fb++ = z;
fb += (skip-w);
}
}
else {
w = w * sizeof(__GLz16Value); // convert to byte count
for (; y < y1; y++)
{
RtlFillMemoryUlong((PVOID) fb, (ULONG) w, (ULONG) zz);
fb += skip;
}
}
}
}
#endif // NT
/************************************************************************/
static GLboolean (*StoreProcs[32])(__GLdepthBuffer*, GLint, GLint, __GLzValue)
= {
StoreNEVER,
StoreLESS,
StoreEQUAL,
StoreLEQUAL,
StoreGREATER,
StoreNOTEQUAL,
StoreGEQUAL,
StoreALWAYS,
StoreNEVER,
StoreLESS_W,
StoreEQUAL_W,
StoreLEQUAL_W,
StoreGREATER_W,
StoreNOTEQUAL_W,
StoreGEQUAL_W,
StoreALWAYS_W,
Store16NEVER,
Store16LESS,
Store16EQUAL,
Store16LEQUAL,
Store16GREATER,
Store16NOTEQUAL,
Store16GEQUAL,
Store16ALWAYS,
Store16NEVER,
Store16LESS_W,
Store16EQUAL_W,
Store16LEQUAL_W,
Store16GREATER_W,
Store16NOTEQUAL_W,
Store16GEQUAL_W,
Store16ALWAYS_W
};
static void FASTCALL Pick(__GLcontext *gc, __GLdepthBuffer *fb, GLint depthIndex)
{
fb->store = StoreProcs[depthIndex];
fb->storeRaw = StoreProcs[depthIndex];
}
void FASTCALL __glInitDepth32(__GLcontext *gc, __GLdepthBuffer *fb)
{
fb->buf.elementSize = sizeof(__GLzValue);
fb->buf.gc = gc;
fb->scale = (__GLzValue) ~0;
fb->writeMask = (__GLzValue) ~0;
fb->pick = Pick;
fb->clear = Clear;
fb->store2 = StoreALWAYS;
fb->fetch = Fetch;
}
#ifdef NT
void FASTCALL __glInitDepth16(__GLcontext *gc, __GLdepthBuffer *fb)
{
fb->buf.elementSize = sizeof(__GLz16Value);
fb->buf.gc = gc;
fb->scale = (__GLz16Value) ~0;
fb->writeMask = (__GLz16Value) ~0;
fb->pick = Pick;
fb->clear = Clear16;
fb->store2 = Store16ALWAYS;
fb->fetch = Fetch16;
}
#endif
void FASTCALL __glFreeDepth32(__GLcontext *gc, __GLdepthBuffer *fb)
{
#ifdef __GL_LINT
gc = gc;
fb = fb;
#endif
}