s_depth.c revision fd104a84591ae854c5d6adc81e2dc31ef6ab9e8a
1e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library 37cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul * Version: 7.2.1 422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 57cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 7e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 8e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * copy of this software and associated documentation files (the "Software"), 9e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to deal in the Software without restriction, including without limitation 10e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 12e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Software is furnished to do so, subject to the following conditions: 1322144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 14e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included 15e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software. 1622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes * 17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 24e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 25e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 26bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h" 27bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/context.h" 2845e76d2665b38ba3787548310efc59e969124c01Brian Paul#include "main/formats.h" 29fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul#include "main/format_pack.h" 30bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h" 31bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h" 32e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 33e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.h" 3467074332728acba86da7630353673b458713bb8aBrian Paul#include "s_span.h" 35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 3779c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 38e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Do depth test for a horizontal span of fragments. 39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Input: zbuffer - array of z values in the zbuffer 40e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * z - array of fragment z values 41e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Return: number of fragments which pass the test. 42e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 43e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic GLuint 44f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdepth_test_span16( struct gl_context *ctx, GLuint n, 45e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort zbuffer[], const GLuint z[], GLubyte mask[] ) 46e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 47e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint passed = 0; 48e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 49e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* switch cases ordered from most frequent to less frequent */ 50e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (ctx->Depth.Func) { 51e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LESS: 52e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 53e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 54e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 55e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 56e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 57e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] < zbuffer[i]) { 58e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 59e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 63e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 65e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 66e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 67e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 68e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 69e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 70e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 72e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 73e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 74e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] < zbuffer[i]) { 75e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 76e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 77e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 78e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 79e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 80e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 81e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 82e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 83e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 84e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 85e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LEQUAL: 86e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 87e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 88e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 89e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 90e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 91e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] <= zbuffer[i]) { 92e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 93e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 94e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 95e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 96e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 97e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 98e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 99e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 103e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 104e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] <= zbuffer[i]) { 107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_GEQUAL: 118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] >= zbuffer[i]) { 124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 137e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] >= zbuffer[i]) { 139e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 140e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 144e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 145e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_GREATER: 150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] > zbuffer[i]) { 156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 169e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 170e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] > zbuffer[i]) { 171e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 172e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 173e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 176e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 177e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_NOTEQUAL: 182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 183e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 184e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] != zbuffer[i]) { 188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] != zbuffer[i]) { 203e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_EQUAL: 214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] == zbuffer[i]) { 220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] == zbuffer[i]) { 235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ALWAYS: 246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer or mask */ 258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed = n; 259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_NEVER: 2626bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul memset(mask, 0, n * sizeof(GLubyte)); 263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: 26508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad depth func in depth_test_span16"); 266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return passed; 269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic GLuint 273f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdepth_test_span32( struct gl_context *ctx, GLuint n, 274e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint zbuffer[], const GLuint z[], GLubyte mask[] ) 275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint passed = 0; 277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* switch cases ordered from most frequent to less frequent */ 279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (ctx->Depth.Func) { 280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LESS: 281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] < zbuffer[i]) { 287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] < zbuffer[i]) { 304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LEQUAL: 315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] <= zbuffer[i]) { 321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 324e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 326e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] <= zbuffer[i]) { 336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 345e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 346e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_GEQUAL: 347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 352e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] >= zbuffer[i]) { 353e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 354e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 355e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 356e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 357e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 360e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 362e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 365e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 366e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 367e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] >= zbuffer[i]) { 368e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 369e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 370e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 375e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 376e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 377e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 378e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_GREATER: 379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] > zbuffer[i]) { 385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 388e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 389e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 390e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] > zbuffer[i]) { 400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 401e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 402e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_NOTEQUAL: 411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 412e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 416e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] != zbuffer[i]) { 417e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 422e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 425e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 429e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 431e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] != zbuffer[i]) { 432e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 434e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 435e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 437e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 438e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 440e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 441e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 442e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_EQUAL: 443e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 444e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 445e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 446e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 447e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 448e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] == zbuffer[i]) { 449e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 450e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 452e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 453e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 454e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 455e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 456e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 457e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 458e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 459e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 460e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 461e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 462e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 463e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] == zbuffer[i]) { 464e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 465e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 466e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 467e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 468e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 469e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 470e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 471e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 472e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 473e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 474e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ALWAYS: 475e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 476e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 477e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 478e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0;i<n;i++) { 479e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 480e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell zbuffer[i] = z[i]; 481e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed++; 482e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 483e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 484e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 485e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 486e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer or mask */ 487e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell passed = n; 488e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 489e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 490e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_NEVER: 4916bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul memset(mask, 0, n * sizeof(GLubyte)); 492e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 493e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: 49408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(ctx, "Bad depth func in depth_test_span32"); 495e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 496e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 497e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return passed; 498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 50073856817973caab283427c52152672f524c49a07Brian Paul 50173856817973caab283427c52152672f524c49a07Brian Paul 50273856817973caab283427c52152672f524c49a07Brian Paul/** 50373856817973caab283427c52152672f524c49a07Brian Paul * Clamp fragment Z values to the depth near/far range (glDepthRange()). 50473856817973caab283427c52152672f524c49a07Brian Paul * This is used when GL_ARB_depth_clamp/GL_DEPTH_CLAMP is turned on. 50573856817973caab283427c52152672f524c49a07Brian Paul * In that case, vertexes are not clipped against the near/far planes 50673856817973caab283427c52152672f524c49a07Brian Paul * so rasterization will produce fragment Z values outside the usual 50773856817973caab283427c52152672f524c49a07Brian Paul * [0,1] range. 50873856817973caab283427c52152672f524c49a07Brian Paul */ 509b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholtvoid 510f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_depth_clamp_span( struct gl_context *ctx, SWspan *span ) 511b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt{ 512b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt struct gl_framebuffer *fb = ctx->DrawBuffer; 513b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt const GLuint count = span->end; 51473856817973caab283427c52152672f524c49a07Brian Paul GLint *zValues = (GLint *) span->array->z; /* sign change */ 51573856817973caab283427c52152672f524c49a07Brian Paul GLint min, max; 51632ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt GLfloat min_f, max_f; 51773856817973caab283427c52152672f524c49a07Brian Paul GLuint i; 518b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt 51932ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt if (ctx->Viewport.Near < ctx->Viewport.Far) { 52032ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt min_f = ctx->Viewport.Near; 52132ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt max_f = ctx->Viewport.Far; 52232ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt } else { 52332ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt min_f = ctx->Viewport.Far; 52432ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt max_f = ctx->Viewport.Near; 52532ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt } 52632ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt 52773856817973caab283427c52152672f524c49a07Brian Paul /* Convert floating point values in [0,1] to device Z coordinates in 52873856817973caab283427c52152672f524c49a07Brian Paul * [0, DepthMax]. 529fab1f07d6ad01463897ae792f4b33738afb07369Jeff Smith * ex: If the Z buffer has 24 bits, DepthMax = 0xffffff. 53073856817973caab283427c52152672f524c49a07Brian Paul * 53173856817973caab283427c52152672f524c49a07Brian Paul * XXX this all falls apart if we have 31 or more bits of Z because 53273856817973caab283427c52152672f524c49a07Brian Paul * the triangle rasterization code produces unsigned Z values. Negative 53373856817973caab283427c52152672f524c49a07Brian Paul * vertex Z values come out as large fragment Z uints. 53473856817973caab283427c52152672f524c49a07Brian Paul */ 53573856817973caab283427c52152672f524c49a07Brian Paul min = (GLint) (min_f * fb->_DepthMaxF); 53673856817973caab283427c52152672f524c49a07Brian Paul max = (GLint) (max_f * fb->_DepthMaxF); 53773856817973caab283427c52152672f524c49a07Brian Paul if (max < 0) 53873856817973caab283427c52152672f524c49a07Brian Paul max = 0x7fffffff; /* catch over flow for 30-bit z */ 53932ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt 54073856817973caab283427c52152672f524c49a07Brian Paul /* Note that we do the comparisons here using signed integers. 54173856817973caab283427c52152672f524c49a07Brian Paul */ 542b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt for (i = 0; i < count; i++) { 54332ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt if (zValues[i] < min) 54432ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt zValues[i] = min; 54532ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt if (zValues[i] > max) 54632ec3f26731ac998b6fda7ce596ec568d6f76eebEric Anholt zValues[i] = max; 547b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt } 548b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt} 549b4922b533155cc139ebafb111502bb55d2ad2ccfEric Anholt 550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 551e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 55210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul/* 553e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Apply depth test to span of fragments. 55410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul */ 555733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paulstatic GLuint 556f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdepth_test_span( struct gl_context *ctx, SWspan *span) 55710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul{ 558e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul struct gl_framebuffer *fb = ctx->DrawBuffer; 5591a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul struct gl_renderbuffer *rb = fb->_DepthBuffer; 56079c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul const GLint x = span->x; 56179c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul const GLint y = span->y; 562e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul const GLuint count = span->end; 563e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul const GLuint *zValues = span->array->z; 564e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLubyte *mask = span->array->mask; 565e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint passed; 56610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 56779c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul ASSERT((span->arrayMask & SPAN_XY) == 0); 568f1e236987829393c81dc86ea19cb49eefe190317Brian Paul ASSERT(span->arrayMask & SPAN_Z); 56910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 570e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (rb->GetPointer(ctx, rb, 0, 0)) { 571e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* Directly access buffer */ 5722526152a107e4323161b95188e767620c4998639Brian Paul if (rb->DataType == GL_UNSIGNED_SHORT) { 573e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zbuffer = (GLushort *) rb->GetPointer(ctx, rb, x, y); 574e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul passed = depth_test_span16(ctx, count, zbuffer, zValues, mask); 57510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 57610f30eb43835c57c00783390a02d72daf4f78e26Brian Paul else { 577e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zbuffer = (GLuint *) rb->GetPointer(ctx, rb, x, y); 5782526152a107e4323161b95188e767620c4998639Brian Paul ASSERT(rb->DataType == GL_UNSIGNED_INT); 579e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul passed = depth_test_span32(ctx, count, zbuffer, zValues, mask); 58010f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 581e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 582e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else { 583e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* read depth values from buffer, test, write back */ 584e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (rb->DataType == GL_UNSIGNED_SHORT) { 585e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort zbuffer[MAX_WIDTH]; 586e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetRow(ctx, rb, count, x, y, zbuffer); 5877cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul passed = depth_test_span16(ctx, count, zbuffer, zValues, mask); 5887cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul rb->PutRow(ctx, rb, count, x, y, zbuffer, mask); 58936c3df78f4592443de7c065b6d539f4c2914d870Brian Paul } 590e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else { 591e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint zbuffer[MAX_WIDTH]; 592e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul ASSERT(rb->DataType == GL_UNSIGNED_INT); 593e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetRow(ctx, rb, count, x, y, zbuffer); 5947cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul passed = depth_test_span32(ctx, count, zbuffer, zValues, mask); 5957cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul rb->PutRow(ctx, rb, count, x, y, zbuffer, mask); 596b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul } 59710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul } 598e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 599e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (passed < count) { 600e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul span->writeAll = GL_FALSE; 601e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 602e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul return passed; 60310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul} 60410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul 605e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 606e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 607e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#define Z_ADDRESS(X, Y) (zStart + (Y) * stride + (X)) 608e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 609e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 611e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Do depth testing for an array of fragments at assorted locations. 612e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 613e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void 614f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdirect_depth_test_pixels16(struct gl_context *ctx, GLushort *zStart, GLuint stride, 615e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint n, const GLint x[], const GLint y[], 616e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul const GLuint z[], GLubyte mask[] ) 617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 618e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* switch cases ordered from most frequent to less frequent */ 619e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (ctx->Depth.Func) { 620e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LESS: 621e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 622e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 626e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] < *zptr) { 628e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 630e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 631e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 632e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 633e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 634e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 635e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 636e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 637e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 638e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 639e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 640e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 641e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 642e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 643e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 644e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] < *zptr) { 645e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 646e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 647e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 648e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 649e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 650e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 651e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 652e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 653e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 654e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 655e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LEQUAL: 656e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 657e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 658e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 659e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 661e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] <= *zptr) { 663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 665e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 666e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 668e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 669e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 670e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 671e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 673e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 674e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 677e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 678e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] <= *zptr) { 680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 681e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 682e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 683e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 684e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 685e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 686e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 687e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 688e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 689e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 690e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_GEQUAL: 691e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 694e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 696e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 697e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] >= *zptr) { 698e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 699e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 700e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 701e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 702e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 703e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 704e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 705e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 706e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 707e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 708e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 709e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 710e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 711e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 713e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 714e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] >= *zptr) { 715e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 716e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 717e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 718e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 719e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 720e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 721e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 722e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 723e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 724e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 725e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_GREATER: 726e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 728e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 729e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 730e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 731e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 732e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] > *zptr) { 733e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 734e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 735e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 736e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 737e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 738e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 742e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 743e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 744e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 746e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 747e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 748e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] > *zptr) { 750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 751e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 752e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 753e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 754e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 755e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 756e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 757e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 758e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 759e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 760e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_NOTEQUAL: 761e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 762e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 763e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 764e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 765e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 766e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 767e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] != *zptr) { 768e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 770e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 772e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 775e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 776e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 777e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 778e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 779e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 780e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 781e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 783e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] != *zptr) { 785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 786e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 788e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 789e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 790e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 791e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 792e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 793e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 794e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 795e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_EQUAL: 796e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 797e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 798e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 799e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 800e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 801e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 802e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] == *zptr) { 803e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 804e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 806e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 807e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 811e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 812e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 813e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 815e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 816e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 817e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 818e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] == *zptr) { 820e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 821e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 822e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 823e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 824e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 825e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 826e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 827e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 828e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 829e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ALWAYS: 831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 834e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 835e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 836e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zptr = Z_ADDRESS(x[i], y[i]); 837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 838e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 839e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 842e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer or mask */ 843e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 844e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 845e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_NEVER: 846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* depth test never passes */ 8476bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul memset(mask, 0, n * sizeof(GLubyte)); 848e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 849e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: 850e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul _mesa_problem(ctx, "Bad depth func in direct_depth_test_pixels"); 851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 853e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 854e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 855e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 856e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* 857e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Do depth testing for an array of fragments with direct access to zbuffer. 858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 859e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void 860f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdirect_depth_test_pixels32(struct gl_context *ctx, GLuint *zStart, GLuint stride, 861e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint n, const GLint x[], const GLint y[], 862e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul const GLuint z[], GLubyte mask[] ) 863e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 864e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* switch cases ordered from most frequent to less frequent */ 865e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell switch (ctx->Depth.Func) { 866e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LESS: 867e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 868e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 869e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 870e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 871e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 872e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 873e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] < *zptr) { 874e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 875e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 876e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 877e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 878e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 879e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 880e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 881e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 882e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 885e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 886e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 887e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 888e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 889e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 890e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] < *zptr) { 891e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 892e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 893e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 894e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 895e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 896e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 897e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 898e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 899e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 900e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 901e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_LEQUAL: 902e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 903e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 904e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 905e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 906e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 907e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 908e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] <= *zptr) { 909e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 910e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 911e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 912e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 913e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 914e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 915e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 916e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 917e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 918e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 919e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 920e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 921e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 922e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 923e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 924e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 925e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] <= *zptr) { 926e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 927e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 928e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 929e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 930e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 931e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 932e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 933e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 934e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 935e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 936e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_GEQUAL: 937e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 938e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 939e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 940e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 941e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 942e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 943e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] >= *zptr) { 944e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 945e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 946e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 947e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 948e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 949e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 950e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 951e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 952e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 953e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 954e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 955e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 956e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 957e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 958e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 959e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 960e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] >= *zptr) { 961e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 962e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 963e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 964e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 965e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 966e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 967e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 968e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 969e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 970e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 971e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_GREATER: 972e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 973e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 974e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 975e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 976e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 977e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 978e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] > *zptr) { 979e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 980e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 981e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 982e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 983e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 984e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 985e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 986e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 987e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 988e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 989e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 990e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 991e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 992e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 993e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 994e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 995e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] > *zptr) { 996e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 997e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 998e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 999e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 1000e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 1001e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1002e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1003e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1004e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1005e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 1006e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_NOTEQUAL: 1007e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 1008e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 1009e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 1010e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 1011e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 1012e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 1013e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] != *zptr) { 1014e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 1015e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 1016e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1017e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1018e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 1019e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 1020e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1021e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1022e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1023e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1024e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1025e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 1026e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 1027e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 1028e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 1029e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 1030e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] != *zptr) { 1031e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 1032e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1033e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1034e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 1035e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 1036e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1037e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1038e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1039e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1040e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 1041e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_EQUAL: 1042e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 1043e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 1044e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 1045e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 1046e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 1047e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 1048e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] == *zptr) { 1049e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 1050e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 1051e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1052e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1053e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 1054e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 1055e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1056e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1057e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1058e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1059e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1060e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer */ 1061e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 1062e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 1063e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 1064e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 1065e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (z[i] == *zptr) { 1066e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* pass */ 1067e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1068e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1069e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* fail */ 1070e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell mask[i] = 0; 1071e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1072e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1073e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1074e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1075e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 1076e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_ALWAYS: 1077e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (ctx->Depth.Mask) { 1078e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Update Z buffer */ 1079e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLuint i; 1080e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i=0; i<n; i++) { 1081e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (mask[i]) { 1082e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zptr = Z_ADDRESS(x[i], y[i]); 1083e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *zptr = z[i]; 1084e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1085e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1086e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1087e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1088e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* Don't update Z buffer or mask */ 1089e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1090e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 1091e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell case GL_NEVER: 1092e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* depth test never passes */ 10936bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul memset(mask, 0, n * sizeof(GLubyte)); 1094e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell break; 1095e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell default: 1096e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul _mesa_problem(ctx, "Bad depth func in direct_depth_test_pixels"); 1097e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1098e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1099e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 110279c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul 110379c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paulstatic GLuint 1104f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergdepth_test_pixels( struct gl_context *ctx, SWspan *span ) 1105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1106e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul struct gl_framebuffer *fb = ctx->DrawBuffer; 11071a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul struct gl_renderbuffer *rb = fb->_DepthBuffer; 1108e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul const GLuint count = span->end; 110977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul const GLint *x = span->array->x; 111077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul const GLint *y = span->array->y; 1111e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul const GLuint *z = span->array->z; 111277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul GLubyte *mask = span->array->mask; 111379c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul 1114e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (rb->GetPointer(ctx, rb, 0, 0)) { 1115e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* Directly access values */ 1116e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (rb->DataType == GL_UNSIGNED_SHORT) { 1117e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort *zStart = (GLushort *) rb->Data; 1118e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint stride = rb->Width; 1119e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul direct_depth_test_pixels16(ctx, zStart, stride, count, x, y, z, mask); 1120e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1121e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else { 1122e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint *zStart = (GLuint *) rb->Data; 1123e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint stride = rb->Width; 11242526152a107e4323161b95188e767620c4998639Brian Paul ASSERT(rb->DataType == GL_UNSIGNED_INT); 1125e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul direct_depth_test_pixels32(ctx, zStart, stride, count, x, y, z, mask); 1126e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell else { 1129e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* read depth values from buffer, test, write back */ 1130e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (rb->DataType == GL_UNSIGNED_SHORT) { 1131e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort zbuffer[MAX_WIDTH]; 113267074332728acba86da7630353673b458713bb8aBrian Paul _swrast_get_values(ctx, rb, count, x, y, zbuffer, sizeof(GLushort)); 11337cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul depth_test_span16(ctx, count, zbuffer, z, mask); 11347cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul rb->PutValues(ctx, rb, count, x, y, zbuffer, mask); 1135e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1136e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else { 1137e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint zbuffer[MAX_WIDTH]; 1138e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul ASSERT(rb->DataType == GL_UNSIGNED_INT); 113967074332728acba86da7630353673b458713bb8aBrian Paul _swrast_get_values(ctx, rb, count, x, y, zbuffer, sizeof(GLuint)); 11407cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul depth_test_span32(ctx, count, zbuffer, z, mask); 11417cb723a3fd4d90ad6efa5f440e5e39f8aaa9f79cBrian Paul rb->PutValues(ctx, rb, count, x, y, zbuffer, mask); 1142e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1144e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1145e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul return count; /* not really correct, but OK */ 1146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 114979c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 115079c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul * Apply depth (Z) buffer testing to the span. 115179c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul * \return approx number of pixels that passed (only zero is reliable) 115279c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul */ 1153733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian PaulGLuint 1154f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_depth_test_span( struct gl_context *ctx, SWspan *span) 1155733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul{ 115679c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul if (span->arrayMask & SPAN_XY) 115779c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul return depth_test_pixels(ctx, span); 115879c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul else 1159733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul return depth_test_span(ctx, span); 1160733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul} 1161733a4b602bbbfda83ee03b7ae4f3737bbe659034Brian Paul 1162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1163e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul/** 1164e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * GL_EXT_depth_bounds_test extension. 1165e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * Discard fragments depending on whether the corresponding Z-buffer 1166e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * values are outside the depth bounds test range. 1167e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * Note: we test the Z buffer values, not the fragment Z values! 1168e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul * \return GL_TRUE if any fragments pass, GL_FALSE if no fragments pass 1169e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul */ 1170e5b244ff7f984805c1bcc020342f1300f2639c71Brian PaulGLboolean 1171f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_depth_bounds_test( struct gl_context *ctx, SWspan *span ) 1172e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul{ 1173e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul struct gl_framebuffer *fb = ctx->DrawBuffer; 11741a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul struct gl_renderbuffer *rb = fb->_DepthBuffer; 1175e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint zMin = (GLuint) (ctx->Depth.BoundsMin * fb->_DepthMaxF + 0.5F); 1176e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint zMax = (GLuint) (ctx->Depth.BoundsMax * fb->_DepthMaxF + 0.5F); 1177e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul GLubyte *mask = span->array->mask; 1178e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul const GLuint count = span->end; 1179e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul GLuint i; 1180e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul GLboolean anyPass = GL_FALSE; 1181e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul 1182e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (rb->DataType == GL_UNSIGNED_SHORT) { 1183e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* get 16-bit values */ 1184e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort zbuffer16[MAX_WIDTH], *zbuffer; 1185e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (span->arrayMask & SPAN_XY) { 118667074332728acba86da7630353673b458713bb8aBrian Paul _swrast_get_values(ctx, rb, count, span->array->x, span->array->y, 118767074332728acba86da7630353673b458713bb8aBrian Paul zbuffer16, sizeof(GLushort)); 1188e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul zbuffer = zbuffer16; 1189e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1190e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else { 11919580179dfb42d5b81ff6ec9704b82a556c7f1229Brian Paul zbuffer = (GLushort*) rb->GetPointer(ctx, rb, span->x, span->y); 1192e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (!zbuffer) { 1193e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetRow(ctx, rb, count, span->x, span->y, zbuffer16); 1194e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul zbuffer = zbuffer16; 1195e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1196e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1197e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul assert(zbuffer); 1198e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1199e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* Now do the tests */ 1200e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul for (i = 0; i < count; i++) { 1201e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul if (mask[i]) { 1202e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul if (zbuffer[i] < zMin || zbuffer[i] > zMax) 1203e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul mask[i] = GL_FALSE; 1204e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul else 1205e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul anyPass = GL_TRUE; 1206e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul } 1207e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul } 1208e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul } 1209e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul else { 1210e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* get 32-bit values */ 1211e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLuint zbuffer32[MAX_WIDTH], *zbuffer; 12122526152a107e4323161b95188e767620c4998639Brian Paul ASSERT(rb->DataType == GL_UNSIGNED_INT); 1213e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul if (span->arrayMask & SPAN_XY) { 121467074332728acba86da7630353673b458713bb8aBrian Paul _swrast_get_values(ctx, rb, count, span->array->x, span->array->y, 121567074332728acba86da7630353673b458713bb8aBrian Paul zbuffer32, sizeof(GLuint)); 1216e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul zbuffer = zbuffer32; 1217e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul } 1218e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul else { 12199580179dfb42d5b81ff6ec9704b82a556c7f1229Brian Paul zbuffer = (GLuint*) rb->GetPointer(ctx, rb, span->x, span->y); 1220e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (!zbuffer) { 1221e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetRow(ctx, rb, count, span->x, span->y, zbuffer32); 1222e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul zbuffer = zbuffer32; 1223e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul } 1224e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1225e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul assert(zbuffer); 1226e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1227e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* Now do the tests */ 1228e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul for (i = 0; i < count; i++) { 1229e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (mask[i]) { 1230e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (zbuffer[i] < zMin || zbuffer[i] > zMax) 1231e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul mask[i] = GL_FALSE; 1232e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else 1233e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul anyPass = GL_TRUE; 1234e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul } 1235e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul } 1236e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul } 1237e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1238e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul return anyPass; 1239e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul} 1240e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul 1241e5b244ff7f984805c1bcc020342f1300f2639c71Brian Paul 1242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/**********************************************************************/ 1244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/***** Read Depth Buffer *****/ 1245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/**********************************************************************/ 1246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 124879c2f534916046fab91f53ebd37f705bd25f7dcbBrian Paul/** 124982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * Read a span of depth values from the given depth renderbuffer, returning 125082e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * the values as GLfloats. 125182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul * This function does clipping to prevent reading outside the depth buffer's 125277c85f014aa1db44f60b1b3291af8132ab65f444Brian Paul * bounds. 1253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 1254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid 1255f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_swrast_read_depth_span_float( struct gl_context *ctx, struct gl_renderbuffer *rb, 125682e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul GLint n, GLint x, GLint y, GLfloat depth[] ) 1257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 125882e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul const GLfloat scale = 1.0F / ctx->DrawBuffer->_DepthMaxF; 125982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul 126082e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul if (!rb) { 126182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul /* really only doing this to prevent FP exceptions later */ 12626bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul memset(depth, 0, n * sizeof(GLfloat)); 126314f21c785087f86d291243400e59ebfc8721c4f6Brian Paul return; 126482e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul } 126582e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul 126682e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul ASSERT(rb->_BaseFormat == GL_DEPTH_COMPONENT); 126782e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul 1268e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (y < 0 || y >= (GLint) rb->Height || 126982b29819a9ede846ad5c37ff70b71d45cf72357aBrian Paul x + n <= 0 || x >= (GLint) rb->Width) { 1270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* span is completely outside framebuffer */ 12716bf1ea897fa470af58fe8916dff45e2da79634a3Brian Paul memset(depth, 0, n * sizeof(GLfloat)); 1272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 1273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (x < 0) { 1276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint dx = -x; 1277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; 1278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i = 0; i < dx; i++) 127982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul depth[i] = 0.0; 1280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell x = 0; 1281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell n -= dx; 1282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell depth += dx; 1283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1284e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul if (x + n > (GLint) rb->Width) { 1285e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLint dx = x + n - (GLint) rb->Width; 1286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell GLint i; 1287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell for (i = 0; i < dx; i++) 128882e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul depth[n - i - 1] = 0.0; 1289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell n -= dx; 1290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell if (n <= 0) { 1292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 1293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 129582e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul if (rb->DataType == GL_UNSIGNED_INT) { 129682e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul GLuint temp[MAX_WIDTH]; 129782e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul GLint i; 129882e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul rb->GetRow(ctx, rb, n, x, y, temp); 129982e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul for (i = 0; i < n; i++) { 130082e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul depth[i] = temp[i] * scale; 130182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul } 1302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 130382e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul else if (rb->DataType == GL_UNSIGNED_SHORT) { 1304e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLushort temp[MAX_WIDTH]; 130582e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul GLint i; 1306e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul rb->GetRow(ctx, rb, n, x, y, temp); 1307e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul for (i = 0; i < n; i++) { 13088bdc1ae358986aec81d4e6e3930a85f11680b73bBrian Paul depth[i] = temp[i] * scale; 1309e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 131182e314252f0b706c3ae1c748e9d64d8fa58812dbBrian Paul else { 13124fd11949f03039a95dbdbfdae7865615d5a727d6Brian Paul _mesa_problem(ctx, "Invalid depth renderbuffer data type"); 1313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1316fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1317a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul/** 1318fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul * Clear the given z/depth renderbuffer. If the buffer is a combined 1319fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul * depth+stencil buffer, only the Z bits will be touched. 1320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */ 1321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid 1322fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul_swrast_clear_depth_buffer(struct gl_context *ctx) 1323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{ 1324fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul struct gl_renderbuffer *rb = 1325fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer; 1326f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul GLuint clearValue; 1327e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul GLint x, y, width, height; 1328fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLubyte *map; 1329fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLint rowStride, i, j; 1330fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLbitfield mapMode; 1331328a039413fd2b8649511f1ca130df2a59f2c71cBrian Paul 1332b5e9b0e56231065f6324bbd3c2c35ca53b46ddf8Brian if (!rb || !ctx->Depth.Mask) { 1333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell /* no depth buffer, or writing to it is disabled */ 1334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell return; 1335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 1337f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul /* compute integer clearing value */ 1338f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul if (ctx->Depth.Clear == 1.0) { 1339f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul clearValue = ctx->DrawBuffer->_DepthMax; 1340f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul } 1341f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul else { 1342f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul clearValue = (GLuint) (ctx->Depth.Clear * ctx->DrawBuffer->_DepthMaxF); 1343f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul } 1344f36954ec3c25b673fc275877938e2dea48ec5682Brian Paul 1345e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul /* compute region to clear */ 1346e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul x = ctx->DrawBuffer->_Xmin; 1347e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul y = ctx->DrawBuffer->_Ymin; 1348e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul width = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin; 1349e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin; 1350e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul 1351fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul mapMode = GL_MAP_WRITE_BIT; 1352fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul if (rb->Format == MESA_FORMAT_S8_Z24 || 1353fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul rb->Format == MESA_FORMAT_X8_Z24 || 1354fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul rb->Format == MESA_FORMAT_Z24_S8 || 1355fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul rb->Format == MESA_FORMAT_Z24_X8) { 1356fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul mapMode |= GL_MAP_READ_BIT; 1357fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1358fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1359fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, 1360fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul mapMode, &map, &rowStride); 1361fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul if (!map) { 1362fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glClear(depth)"); 1363fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul return; 1364fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1365fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1366fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul switch (rb->Format) { 1367fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_Z16: 1368fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul { 1369fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLfloat clear = (GLfloat) ctx->Depth.Clear; 1370fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLushort clearVal = 0; 1371fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul _mesa_pack_float_z_row(rb->Format, 1, &clear, &clearVal); 1372fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul if (clearVal == 0xffff && width * 2 == rowStride) { 1373fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul /* common case */ 1374fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul memset(map, 0xff, width * height * 2); 1375e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1376e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul else { 1377e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul for (i = 0; i < height; i++) { 1378fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLushort *row = (GLushort *) map; 1379e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul for (j = 0; j < width; j++) { 1380fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul row[j] = clearVal; 1381e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul } 1382fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul map += rowStride; 1383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1386fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul break; 1387fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_Z32: 1388fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_Z32_FLOAT: 1389fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul { 1390fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLfloat clear = (GLfloat) ctx->Depth.Clear; 1391fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLuint clearVal = 0; 1392fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul _mesa_pack_float_z_row(rb->Format, 1, &clear, &clearVal); 1393e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul for (i = 0; i < height; i++) { 1394fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLuint *row = (GLuint *) map; 1395e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul for (j = 0; j < width; j++) { 1396fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul row[j] = clearVal; 1397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1398fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul map += rowStride; 1399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1401fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul break; 1402fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_S8_Z24: 1403fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_X8_Z24: 1404fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_Z24_S8: 1405fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_Z24_X8: 1406fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul { 1407fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLfloat clear = (GLfloat) ctx->Depth.Clear; 1408fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLuint clearVal = 0; 1409fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLuint mask; 1410fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1411fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul if (rb->Format == MESA_FORMAT_S8_Z24 || 1412fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul rb->Format == MESA_FORMAT_X8_Z24) 1413fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul mask = 0xff000000; 1414fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul else 1415fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul mask = 0xff; 1416fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1417fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul _mesa_pack_float_z_row(rb->Format, 1, &clear, &clearVal); 1418e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul for (i = 0; i < height; i++) { 1419fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLuint *row = (GLuint *) map; 1420fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul for (j = 0; j < width; j++) { 1421fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul row[j] = (row[j] & mask) | clearVal; 1422fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1423fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul map += rowStride; 1424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1425fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1427fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul break; 1428fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_Z32_FLOAT_X24S8: 1429fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul /* XXX untested */ 1430fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul { 1431fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLfloat clearVal = (GLfloat) ctx->Depth.Clear; 1432e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul for (i = 0; i < height; i++) { 1433fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLfloat *row = (GLfloat *) map; 1434fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul for (j = 0; j < width; j++) { 1435fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul row[j * 2] = clearVal; 1436fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1437fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul map += rowStride; 1438e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1440fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul break; 1441fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul default: 1442fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul _mesa_problem(ctx, "Unexpected depth buffer format %s" 1443fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul " in _swrast_clear_depth_buffer()", 1444fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul _mesa_get_format_name(rb->Format)); 1445fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1446fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1447fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul ctx->Driver.UnmapRenderbuffer(ctx, rb); 1448fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul} 1449fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1450fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1451fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1452fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1453fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul/** 1454fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul * Clear both depth and stencil values in a combined depth+stencil buffer. 1455fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul */ 1456fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paulvoid 1457fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul_swrast_clear_depth_stencil_buffer(struct gl_context *ctx) 1458fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul{ 1459fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul const GLubyte stencilBits = ctx->DrawBuffer->Visual.stencilBits; 1460fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul const GLuint writeMask = ctx->Stencil.WriteMask[0]; 1461fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul const GLuint stencilMax = (1 << stencilBits) - 1; 1462fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul struct gl_renderbuffer *rb = 1463fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer; 1464fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLint x, y, width, height; 1465fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLbitfield mapMode; 1466fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLubyte *map; 1467fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLint rowStride, i, j; 1468fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1469fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul /* check that we really have a combined depth+stencil buffer */ 1470fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul assert(rb == ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer); 1471fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1472fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul /* compute region to clear */ 1473fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul x = ctx->DrawBuffer->_Xmin; 1474fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul y = ctx->DrawBuffer->_Ymin; 1475fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul width = ctx->DrawBuffer->_Xmax - ctx->DrawBuffer->_Xmin; 1476fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul height = ctx->DrawBuffer->_Ymax - ctx->DrawBuffer->_Ymin; 1477fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1478fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul mapMode = GL_MAP_WRITE_BIT; 1479fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul if ((writeMask & stencilMax) != stencilMax) { 1480fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul /* need to mask stencil values */ 1481fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul mapMode |= GL_MAP_READ_BIT; 1482fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1483fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1484fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul ctx->Driver.MapRenderbuffer(ctx, rb, x, y, width, height, 1485fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul mapMode, &map, &rowStride); 1486fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul if (!map) { 1487fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glClear(depth+stencil)"); 1488fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul return; 1489fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1490fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1491fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul switch (rb->Format) { 1492fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_S8_Z24: 1493fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_Z24_S8: 1494fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul { 1495fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLfloat zClear = (GLfloat) ctx->Depth.Clear; 1496fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLuint clear = 0, mask; 1497fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1498fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul _mesa_pack_float_z_row(rb->Format, 1, &zClear, &clear); 1499fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1500fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul if (rb->Format == MESA_FORMAT_S8_Z24) { 1501fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul mask = ((~writeMask) & 0xff) << 24; 1502fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul clear |= (ctx->Stencil.Clear & writeMask & 0xff) << 24; 1503fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1504fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul else { 1505fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul mask = ((~writeMask) & 0xff); 1506fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul clear |= (ctx->Stencil.Clear & writeMask & 0xff); 1507fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1508fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1509fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul for (i = 0; i < height; i++) { 1510fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLuint *row = (GLuint *) map; 1511fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul if (mask != 0x0) { 1512fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul for (j = 0; j < width; j++) { 1513fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul row[j] = (row[j] & mask) | clear; 1514fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1515fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1516fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul else { 1517fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul for (j = 0; j < width; j++) { 1518fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul row[j] = clear; 1519fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1520fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1521fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul map += rowStride; 1522fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1523fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1524fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul break; 1525fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul case MESA_FORMAT_Z32_FLOAT_X24S8: 1526fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul /* XXX untested */ 1527fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul { 1528fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul const GLfloat zClear = (GLfloat) ctx->Depth.Clear; 1529fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul const GLuint sClear = ctx->Stencil.Clear & writeMask; 1530fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul const GLuint sMask = (~writeMask) & 0xff; 1531fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul for (i = 0; i < height; i++) { 1532fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLfloat *zRow = (GLfloat *) map; 1533fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul GLuint *sRow = (GLuint *) map; 1534fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul for (j = 0; j < width; j++) { 1535fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul zRow[j * 2 + 0] = zClear; 1536fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1537fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul if (sMask != 0) { 1538fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul for (j = 0; j < width; j++) { 1539fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul sRow[j * 2 + 1] = (sRow[j * 2 + 1] & sMask) | sClear; 1540fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1541fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1542fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul else { 1543fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul for (j = 0; j < width; j++) { 1544fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul sRow[j * 2 + 1] = sClear; 1545fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1546fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1547fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul map += rowStride; 1548fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul } 1549f39569f5509f9298cb5374b9758296d9149add9bBrian Paul } 1550fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul break; 1551fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul default: 1552fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul _mesa_problem(ctx, "Unexpected depth buffer format %s" 1553fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul " in _swrast_clear_depth_buffer()", 1554fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul _mesa_get_format_name(rb->Format)); 1555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell } 1556fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1557fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul ctx->Driver.UnmapRenderbuffer(ctx, rb); 1558fd104a84591ae854c5d6adc81e2dc31ef6ab9e8aBrian Paul 1559e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell} 1560