|
|
/*
** 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
}
|