s_depth.c revision 14f21c785087f86d291243400e59ebfc8721c4f6
1e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library
37cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul * Version:  7.2.1
422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
57cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
7e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
8e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * copy of this software and associated documentation files (the "Software"),
9e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to deal in the Software without restriction, including without limitation
10e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
12e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Software is furnished to do so, subject to the following conditions:
1322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
14e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included
15e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software.
1622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
24e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
25e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
26bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h"
27bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/context.h"
28bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h"
29bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h"
30bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/fbobject.h"
31e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
32e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.h"
33cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell#include "s_context.h"
3467074332728acba86da7630353673b458713bb8aBrian Paul#include "s_span.h"
35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
3779c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/**
38e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Do depth test for a horizontal span of fragments.
39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Input:  zbuffer - array of z values in the zbuffer
40e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *         z - array of fragment z values
41e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Return:  number of fragments which pass the test.
42e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
43e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic GLuint
44733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Pauldepth_test_span16( GLcontext *ctx, GLuint n,
45e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                   GLushort zbuffer[], const GLuint z[], GLubyte mask[] )
46e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
47e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLuint passed = 0;
48e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
49e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* switch cases ordered from most frequent to less frequent */
50e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   switch (ctx->Depth.Func) {
51e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LESS:
52e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
53e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
54e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
55e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
56e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
57e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < zbuffer[i]) {
58e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
59e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
63e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
65e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
66e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
67e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
68e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
69e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
70e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
72e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
73e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
74e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < zbuffer[i]) {
75e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
76e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
77e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
78e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
79e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
80e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
81e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
82e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
83e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
84e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
85e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LEQUAL:
86e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
87e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
88e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
89e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
90e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
91e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= zbuffer[i]) {
92e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
93e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
94e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
95e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
96e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
97e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
98e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
99e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
103e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
104e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= zbuffer[i]) {
107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GEQUAL:
118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= zbuffer[i]) {
124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
137e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= zbuffer[i]) {
139e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
140e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
144e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
145e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GREATER:
150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > zbuffer[i]) {
156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
169e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
170e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > zbuffer[i]) {
171e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
172e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
173e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
176e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
177e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NOTEQUAL:
182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
183e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
184e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != zbuffer[i]) {
188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != zbuffer[i]) {
203e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_EQUAL:
214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == zbuffer[i]) {
220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == zbuffer[i]) {
235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_ALWAYS:
246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  zbuffer[i] = z[i];
252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  passed++;
253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer or mask */
258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    passed = n;
259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NEVER:
2626ec6b845fdf3c44436028ad6fff9471d18928719Brian Paul         _mesa_bzero(mask, n * sizeof(GLubyte));
263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      default:
26508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(ctx, "Bad depth func in depth_test_span16");
266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   return passed;
269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic GLuint
273733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Pauldepth_test_span32( GLcontext *ctx, GLuint n,
274e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                   GLuint zbuffer[], const GLuint z[], GLubyte mask[] )
275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLuint passed = 0;
277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* switch cases ordered from most frequent to less frequent */
279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   switch (ctx->Depth.Func) {
280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LESS:
281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < zbuffer[i]) {
287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < zbuffer[i]) {
304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LEQUAL:
315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= zbuffer[i]) {
321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
324e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
326e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= zbuffer[i]) {
336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
345e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
346e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GEQUAL:
347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
352e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= zbuffer[i]) {
353e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
354e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
355e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
356e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
357e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
360e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
362e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
365e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
366e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
367e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= zbuffer[i]) {
368e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
369e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
370e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
375e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
376e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
377e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
378e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GREATER:
379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > zbuffer[i]) {
385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
388e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
389e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
390e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > zbuffer[i]) {
400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
401e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
402e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NOTEQUAL:
411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
412e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
416e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != zbuffer[i]) {
417e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
422e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
425e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
429e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
431e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != zbuffer[i]) {
432e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
434e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
435e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
437e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
438e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
440e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
441e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
442e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_EQUAL:
443e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
444e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
445e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
446e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
447e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
448e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == zbuffer[i]) {
449e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     zbuffer[i] = z[i];
450e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
452e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
453e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
454e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
455e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
456e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
457e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
458e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
459e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
460e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
461e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
462e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
463e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == zbuffer[i]) {
464e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
465e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     passed++;
466e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
467e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
468e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
469e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
470e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
471e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
472e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
473e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
474e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_ALWAYS:
475e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
476e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
477e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
478e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {
479e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
480e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  zbuffer[i] = z[i];
481e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  passed++;
482e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
483e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
484e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
485e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
486e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer or mask */
487e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    passed = n;
488e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
489e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
490e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NEVER:
4916ec6b845fdf3c44436028ad6fff9471d18928719Brian Paul         _mesa_bzero(mask, n * sizeof(GLubyte));
492e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
493e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      default:
49408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_problem(ctx, "Bad depth func in depth_test_span32");
495e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
496e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
497e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   return passed;
498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
500e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
501e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
50210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul/*
503e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Apply depth test to span of fragments.
50410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul */
505733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paulstatic GLuint
506cdb27e8242215271364602995d85607cfc06d441Brian Pauldepth_test_span( GLcontext *ctx, SWspan *span)
50710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul{
508e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_framebuffer *fb = ctx->DrawBuffer;
5091a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul   struct gl_renderbuffer *rb = fb->_DepthBuffer;
51079c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul   const GLint x = span->x;
51179c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul   const GLint y = span->y;
512e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLuint count = span->end;
513e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLuint *zValues = span->array->z;
514e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLubyte *mask = span->array->mask;
515e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLuint passed;
51610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
51779c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul   ASSERT((span->arrayMask & SPAN_XY) == 0);
518f1e236987829393c81dc86ea19cb49eefe190317Brian Paul   ASSERT(span->arrayMask & SPAN_Z);
51910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
520e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb->GetPointer(ctx, rb, 0, 0)) {
521e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Directly access buffer */
5222526152a107e4323161b95188e767620c4998639Brian Paul      if (rb->DataType == GL_UNSIGNED_SHORT) {
523e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLushort *zbuffer = (GLushort *) rb->GetPointer(ctx, rb, x, y);
524e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         passed = depth_test_span16(ctx, count, zbuffer, zValues, mask);
52510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul      }
52610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul      else {
527e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint *zbuffer = (GLuint *) rb->GetPointer(ctx, rb, x, y);
5282526152a107e4323161b95188e767620c4998639Brian Paul         ASSERT(rb->DataType == GL_UNSIGNED_INT);
529e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         passed = depth_test_span32(ctx, count, zbuffer, zValues, mask);
53010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul      }
531e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
532e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else {
533e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* read depth values from buffer, test, write back */
534e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (rb->DataType == GL_UNSIGNED_SHORT) {
535e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLushort zbuffer[MAX_WIDTH];
536e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->GetRow(ctx, rb, count, x, y, zbuffer);
5377cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         passed = depth_test_span16(ctx, count, zbuffer, zValues, mask);
5387cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         rb->PutRow(ctx, rb, count, x, y, zbuffer, mask);
53936c3df78f4592443de7c065b6d539f4c2914d870Brian Paul      }
540e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
541e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint zbuffer[MAX_WIDTH];
542e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         ASSERT(rb->DataType == GL_UNSIGNED_INT);
543e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->GetRow(ctx, rb, count, x, y, zbuffer);
5447cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         passed = depth_test_span32(ctx, count, zbuffer, zValues, mask);
5457cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         rb->PutRow(ctx, rb, count, x, y, zbuffer, mask);
546b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul      }
54710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul   }
548e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
549e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (passed < count) {
550e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      span->writeAll = GL_FALSE;
551e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
552e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return passed;
55310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul}
55410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
556e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
557e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define Z_ADDRESS(X, Y)   (zStart + (Y) * stride + (X))
558e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
559e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
560e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
561e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Do depth testing for an array of fragments at assorted locations.
562e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
563e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void
564e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Pauldirect_depth_test_pixels16(GLcontext *ctx, GLushort *zStart, GLuint stride,
565e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                           GLuint n, const GLint x[], const GLint y[],
566e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                           const GLuint z[], GLubyte mask[] )
567e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
568e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* switch cases ordered from most frequent to less frequent */
569e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   switch (ctx->Depth.Func) {
570e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LESS:
571e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
572e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
573e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
574e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
575e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
576e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
577e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < *zptr) {
578e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
579e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
580e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
581e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
582e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
583e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
584e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
585e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
586e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
587e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
588e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
589e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
590e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
591e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
592e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
593e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
594e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < *zptr) {
595e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
596e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
597e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
598e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
599e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
600e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
601e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
602e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
603e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
604e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
605e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LEQUAL:
606e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
607e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
608e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
609e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
611e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
612e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= *zptr) {
613e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
614e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
615e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
616e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
618e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
619e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
620e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
621e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
622e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
626e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
628e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= *zptr) {
630e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
631e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
632e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
633e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
634e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
635e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
636e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
637e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
638e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
639e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
640e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GEQUAL:
641e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
642e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
643e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
644e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
645e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
646e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
647e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= *zptr) {
648e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
649e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
650e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
651e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
652e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
653e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
654e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
655e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
656e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
657e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
658e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
659e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
661e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
663e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= *zptr) {
665e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
666e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
668e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
669e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
670e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
671e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
673e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
674e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GREATER:
676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
677e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
678e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
681e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
682e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > *zptr) {
683e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
684e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
685e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
686e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
687e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
688e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
689e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
690e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
691e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
694e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
696e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
697e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
698e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
699e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > *zptr) {
700e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
701e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
702e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
703e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
704e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
705e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
706e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
707e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
708e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
709e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
710e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NOTEQUAL:
711e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
713e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
714e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
715e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
716e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
717e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != *zptr) {
718e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
719e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
720e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
721e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
722e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
723e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
724e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
725e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
726e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
728e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
729e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
730e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
731e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
732e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
733e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
734e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != *zptr) {
735e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
736e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
737e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
738e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
742e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
743e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
744e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_EQUAL:
746e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
747e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
748e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
751e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
752e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == *zptr) {
753e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
754e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
755e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
756e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
757e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
758e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
759e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
760e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
761e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
762e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
763e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
764e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
765e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
766e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
767e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
768e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == *zptr) {
770e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
772e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
775e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
776e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
777e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
778e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
779e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
780e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_ALWAYS:
781e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
783e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
786e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  *zptr = z[i];
788e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
789e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
790e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
791e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
792e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer or mask */
793e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
794e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
795e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NEVER:
796e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 /* depth test never passes */
7976ec6b845fdf3c44436028ad6fff9471d18928719Brian Paul         _mesa_bzero(mask, n * sizeof(GLubyte));
798e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
799e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      default:
800e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_problem(ctx, "Bad depth func in direct_depth_test_pixels");
801e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
802e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
803e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
804e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
806e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
807e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Do depth testing for an array of fragments with direct access to zbuffer.
808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void
810e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Pauldirect_depth_test_pixels32(GLcontext *ctx, GLuint *zStart, GLuint stride,
811e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                           GLuint n, const GLint x[], const GLint y[],
812e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                           const GLuint z[], GLubyte mask[] )
813e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* switch cases ordered from most frequent to less frequent */
815e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   switch (ctx->Depth.Func) {
816e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LESS:
817e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
818e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
820e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
821e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
822e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
823e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < *zptr) {
824e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
825e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
826e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
827e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
828e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
829e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
834e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
835e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
836e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
838e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
839e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < *zptr) {
841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
842e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
843e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
844e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
845e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
847e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
848e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
849e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
850e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LEQUAL:
852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
853e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
854e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
855e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
856e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
857e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= *zptr) {
859e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
860e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
861e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
862e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
863e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
864e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
865e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
866e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
867e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
868e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
869e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
870e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
871e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
872e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
873e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
874e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
875e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= *zptr) {
876e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
877e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
878e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
879e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
880e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
881e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
882e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
885e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
886e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GEQUAL:
887e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
888e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
889e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
890e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
891e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
892e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
893e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= *zptr) {
894e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
895e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
896e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
897e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
898e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
899e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
900e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
901e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
902e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
903e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
904e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
905e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
906e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
907e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
908e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
909e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
910e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= *zptr) {
911e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
912e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
913e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
914e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
915e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
916e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
917e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
918e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
919e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
920e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
921e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GREATER:
922e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
923e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
924e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
925e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
926e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
927e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
928e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > *zptr) {
929e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
930e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
931e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
932e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
933e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
934e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
935e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
936e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
937e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
938e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
939e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
940e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
941e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
942e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
943e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
944e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
945e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > *zptr) {
946e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
947e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
948e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
949e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
950e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
951e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
952e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
953e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
954e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
955e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
956e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NOTEQUAL:
957e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
958e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
959e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
960e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
961e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
962e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
963e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != *zptr) {
964e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
965e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
966e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
967e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
968e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
969e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
970e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
971e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
972e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
973e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
974e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
975e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
976e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
977e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
978e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
979e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
980e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != *zptr) {
981e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
982e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
983e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
984e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
985e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
986e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
987e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
988e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
989e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
990e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
991e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_EQUAL:
992e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
993e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
994e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
995e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
996e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
997e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
998e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == *zptr) {
999e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
1000e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
1001e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1002e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
1003e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
1004e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
1005e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1006e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
1007e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
1008e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1009e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
1010e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
1011e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
1012e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
1013e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
1014e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
1015e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == *zptr) {
1016e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
1017e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1018e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
1019e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
1020e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
1021e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1022e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
1023e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
1024e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1025e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
1026e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_ALWAYS:
1027e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
1028e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
1029e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
1030e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
1031e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
1032e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
1033e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  *zptr = z[i];
1034e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
1035e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
1036e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1037e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
1038e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer or mask */
1039e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1040e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
1041e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NEVER:
1042e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 /* depth test never passes */
10436ec6b845fdf3c44436028ad6fff9471d18928719Brian Paul         _mesa_bzero(mask, n * sizeof(GLubyte));
1044e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
1045e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      default:
1046e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_problem(ctx, "Bad depth func in direct_depth_test_pixels");
1047e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1048e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1049e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1050e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1051e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
105279c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul
105379c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paulstatic GLuint
1054cdb27e8242215271364602995d85607cfc06d441Brian Pauldepth_test_pixels( GLcontext *ctx, SWspan *span )
1055e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
1056e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_framebuffer *fb = ctx->DrawBuffer;
10571a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul   struct gl_renderbuffer *rb = fb->_DepthBuffer;
1058e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLuint count = span->end;
105977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   const GLint *x = span->array->x;
106077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   const GLint *y = span->array->y;
1061e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLuint *z = span->array->z;
106277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLubyte *mask = span->array->mask;
106379c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul
1064e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb->GetPointer(ctx, rb, 0, 0)) {
1065e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Directly access values */
1066e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (rb->DataType == GL_UNSIGNED_SHORT) {
1067e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLushort *zStart = (GLushort *) rb->Data;
1068e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint stride = rb->Width;
1069e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         direct_depth_test_pixels16(ctx, zStart, stride, count, x, y, z, mask);
1070e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1071e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
1072e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint *zStart = (GLuint *) rb->Data;
1073e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint stride = rb->Width;
10742526152a107e4323161b95188e767620c4998639Brian Paul         ASSERT(rb->DataType == GL_UNSIGNED_INT);
1075e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         direct_depth_test_pixels32(ctx, zStart, stride, count, x, y, z, mask);
1076e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1077e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1078e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
1079e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* read depth values from buffer, test, write back */
1080e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (rb->DataType == GL_UNSIGNED_SHORT) {
1081e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLushort zbuffer[MAX_WIDTH];
108267074332728acba86da7630353673b458713bb8aBrian Paul         _swrast_get_values(ctx, rb, count, x, y, zbuffer, sizeof(GLushort));
10837cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         depth_test_span16(ctx, count, zbuffer, z, mask);
10847cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         rb->PutValues(ctx, rb, count, x, y, zbuffer, mask);
1085e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1086e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
1087e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint zbuffer[MAX_WIDTH];
1088e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         ASSERT(rb->DataType == GL_UNSIGNED_INT);
108967074332728acba86da7630353673b458713bb8aBrian Paul         _swrast_get_values(ctx, rb, count, x, y, zbuffer, sizeof(GLuint));
10907cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         depth_test_span32(ctx, count, zbuffer, z, mask);
10917cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         rb->PutValues(ctx, rb, count, x, y, zbuffer, mask);
1092e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1093e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1094e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1095e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return count; /* not really correct, but OK */
1096e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1097e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1098e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
109979c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/**
110079c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul * Apply depth (Z) buffer testing to the span.
110179c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul * \return approx number of pixels that passed (only zero is reliable)
110279c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul */
1103733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian PaulGLuint
1104cdb27e8242215271364602995d85607cfc06d441Brian Paul_swrast_depth_test_span( GLcontext *ctx, SWspan *span)
1105733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul{
110679c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul   if (span->arrayMask & SPAN_XY)
110779c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul      return depth_test_pixels(ctx, span);
110879c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul   else
1109733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul      return depth_test_span(ctx, span);
1110733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul}
1111733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul
1112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1113e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul/**
1114e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * GL_EXT_depth_bounds_test extension.
1115e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * Discard fragments depending on whether the corresponding Z-buffer
1116e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * values are outside the depth bounds test range.
1117e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * Note: we test the Z buffer values, not the fragment Z values!
1118e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * \return GL_TRUE if any fragments pass, GL_FALSE if no fragments pass
1119e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul */
1120e5b244ff7f984805c1bcc020342f1300f2639c71Brian PaulGLboolean
1121cdb27e8242215271364602995d85607cfc06d441Brian Paul_swrast_depth_bounds_test( GLcontext *ctx, SWspan *span )
1122e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul{
1123e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_framebuffer *fb = ctx->DrawBuffer;
11241a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul   struct gl_renderbuffer *rb = fb->_DepthBuffer;
1125e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLuint zMin = (GLuint) (ctx->Depth.BoundsMin * fb->_DepthMaxF + 0.5F);
1126e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLuint zMax = (GLuint) (ctx->Depth.BoundsMax * fb->_DepthMaxF + 0.5F);
1127e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   GLubyte *mask = span->array->mask;
1128e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLuint count = span->end;
1129e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   GLuint i;
1130e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   GLboolean anyPass = GL_FALSE;
1131e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul
1132e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb->DataType == GL_UNSIGNED_SHORT) {
1133e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* get 16-bit values */
1134e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      GLushort zbuffer16[MAX_WIDTH], *zbuffer;
1135e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (span->arrayMask & SPAN_XY) {
113667074332728acba86da7630353673b458713bb8aBrian Paul         _swrast_get_values(ctx, rb, count, span->array->x, span->array->y,
113767074332728acba86da7630353673b458713bb8aBrian Paul                            zbuffer16, sizeof(GLushort));
1138e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         zbuffer = zbuffer16;
1139e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1140e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
11419580179dfb42d5b81ff6ec9704b82a556c7f1229Brian Paul         zbuffer = (GLushort*) rb->GetPointer(ctx, rb, span->x, span->y);
1142e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         if (!zbuffer) {
1143e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            rb->GetRow(ctx, rb, count, span->x, span->y, zbuffer16);
1144e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            zbuffer = zbuffer16;
1145e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         }
1146e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1147e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      assert(zbuffer);
1148e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1149e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Now do the tests */
1150e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      for (i = 0; i < count; i++) {
1151e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul         if (mask[i]) {
1152e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul            if (zbuffer[i] < zMin || zbuffer[i] > zMax)
1153e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul               mask[i] = GL_FALSE;
1154e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul            else
1155e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul               anyPass = GL_TRUE;
1156e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul         }
1157e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul      }
1158e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   }
1159e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   else {
1160e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* get 32-bit values */
1161e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      GLuint zbuffer32[MAX_WIDTH], *zbuffer;
11622526152a107e4323161b95188e767620c4998639Brian Paul      ASSERT(rb->DataType == GL_UNSIGNED_INT);
1163e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul      if (span->arrayMask & SPAN_XY) {
116467074332728acba86da7630353673b458713bb8aBrian Paul         _swrast_get_values(ctx, rb, count, span->array->x, span->array->y,
116567074332728acba86da7630353673b458713bb8aBrian Paul                            zbuffer32, sizeof(GLuint));
1166e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         zbuffer = zbuffer32;
1167e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul      }
1168e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul      else {
11699580179dfb42d5b81ff6ec9704b82a556c7f1229Brian Paul         zbuffer = (GLuint*) rb->GetPointer(ctx, rb, span->x, span->y);
1170e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         if (!zbuffer) {
1171e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            rb->GetRow(ctx, rb, count, span->x, span->y, zbuffer32);
1172e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            zbuffer = zbuffer32;
1173e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul         }
1174e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1175e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      assert(zbuffer);
1176e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1177e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Now do the tests */
1178e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      for (i = 0; i < count; i++) {
1179e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         if (mask[i]) {
1180e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            if (zbuffer[i] < zMin || zbuffer[i] > zMax)
1181e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul               mask[i] = GL_FALSE;
1182e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            else
1183e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul               anyPass = GL_TRUE;
1184e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul         }
1185e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul      }
1186e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   }
1187e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1188e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   return anyPass;
1189e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul}
1190e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul
1191e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul
1192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/**********************************************************************/
1194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*****                      Read Depth Buffer                     *****/
1195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/**********************************************************************/
1196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
119879c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/**
119982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * Read a span of depth values from the given depth renderbuffer, returning
120082e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * the values as GLfloats.
120182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * This function does clipping to prevent reading outside the depth buffer's
120282e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * bounds.  Though the clipping is redundant when we're called from
120382e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * _swrast_ReadPixels.
1204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
1205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
120682e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul_swrast_read_depth_span_float( GLcontext *ctx, struct gl_renderbuffer *rb,
120782e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul                               GLint n, GLint x, GLint y, GLfloat depth[] )
1208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
120982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   const GLfloat scale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
121082e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul
121182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   if (!rb) {
121282e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      /* really only doing this to prevent FP exceptions later */
121382e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      _mesa_bzero(depth, n * sizeof(GLfloat));
121414f21c785087f86d291243400e59ebfc8721c4f6Brian Paul      return;
121582e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   }
121682e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul
121782e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   ASSERT(rb->_BaseFormat == GL_DEPTH_COMPONENT);
121882e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul
1219e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (y < 0 || y >= (GLint) rb->Height ||
122082b29819a9ede846ad5c37ff70b71d45cf72357aBrian Paul       x + n <= 0 || x >= (GLint) rb->Width) {
1221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* span is completely outside framebuffer */
122282e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      _mesa_bzero(depth, n * sizeof(GLfloat));
1223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return;
1224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (x < 0) {
1227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint dx = -x;
1228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint i;
1229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      for (i = 0; i < dx; i++)
123082e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul         depth[i] = 0.0;
1231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      x = 0;
1232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      n -= dx;
1233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      depth += dx;
1234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1235e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (x + n > (GLint) rb->Width) {
1236e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      GLint dx = x + n - (GLint) rb->Width;
1237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint i;
1238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      for (i = 0; i < dx; i++)
123982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul         depth[n - i - 1] = 0.0;
1240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      n -= dx;
1241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (n <= 0) {
1243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return;
1244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
124682e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   if (rb->DataType == GL_UNSIGNED_INT) {
124782e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      GLuint temp[MAX_WIDTH];
124882e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      GLint i;
124982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      rb->GetRow(ctx, rb, n, x, y, temp);
125082e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      for (i = 0; i < n; i++) {
125182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul         depth[i] = temp[i] * scale;
125282e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      }
1253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
125482e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   else if (rb->DataType == GL_UNSIGNED_SHORT) {
1255e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      GLushort temp[MAX_WIDTH];
125682e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      GLint i;
1257e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow(ctx, rb, n, x, y, temp);
1258e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      for (i = 0; i < n; i++) {
12598bdc1ae358986aec81d4e6e3930a85f11680b73bBrian Paul         depth[i] = temp[i] * scale;
1260e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
126282e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   else {
12634fd11949f03039a95dbdbfdae7865615d5a727d6Brian Paul      _mesa_problem(ctx, "Invalid depth renderbuffer data type");
1264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
126879c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/**
1269a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul * As above, but return 32-bit GLuint values.
1270a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul */
1271a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paulvoid
1272a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul_swrast_read_depth_span_uint( GLcontext *ctx, struct gl_renderbuffer *rb,
1273a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul                              GLint n, GLint x, GLint y, GLuint depth[] )
1274a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul{
1275a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   if (!rb) {
1276a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      /* really only doing this to prevent FP exceptions later */
1277a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      _mesa_bzero(depth, n * sizeof(GLfloat));
127814f21c785087f86d291243400e59ebfc8721c4f6Brian Paul      return;
1279a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   }
1280a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul
1281a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   ASSERT(rb->_BaseFormat == GL_DEPTH_COMPONENT);
1282a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul
1283a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   if (y < 0 || y >= (GLint) rb->Height ||
1284a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul       x + n <= 0 || x >= (GLint) rb->Width) {
1285a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      /* span is completely outside framebuffer */
1286a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      _mesa_bzero(depth, n * sizeof(GLfloat));
1287a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      return;
1288a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   }
1289a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul
1290a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   if (x < 0) {
1291a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      GLint dx = -x;
1292a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      GLint i;
1293a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      for (i = 0; i < dx; i++)
129418d1fdebebcb52e7fcf50e62c4c02862d173af51Brian         depth[i] = 0;
1295a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      x = 0;
1296a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      n -= dx;
1297a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      depth += dx;
1298a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   }
1299a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   if (x + n > (GLint) rb->Width) {
1300a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      GLint dx = x + n - (GLint) rb->Width;
1301a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      GLint i;
1302a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      for (i = 0; i < dx; i++)
130318d1fdebebcb52e7fcf50e62c4c02862d173af51Brian         depth[n - i - 1] = 0;
1304a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      n -= dx;
1305a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   }
1306a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   if (n <= 0) {
1307a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      return;
1308a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   }
1309a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul
1310a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   if (rb->DataType == GL_UNSIGNED_INT) {
1311a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      rb->GetRow(ctx, rb, n, x, y, depth);
1312a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      if (rb->DepthBits < 32) {
1313a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul         GLuint shift = 32 - rb->DepthBits;
1314a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul         GLint i;
1315a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul         for (i = 0; i < n; i++) {
1316a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul            GLuint z = depth[i];
1317a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul            depth[i] = z << shift; /* XXX lsb bits? */
1318a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul         }
1319a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      }
1320a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   }
1321a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   else if (rb->DataType == GL_UNSIGNED_SHORT) {
1322a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      GLushort temp[MAX_WIDTH];
1323a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      GLint i;
1324a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      rb->GetRow(ctx, rb, n, x, y, temp);
1325a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      if (rb->DepthBits == 16) {
1326a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul         for (i = 0; i < n; i++) {
1327a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul            GLuint z = temp[i];
1328a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul            depth[i] = (z << 16) | z;
1329a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul         }
1330a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      }
1331a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      else {
1332a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul         GLuint shift = 16 - rb->DepthBits;
1333a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul         for (i = 0; i < n; i++) {
1334a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul            GLuint z = temp[i];
1335a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul            depth[i] = (z << (shift + 16)) | (z << shift); /* XXX lsb bits? */
1336a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul         }
1337a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      }
1338a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   }
1339a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   else {
1340a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul      _mesa_problem(ctx, "Invalid depth renderbuffer data type");
1341a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul   }
1342a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul}
1343a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul
1344a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul
1345a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul
1346a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul/**
134782e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * Clear the given z/depth renderbuffer.
1348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
1349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
1350e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul_swrast_clear_depth_buffer( GLcontext *ctx, struct gl_renderbuffer *rb )
1351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
1352f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   GLuint clearValue;
1353e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLint x, y, width, height;
1354328a039413fd2b8649511f1ca130df2a59f2c71cBrian Paul
1355b5e9b0e56231065f6324bbd3c2c35ca53b46ddf8Brian   if (!rb || !ctx->Depth.Mask) {
1356e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* no depth buffer, or writing to it is disabled */
1357e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return;
1358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1360f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   /* compute integer clearing value */
1361f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   if (ctx->Depth.Clear == 1.0) {
1362f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul      clearValue = ctx->DrawBuffer->_DepthMax;
1363f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   }
1364f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   else {
1365f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul      clearValue = (GLuint) (ctx->Depth.Clear * ctx->DrawBuffer->_DepthMaxF);
1366f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   }
1367f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul
1368e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   assert(rb->_BaseFormat == GL_DEPTH_COMPONENT);
1369e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1370e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   /* compute region to clear */
1371e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   x = ctx->DrawBuffer->_Xmin;
1372e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   y = ctx->DrawBuffer->_Ymin;
1373e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   width  = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin;
1374e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin;
1375e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1376e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb->GetPointer(ctx, rb, 0, 0)) {
1377e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Direct buffer access is possible.  Either this is just malloc'd
1378e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul       * memory, or perhaps the driver mmap'd the zbuffer memory.
1379e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul       */
1380e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (rb->DataType == GL_UNSIGNED_SHORT) {
1381f39569f5509f9298cb5374b9758296d9149add9bBrian Paul         if ((clearValue & 0xff) == ((clearValue >> 8) & 0xff) &&
1382f39569f5509f9298cb5374b9758296d9149add9bBrian Paul             ((GLushort *) rb->GetPointer(ctx, rb, 0, 0) + width ==
1383f39569f5509f9298cb5374b9758296d9149add9bBrian Paul              (GLushort *) rb->GetPointer(ctx, rb, 0, 1))) {
1384e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            /* optimized case */
1385e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            GLushort *dst = (GLushort *) rb->GetPointer(ctx, rb, x, y);
1386e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            GLuint len = width * height * sizeof(GLushort);
1387e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            _mesa_memset(dst, (clearValue & 0xff), len);
1388e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         }
1389e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         else {
1390e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            /* general case */
1391e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            GLint i, j;
1392e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            for (i = 0; i < height; i++) {
1393e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul               GLushort *dst = (GLushort *) rb->GetPointer(ctx, rb, x, y + i);
1394e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul               for (j = 0; j < width; j++) {
1395e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                  dst[j] = clearValue;
1396e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul               }
1397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
1398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
1399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
1400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else {
1401e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLint i, j;
1402e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         ASSERT(rb->DataType == GL_UNSIGNED_INT);
1403e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         for (i = 0; i < height; i++) {
1404e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            GLuint *dst = (GLuint *) rb->GetPointer(ctx, rb, x, y + i);
1405e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            for (j = 0; j < width; j++) {
1406e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul               dst[j] = clearValue;
1407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
1408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
1409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
1410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
1412e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Direct access not possible.  Use PutRow to write new values. */
1413e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (rb->DataType == GL_UNSIGNED_SHORT) {
1414f39569f5509f9298cb5374b9758296d9149add9bBrian Paul         GLushort clearVal16 = (GLushort) (clearValue & 0xffff);
1415f39569f5509f9298cb5374b9758296d9149add9bBrian Paul         GLint i;
1416e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         for (i = 0; i < height; i++) {
1417f39569f5509f9298cb5374b9758296d9149add9bBrian Paul            rb->PutMonoRow(ctx, rb, width, x, y + i, &clearVal16, NULL);
1418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
1419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
1420f39569f5509f9298cb5374b9758296d9149add9bBrian Paul      else if (rb->DataType == GL_UNSIGNED_INT) {
1421f39569f5509f9298cb5374b9758296d9149add9bBrian Paul         GLint i;
1422f39569f5509f9298cb5374b9758296d9149add9bBrian Paul         ASSERT(sizeof(clearValue) == sizeof(GLuint));
1423e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         for (i = 0; i < height; i++) {
1424f39569f5509f9298cb5374b9758296d9149add9bBrian Paul            rb->PutMonoRow(ctx, rb, width, x, y + i, &clearValue, NULL);
1425e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
1426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
1427f39569f5509f9298cb5374b9758296d9149add9bBrian Paul      else {
1428f39569f5509f9298cb5374b9758296d9149add9bBrian Paul         _mesa_problem(ctx, "bad depth renderbuffer DataType");
1429f39569f5509f9298cb5374b9758296d9149add9bBrian Paul      }
1430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1431e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1432