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