s_depth.c revision fd104a84591ae854c5d6adc81e2dc31ef6ab9e8a
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"
2845e76d2665b38ba3787548310efc59e969124c01Brian Paul#include "main/formats.h"
29fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul#include "main/format_pack.h"
30bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h"
31bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h"
32e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
33e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.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
44f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdepth_test_span16( struct gl_context *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:
2626bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul         memset(mask, 0, 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
273f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdepth_test_span32( struct gl_context *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:
4916bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul         memset(mask, 0, 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
50073856817973caab283427c52152672f524c49a07Brian Paul
50173856817973caab283427c52152672f524c49a07Brian Paul
50273856817973caab283427c52152672f524c49a07Brian Paul/**
50373856817973caab283427c52152672f524c49a07Brian Paul * Clamp fragment Z values to the depth near/far range (glDepthRange()).
50473856817973caab283427c52152672f524c49a07Brian Paul * This is used when GL_ARB_depth_clamp/GL_DEPTH_CLAMP is turned on.
50573856817973caab283427c52152672f524c49a07Brian Paul * In that case, vertexes are not clipped against the near/far planes
50673856817973caab283427c52152672f524c49a07Brian Paul * so rasterization will produce fragment Z values outside the usual
50773856817973caab283427c52152672f524c49a07Brian Paul * [0,1] range.
50873856817973caab283427c52152672f524c49a07Brian Paul */
509b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholtvoid
510f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_depth_clamp_span( struct gl_context *ctx, SWspan *span )
511b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt{
512b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt   struct gl_framebuffer *fb = ctx->DrawBuffer;
513b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt   const GLuint count = span->end;
51473856817973caab283427c52152672f524c49a07Brian Paul   GLint *zValues = (GLint *) span->array->z; /* sign change */
51573856817973caab283427c52152672f524c49a07Brian Paul   GLint min, max;
51632ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt   GLfloat min_f, max_f;
51773856817973caab283427c52152672f524c49a07Brian Paul   GLuint i;
518b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt
51932ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt   if (ctx->Viewport.Near < ctx->Viewport.Far) {
52032ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt      min_f = ctx->Viewport.Near;
52132ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt      max_f = ctx->Viewport.Far;
52232ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt   } else {
52332ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt      min_f = ctx->Viewport.Far;
52432ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt      max_f = ctx->Viewport.Near;
52532ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt   }
52632ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt
52773856817973caab283427c52152672f524c49a07Brian Paul   /* Convert floating point values in [0,1] to device Z coordinates in
52873856817973caab283427c52152672f524c49a07Brian Paul    * [0, DepthMax].
529fab1f07d6ad01463897ae792f4b33738afb07369Jeff Smith    * ex: If the Z buffer has 24 bits, DepthMax = 0xffffff.
53073856817973caab283427c52152672f524c49a07Brian Paul    *
53173856817973caab283427c52152672f524c49a07Brian Paul    * XXX this all falls apart if we have 31 or more bits of Z because
53273856817973caab283427c52152672f524c49a07Brian Paul    * the triangle rasterization code produces unsigned Z values.  Negative
53373856817973caab283427c52152672f524c49a07Brian Paul    * vertex Z values come out as large fragment Z uints.
53473856817973caab283427c52152672f524c49a07Brian Paul    */
53573856817973caab283427c52152672f524c49a07Brian Paul   min = (GLint) (min_f * fb->_DepthMaxF);
53673856817973caab283427c52152672f524c49a07Brian Paul   max = (GLint) (max_f * fb->_DepthMaxF);
53773856817973caab283427c52152672f524c49a07Brian Paul   if (max < 0)
53873856817973caab283427c52152672f524c49a07Brian Paul      max = 0x7fffffff; /* catch over flow for 30-bit z */
53932ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt
54073856817973caab283427c52152672f524c49a07Brian Paul   /* Note that we do the comparisons here using signed integers.
54173856817973caab283427c52152672f524c49a07Brian Paul    */
542b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt   for (i = 0; i < count; i++) {
54332ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt      if (zValues[i] < min)
54432ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt	 zValues[i] = min;
54532ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt      if (zValues[i] > max)
54632ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt	 zValues[i] = max;
547b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt   }
548b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt}
549b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt
550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
551e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
55210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul/*
553e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Apply depth test to span of fragments.
55410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul */
555733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paulstatic GLuint
556f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdepth_test_span( struct gl_context *ctx, SWspan *span)
55710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul{
558e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_framebuffer *fb = ctx->DrawBuffer;
5591a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul   struct gl_renderbuffer *rb = fb->_DepthBuffer;
56079c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul   const GLint x = span->x;
56179c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul   const GLint y = span->y;
562e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLuint count = span->end;
563e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLuint *zValues = span->array->z;
564e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLubyte *mask = span->array->mask;
565e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLuint passed;
56610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
56779c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul   ASSERT((span->arrayMask & SPAN_XY) == 0);
568f1e236987829393c81dc86ea19cb49eefe190317Brian Paul   ASSERT(span->arrayMask & SPAN_Z);
56910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
570e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb->GetPointer(ctx, rb, 0, 0)) {
571e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Directly access buffer */
5722526152a107e4323161b95188e767620c4998639Brian Paul      if (rb->DataType == GL_UNSIGNED_SHORT) {
573e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLushort *zbuffer = (GLushort *) rb->GetPointer(ctx, rb, x, y);
574e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         passed = depth_test_span16(ctx, count, zbuffer, zValues, mask);
57510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul      }
57610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul      else {
577e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint *zbuffer = (GLuint *) rb->GetPointer(ctx, rb, x, y);
5782526152a107e4323161b95188e767620c4998639Brian Paul         ASSERT(rb->DataType == GL_UNSIGNED_INT);
579e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         passed = depth_test_span32(ctx, count, zbuffer, zValues, mask);
58010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul      }
581e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
582e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else {
583e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* read depth values from buffer, test, write back */
584e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (rb->DataType == GL_UNSIGNED_SHORT) {
585e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLushort zbuffer[MAX_WIDTH];
586e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->GetRow(ctx, rb, count, x, y, zbuffer);
5877cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         passed = depth_test_span16(ctx, count, zbuffer, zValues, mask);
5887cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         rb->PutRow(ctx, rb, count, x, y, zbuffer, mask);
58936c3df78f4592443de7c065b6d539f4c2914d870Brian Paul      }
590e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
591e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint zbuffer[MAX_WIDTH];
592e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         ASSERT(rb->DataType == GL_UNSIGNED_INT);
593e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         rb->GetRow(ctx, rb, count, x, y, zbuffer);
5947cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         passed = depth_test_span32(ctx, count, zbuffer, zValues, mask);
5957cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         rb->PutRow(ctx, rb, count, x, y, zbuffer, mask);
596b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul      }
59710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul   }
598e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
599e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (passed < count) {
600e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      span->writeAll = GL_FALSE;
601e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
602e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return passed;
60310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul}
60410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
605e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
606e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
607e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define Z_ADDRESS(X, Y)   (zStart + (Y) * stride + (X))
608e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
609e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
611e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Do depth testing for an array of fragments at assorted locations.
612e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
613e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void
614f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdirect_depth_test_pixels16(struct gl_context *ctx, GLushort *zStart, GLuint stride,
615e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                           GLuint n, const GLint x[], const GLint y[],
616e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                           const GLuint z[], GLubyte mask[] )
617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
618e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* switch cases ordered from most frequent to less frequent */
619e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   switch (ctx->Depth.Func) {
620e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LESS:
621e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
622e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
626e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < *zptr) {
628e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
630e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
631e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
632e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
633e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
634e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
635e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
636e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
637e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
638e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
639e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
640e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
641e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
642e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
643e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
644e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < *zptr) {
645e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
646e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
647e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
648e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
649e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
650e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
651e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
652e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
653e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
654e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
655e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LEQUAL:
656e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
657e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
658e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
659e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
661e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= *zptr) {
663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
665e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
666e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
668e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
669e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
670e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
671e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
673e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
674e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
677e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
678e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= *zptr) {
680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
681e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
682e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
683e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
684e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
685e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
686e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
687e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
688e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
689e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
690e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GEQUAL:
691e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
694e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
696e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
697e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= *zptr) {
698e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
699e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
700e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
701e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
702e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
703e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
704e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
705e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
706e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
707e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
708e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
709e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
710e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
711e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
713e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
714e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= *zptr) {
715e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
716e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
717e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
718e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
719e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
720e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
721e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
722e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
723e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
724e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
725e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GREATER:
726e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
728e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
729e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
730e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
731e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
732e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > *zptr) {
733e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
734e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
735e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
736e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
737e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
738e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
742e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
743e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
744e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
746e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
747e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
748e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > *zptr) {
750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
751e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
752e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
753e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
754e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
755e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
756e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
757e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
758e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
759e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
760e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NOTEQUAL:
761e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
762e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
763e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
764e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
765e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
766e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
767e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != *zptr) {
768e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
770e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
772e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
775e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
776e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
777e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
778e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
779e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
780e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
781e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
783e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != *zptr) {
785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
786e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
788e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
789e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
790e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
791e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
792e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
793e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
794e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
795e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_EQUAL:
796e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
797e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
798e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
799e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
800e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
801e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
802e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == *zptr) {
803e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
804e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
806e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
807e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
811e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
812e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
813e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
815e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
816e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
817e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
818e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == *zptr) {
820e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
821e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
822e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
823e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
824e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
825e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
826e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
827e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
828e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
829e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_ALWAYS:
831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
834e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
835e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
836e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLushort *zptr = Z_ADDRESS(x[i], y[i]);
837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  *zptr = z[i];
838e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
839e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
842e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer or mask */
843e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
844e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
845e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NEVER:
846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 /* depth test never passes */
8476bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul         memset(mask, 0, n * sizeof(GLubyte));
848e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
849e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      default:
850e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_problem(ctx, "Bad depth func in direct_depth_test_pixels");
851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
853e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
854e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
855e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
856e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
857e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Do depth testing for an array of fragments with direct access to zbuffer.
858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
859e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void
860f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdirect_depth_test_pixels32(struct gl_context *ctx, GLuint *zStart, GLuint stride,
861e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                           GLuint n, const GLint x[], const GLint y[],
862e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                           const GLuint z[], GLubyte mask[] )
863e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
864e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* switch cases ordered from most frequent to less frequent */
865e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   switch (ctx->Depth.Func) {
866e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LESS:
867e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
868e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
869e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
870e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
871e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
872e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
873e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < *zptr) {
874e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
875e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
876e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
877e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
878e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
879e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
880e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
881e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
882e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
885e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
886e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
887e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
888e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
889e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
890e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] < *zptr) {
891e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
892e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
893e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
894e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
895e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
896e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
897e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
898e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
899e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
900e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
901e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_LEQUAL:
902e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
903e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
904e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
905e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
906e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
907e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
908e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= *zptr) {
909e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
910e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
911e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
912e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
913e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
914e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
915e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
916e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
917e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
918e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
919e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
920e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
921e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
922e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
923e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
924e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
925e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] <= *zptr) {
926e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
927e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
928e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
929e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
930e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
931e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
932e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
933e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
934e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
935e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
936e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GEQUAL:
937e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
938e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
939e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
940e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
941e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
942e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
943e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= *zptr) {
944e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
945e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
946e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
947e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
948e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
949e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
950e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
951e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
952e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
953e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
954e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
955e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
956e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
957e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
958e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
959e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
960e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] >= *zptr) {
961e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
962e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
963e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
964e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
965e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
966e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
967e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
968e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
969e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
970e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
971e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_GREATER:
972e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
973e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
974e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
975e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
976e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
977e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
978e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > *zptr) {
979e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
980e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
981e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
982e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
983e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
984e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
985e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
986e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
987e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
988e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
989e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
990e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
991e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
992e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
993e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
994e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
995e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] > *zptr) {
996e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
997e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
998e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
999e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
1000e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
1001e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1002e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
1003e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
1004e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1005e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
1006e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NOTEQUAL:
1007e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
1008e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
1009e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
1010e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
1011e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
1012e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
1013e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != *zptr) {
1014e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
1015e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
1016e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1017e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
1018e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
1019e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
1020e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1021e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
1022e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
1023e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1024e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
1025e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
1026e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
1027e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
1028e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
1029e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
1030e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] != *zptr) {
1031e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
1032e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1033e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
1034e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
1035e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
1036e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1037e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
1038e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
1039e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1040e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
1041e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_EQUAL:
1042e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Depth.Mask) {
1043e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
1044e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
1045e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
1046e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
1047e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
1048e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == *zptr) {
1049e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
1050e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     *zptr = z[i];
1051e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1052e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
1053e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
1054e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
1055e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1056e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
1057e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
1058e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1059e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
1060e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer */
1061e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
1062e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
1063e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
1064e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
1065e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (z[i] == *zptr) {
1066e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* pass */
1067e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1068e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
1069e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     /* fail */
1070e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     mask[i] = 0;
1071e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
1072e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
1073e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
1074e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1075e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
1076e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_ALWAYS:
1077e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Depth.Mask) {
1078e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Update Z buffer */
1079e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLuint i;
1080e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0; i<n; i++) {
1081e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (mask[i]) {
1082e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul		  GLuint *zptr = Z_ADDRESS(x[i], y[i]);
1083e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  *zptr = z[i];
1084e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
1085e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
1086e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1087e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
1088e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* Don't update Z buffer or mask */
1089e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
1090e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
1091e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      case GL_NEVER:
1092e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 /* depth test never passes */
10936bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul         memset(mask, 0, n * sizeof(GLubyte));
1094e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 break;
1095e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      default:
1096e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         _mesa_problem(ctx, "Bad depth func in direct_depth_test_pixels");
1097e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1098e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1099e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
110279c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul
110379c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paulstatic GLuint
1104f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdepth_test_pixels( struct gl_context *ctx, SWspan *span )
1105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
1106e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_framebuffer *fb = ctx->DrawBuffer;
11071a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul   struct gl_renderbuffer *rb = fb->_DepthBuffer;
1108e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLuint count = span->end;
110977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   const GLint *x = span->array->x;
111077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   const GLint *y = span->array->y;
1111e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLuint *z = span->array->z;
111277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   GLubyte *mask = span->array->mask;
111379c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul
1114e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb->GetPointer(ctx, rb, 0, 0)) {
1115e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Directly access values */
1116e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (rb->DataType == GL_UNSIGNED_SHORT) {
1117e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLushort *zStart = (GLushort *) rb->Data;
1118e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint stride = rb->Width;
1119e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         direct_depth_test_pixels16(ctx, zStart, stride, count, x, y, z, mask);
1120e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1121e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
1122e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint *zStart = (GLuint *) rb->Data;
1123e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint stride = rb->Width;
11242526152a107e4323161b95188e767620c4998639Brian Paul         ASSERT(rb->DataType == GL_UNSIGNED_INT);
1125e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         direct_depth_test_pixels32(ctx, zStart, stride, count, x, y, z, mask);
1126e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
1129e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* read depth values from buffer, test, write back */
1130e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (rb->DataType == GL_UNSIGNED_SHORT) {
1131e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLushort zbuffer[MAX_WIDTH];
113267074332728acba86da7630353673b458713bb8aBrian Paul         _swrast_get_values(ctx, rb, count, x, y, zbuffer, sizeof(GLushort));
11337cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         depth_test_span16(ctx, count, zbuffer, z, mask);
11347cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         rb->PutValues(ctx, rb, count, x, y, zbuffer, mask);
1135e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1136e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
1137e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         GLuint zbuffer[MAX_WIDTH];
1138e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         ASSERT(rb->DataType == GL_UNSIGNED_INT);
113967074332728acba86da7630353673b458713bb8aBrian Paul         _swrast_get_values(ctx, rb, count, x, y, zbuffer, sizeof(GLuint));
11407cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         depth_test_span32(ctx, count, zbuffer, z, mask);
11417cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul         rb->PutValues(ctx, rb, count, x, y, zbuffer, mask);
1142e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1144e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1145e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return count; /* not really correct, but OK */
1146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
114979c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/**
115079c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul * Apply depth (Z) buffer testing to the span.
115179c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul * \return approx number of pixels that passed (only zero is reliable)
115279c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul */
1153733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian PaulGLuint
1154f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_depth_test_span( struct gl_context *ctx, SWspan *span)
1155733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul{
115679c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul   if (span->arrayMask & SPAN_XY)
115779c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul      return depth_test_pixels(ctx, span);
115879c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul   else
1159733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul      return depth_test_span(ctx, span);
1160733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul}
1161733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul
1162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1163e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul/**
1164e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * GL_EXT_depth_bounds_test extension.
1165e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * Discard fragments depending on whether the corresponding Z-buffer
1166e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * values are outside the depth bounds test range.
1167e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * Note: we test the Z buffer values, not the fragment Z values!
1168e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * \return GL_TRUE if any fragments pass, GL_FALSE if no fragments pass
1169e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul */
1170e5b244ff7f984805c1bcc020342f1300f2639c71Brian PaulGLboolean
1171f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_depth_bounds_test( struct gl_context *ctx, SWspan *span )
1172e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul{
1173e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct gl_framebuffer *fb = ctx->DrawBuffer;
11741a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul   struct gl_renderbuffer *rb = fb->_DepthBuffer;
1175e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLuint zMin = (GLuint) (ctx->Depth.BoundsMin * fb->_DepthMaxF + 0.5F);
1176e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLuint zMax = (GLuint) (ctx->Depth.BoundsMax * fb->_DepthMaxF + 0.5F);
1177e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   GLubyte *mask = span->array->mask;
1178e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   const GLuint count = span->end;
1179e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   GLuint i;
1180e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   GLboolean anyPass = GL_FALSE;
1181e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul
1182e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (rb->DataType == GL_UNSIGNED_SHORT) {
1183e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* get 16-bit values */
1184e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      GLushort zbuffer16[MAX_WIDTH], *zbuffer;
1185e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (span->arrayMask & SPAN_XY) {
118667074332728acba86da7630353673b458713bb8aBrian Paul         _swrast_get_values(ctx, rb, count, span->array->x, span->array->y,
118767074332728acba86da7630353673b458713bb8aBrian Paul                            zbuffer16, sizeof(GLushort));
1188e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         zbuffer = zbuffer16;
1189e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1190e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
11919580179dfb42d5b81ff6ec9704b82a556c7f1229Brian Paul         zbuffer = (GLushort*) rb->GetPointer(ctx, rb, span->x, span->y);
1192e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         if (!zbuffer) {
1193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            rb->GetRow(ctx, rb, count, span->x, span->y, zbuffer16);
1194e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            zbuffer = zbuffer16;
1195e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         }
1196e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1197e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      assert(zbuffer);
1198e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1199e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Now do the tests */
1200e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      for (i = 0; i < count; i++) {
1201e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul         if (mask[i]) {
1202e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul            if (zbuffer[i] < zMin || zbuffer[i] > zMax)
1203e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul               mask[i] = GL_FALSE;
1204e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul            else
1205e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul               anyPass = GL_TRUE;
1206e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul         }
1207e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul      }
1208e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   }
1209e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   else {
1210e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* get 32-bit values */
1211e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      GLuint zbuffer32[MAX_WIDTH], *zbuffer;
12122526152a107e4323161b95188e767620c4998639Brian Paul      ASSERT(rb->DataType == GL_UNSIGNED_INT);
1213e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul      if (span->arrayMask & SPAN_XY) {
121467074332728acba86da7630353673b458713bb8aBrian Paul         _swrast_get_values(ctx, rb, count, span->array->x, span->array->y,
121567074332728acba86da7630353673b458713bb8aBrian Paul                            zbuffer32, sizeof(GLuint));
1216e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         zbuffer = zbuffer32;
1217e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul      }
1218e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul      else {
12199580179dfb42d5b81ff6ec9704b82a556c7f1229Brian Paul         zbuffer = (GLuint*) rb->GetPointer(ctx, rb, span->x, span->y);
1220e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         if (!zbuffer) {
1221e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            rb->GetRow(ctx, rb, count, span->x, span->y, zbuffer32);
1222e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            zbuffer = zbuffer32;
1223e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul         }
1224e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1225e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      assert(zbuffer);
1226e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1227e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Now do the tests */
1228e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      for (i = 0; i < count; i++) {
1229e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         if (mask[i]) {
1230e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            if (zbuffer[i] < zMin || zbuffer[i] > zMax)
1231e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul               mask[i] = GL_FALSE;
1232e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            else
1233e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul               anyPass = GL_TRUE;
1234e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul         }
1235e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul      }
1236e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   }
1237e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1238e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul   return anyPass;
1239e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul}
1240e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul
1241e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul
1242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/**********************************************************************/
1244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*****                      Read Depth Buffer                     *****/
1245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/**********************************************************************/
1246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
124879c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/**
124982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * Read a span of depth values from the given depth renderbuffer, returning
125082e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * the values as GLfloats.
125182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * This function does clipping to prevent reading outside the depth buffer's
125277c85f014aa1db44f60b1b3291af8132ab65f444Brian Paul * bounds.
1253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
1254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
1255f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_read_depth_span_float( struct gl_context *ctx, struct gl_renderbuffer *rb,
125682e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul                               GLint n, GLint x, GLint y, GLfloat depth[] )
1257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
125882e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   const GLfloat scale = 1.0F / ctx->DrawBuffer->_DepthMaxF;
125982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul
126082e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   if (!rb) {
126182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      /* really only doing this to prevent FP exceptions later */
12626bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul      memset(depth, 0, n * sizeof(GLfloat));
126314f21c785087f86d291243400e59ebfc8721c4f6Brian Paul      return;
126482e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   }
126582e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul
126682e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   ASSERT(rb->_BaseFormat == GL_DEPTH_COMPONENT);
126782e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul
1268e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (y < 0 || y >= (GLint) rb->Height ||
126982b29819a9ede846ad5c37ff70b71d45cf72357aBrian Paul       x + n <= 0 || x >= (GLint) rb->Width) {
1270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* span is completely outside framebuffer */
12716bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul      memset(depth, 0, n * sizeof(GLfloat));
1272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return;
1273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (x < 0) {
1276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint dx = -x;
1277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint i;
1278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      for (i = 0; i < dx; i++)
127982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul         depth[i] = 0.0;
1280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      x = 0;
1281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      n -= dx;
1282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      depth += dx;
1283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1284e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (x + n > (GLint) rb->Width) {
1285e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      GLint dx = x + n - (GLint) rb->Width;
1286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint i;
1287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      for (i = 0; i < dx; i++)
128882e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul         depth[n - i - 1] = 0.0;
1289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      n -= dx;
1290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (n <= 0) {
1292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return;
1293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
129582e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   if (rb->DataType == GL_UNSIGNED_INT) {
129682e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      GLuint temp[MAX_WIDTH];
129782e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      GLint i;
129882e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      rb->GetRow(ctx, rb, n, x, y, temp);
129982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      for (i = 0; i < n; i++) {
130082e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul         depth[i] = temp[i] * scale;
130182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      }
1302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
130382e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   else if (rb->DataType == GL_UNSIGNED_SHORT) {
1304e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      GLushort temp[MAX_WIDTH];
130582e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul      GLint i;
1306e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      rb->GetRow(ctx, rb, n, x, y, temp);
1307e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      for (i = 0; i < n; i++) {
13088bdc1ae358986aec81d4e6e3930a85f11680b73bBrian Paul         depth[i] = temp[i] * scale;
1309e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
1310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
131182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul   else {
13124fd11949f03039a95dbdbfdae7865615d5a727d6Brian Paul      _mesa_problem(ctx, "Invalid depth renderbuffer data type");
1313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1316fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1317a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul/**
1318fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul * Clear the given z/depth renderbuffer.  If the buffer is a combined
1319fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul * depth+stencil buffer, only the Z bits will be touched.
1320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
1321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
1322fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul_swrast_clear_depth_buffer(struct gl_context *ctx)
1323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
1324fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   struct gl_renderbuffer *rb =
1325fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer;
1326f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   GLuint clearValue;
1327e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   GLint x, y, width, height;
1328fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   GLubyte *map;
1329fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   GLint rowStride, i, j;
1330fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   GLbitfield mapMode;
1331328a039413fd2b8649511f1ca130df2a59f2c71cBrian Paul
1332b5e9b0e56231065f6324bbd3c2c35ca53b46ddf8Brian   if (!rb || !ctx->Depth.Mask) {
1333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* no depth buffer, or writing to it is disabled */
1334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return;
1335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1337f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   /* compute integer clearing value */
1338f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   if (ctx->Depth.Clear == 1.0) {
1339f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul      clearValue = ctx->DrawBuffer->_DepthMax;
1340f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   }
1341f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   else {
1342f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul      clearValue = (GLuint) (ctx->Depth.Clear * ctx->DrawBuffer->_DepthMaxF);
1343f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul   }
1344f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul
1345e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   /* compute region to clear */
1346e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   x = ctx->DrawBuffer->_Xmin;
1347e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   y = ctx->DrawBuffer->_Ymin;
1348e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   width  = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin;
1349e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin;
1350e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
1351fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   mapMode = GL_MAP_WRITE_BIT;
1352fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   if (rb->Format == MESA_FORMAT_S8_Z24 ||
1353fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul       rb->Format == MESA_FORMAT_X8_Z24 ||
1354fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul       rb->Format == MESA_FORMAT_Z24_S8 ||
1355fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul       rb->Format == MESA_FORMAT_Z24_X8) {
1356fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      mapMode |= GL_MAP_READ_BIT;
1357fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   }
1358fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1359fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height,
1360fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                               mapMode, &map, &rowStride);
1361fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   if (!map) {
1362fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glClear(depth)");
1363fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      return;
1364fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   }
1365fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1366fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   switch (rb->Format) {
1367fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_Z16:
1368fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      {
1369fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         GLfloat clear = (GLfloat) ctx->Depth.Clear;
1370fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         GLushort clearVal = 0;
1371fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         _mesa_pack_float_z_row(rb->Format, 1, &clear, &clearVal);
1372fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         if (clearVal == 0xffff && width * 2 == rowStride) {
1373fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            /* common case */
1374fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            memset(map, 0xff, width * height * 2);
1375e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         }
1376e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         else {
1377e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            for (i = 0; i < height; i++) {
1378fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               GLushort *row = (GLushort *) map;
1379e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul               for (j = 0; j < width; j++) {
1380fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                  row[j] = clearVal;
1381e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul               }
1382fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               map += rowStride;
1383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
1384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
1385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
1386fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      break;
1387fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_Z32:
1388fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_Z32_FLOAT:
1389fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      {
1390fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         GLfloat clear = (GLfloat) ctx->Depth.Clear;
1391fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         GLuint clearVal = 0;
1392fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         _mesa_pack_float_z_row(rb->Format, 1, &clear, &clearVal);
1393e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         for (i = 0; i < height; i++) {
1394fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            GLuint *row = (GLuint *) map;
1395e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul            for (j = 0; j < width; j++) {
1396fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               row[j] = clearVal;
1397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
1398fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            map += rowStride;
1399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
1400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
1401fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      break;
1402fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_S8_Z24:
1403fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_X8_Z24:
1404fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_Z24_S8:
1405fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_Z24_X8:
1406fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      {
1407fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         GLfloat clear = (GLfloat) ctx->Depth.Clear;
1408fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         GLuint clearVal = 0;
1409fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         GLuint mask;
1410fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1411fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         if (rb->Format == MESA_FORMAT_S8_Z24 ||
1412fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul             rb->Format == MESA_FORMAT_X8_Z24)
1413fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            mask = 0xff000000;
1414fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         else
1415fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            mask = 0xff;
1416fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1417fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         _mesa_pack_float_z_row(rb->Format, 1, &clear, &clearVal);
1418e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         for (i = 0; i < height; i++) {
1419fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            GLuint *row = (GLuint *) map;
1420fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            for (j = 0; j < width; j++) {
1421fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               row[j] = (row[j] & mask) | clearVal;
1422fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            }
1423fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            map += rowStride;
1424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
1425fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
1427fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      break;
1428fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
1429fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      /* XXX untested */
1430fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      {
1431fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         GLfloat clearVal = (GLfloat) ctx->Depth.Clear;
1432e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         for (i = 0; i < height; i++) {
1433fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            GLfloat *row = (GLfloat *) map;
1434fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            for (j = 0; j < width; j++) {
1435fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               row[j * 2] = clearVal;
1436fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            }
1437fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            map += rowStride;
1438e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
1439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
1440fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      break;
1441fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   default:
1442fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      _mesa_problem(ctx, "Unexpected depth buffer format %s"
1443fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                    " in _swrast_clear_depth_buffer()",
1444fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                    _mesa_get_format_name(rb->Format));
1445fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   }
1446fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1447fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   ctx->Driver.UnmapRenderbuffer(ctx, rb);
1448fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul}
1449fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1450fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1451fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1452fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1453fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul/**
1454fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul * Clear both depth and stencil values in a combined depth+stencil buffer.
1455fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul */
1456fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paulvoid
1457fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul_swrast_clear_depth_stencil_buffer(struct gl_context *ctx)
1458fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul{
1459fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   const GLubyte stencilBits = ctx->DrawBuffer->Visual.stencilBits;
1460fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   const GLuint writeMask = ctx->Stencil.WriteMask[0];
1461fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   const GLuint stencilMax = (1 << stencilBits) - 1;
1462fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   struct gl_renderbuffer *rb =
1463fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer;
1464fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   GLint x, y, width, height;
1465fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   GLbitfield mapMode;
1466fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   GLubyte *map;
1467fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   GLint rowStride, i, j;
1468fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1469fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   /* check that we really have a combined depth+stencil buffer */
1470fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   assert(rb == ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer);
1471fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1472fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   /* compute region to clear */
1473fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   x = ctx->DrawBuffer->_Xmin;
1474fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   y = ctx->DrawBuffer->_Ymin;
1475fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   width  = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin;
1476fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin;
1477fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1478fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   mapMode = GL_MAP_WRITE_BIT;
1479fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   if ((writeMask & stencilMax) != stencilMax) {
1480fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      /* need to mask stencil values */
1481fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      mapMode |= GL_MAP_READ_BIT;
1482fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   }
1483fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1484fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height,
1485fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                               mapMode, &map, &rowStride);
1486fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   if (!map) {
1487fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glClear(depth+stencil)");
1488fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      return;
1489fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   }
1490fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1491fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   switch (rb->Format) {
1492fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_S8_Z24:
1493fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_Z24_S8:
1494fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      {
1495fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         GLfloat zClear = (GLfloat) ctx->Depth.Clear;
1496fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         GLuint clear = 0, mask;
1497fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1498fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         _mesa_pack_float_z_row(rb->Format, 1, &zClear, &clear);
1499fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1500fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         if (rb->Format == MESA_FORMAT_S8_Z24) {
1501fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            mask = ((~writeMask) & 0xff) << 24;
1502fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            clear |= (ctx->Stencil.Clear & writeMask & 0xff) << 24;
1503fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         }
1504fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         else {
1505fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            mask = ((~writeMask) & 0xff);
1506fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            clear |= (ctx->Stencil.Clear & writeMask & 0xff);
1507fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         }
1508fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1509fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         for (i = 0; i < height; i++) {
1510fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            GLuint *row = (GLuint *) map;
1511fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            if (mask != 0x0) {
1512fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               for (j = 0; j < width; j++) {
1513fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                  row[j] = (row[j] & mask) | clear;
1514fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               }
1515fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            }
1516fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            else {
1517fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               for (j = 0; j < width; j++) {
1518fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                  row[j] = clear;
1519fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               }
1520fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            }
1521fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            map += rowStride;
1522fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         }
1523fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      }
1524fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      break;
1525fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   case MESA_FORMAT_Z32_FLOAT_X24S8:
1526fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      /* XXX untested */
1527fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      {
1528fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         const GLfloat zClear = (GLfloat) ctx->Depth.Clear;
1529fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         const GLuint sClear = ctx->Stencil.Clear & writeMask;
1530fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         const GLuint sMask = (~writeMask) & 0xff;
1531fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         for (i = 0; i < height; i++) {
1532fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            GLfloat *zRow = (GLfloat *) map;
1533fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            GLuint *sRow = (GLuint *) map;
1534fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            for (j = 0; j < width; j++) {
1535fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               zRow[j * 2 + 0] = zClear;
1536fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            }
1537fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            if (sMask != 0) {
1538fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               for (j = 0; j < width; j++) {
1539fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                  sRow[j * 2 + 1] = (sRow[j * 2 + 1] & sMask) | sClear;
1540fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               }
1541fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            }
1542fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            else {
1543fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               for (j = 0; j < width; j++) {
1544fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                  sRow[j * 2 + 1] = sClear;
1545fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul               }
1546fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            }
1547fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul            map += rowStride;
1548fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul         }
1549f39569f5509f9298cb5374b9758296d9149add9bBrian Paul      }
1550fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      break;
1551fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   default:
1552fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul      _mesa_problem(ctx, "Unexpected depth buffer format %s"
1553fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                    " in _swrast_clear_depth_buffer()",
1554fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul                    _mesa_get_format_name(rb->Format));
1555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1556fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1557fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul   ctx->Driver.UnmapRenderbuffer(ctx, rb);
1558fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul
1559e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1560