1fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul/************************************************************************** 2fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * 3fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * Copyright 2010 VMware, Inc. All Rights Reserved. 4fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * 5fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 6fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * copy of this software and associated documentation files (the 7fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * "Software"), to deal in the Software without restriction, including 8fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * without limitation the rights to use, copy, modify, merge, publish, 9fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * distribute, sub license, and/or sell copies of the Software, and to 10fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * permit persons to whom the Software is furnished to do so, subject to 11fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * the following conditions: 12fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * 13fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * The above copyright notice and this permission notice (including the 14fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * next paragraph) shall be included in all copies or substantial portions 15fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * of the Software. 16fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * 17fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 19fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 20fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR 21fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 22fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 23fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * 25fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul **************************************************************************/ 26fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 27fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 28fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul/* 29fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * Template for generating Z test functions 30fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * Only PIPE_FORMAT_Z16_UNORM supported at this time. 31fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul */ 32fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 33fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 34fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#ifndef NAME 35fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#error "NAME is not defined!" 36fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#endif 37fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 38fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#if !defined(OPERATOR) && !defined(ALWAYS) 39fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#error "neither OPERATOR nor ALWAYS is defined!" 40fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#endif 41fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 42fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 43fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul/* 44fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * NOTE: there's no guarantee that the quads are sequentially side by 45fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * side. The fragment shader may have culled some quads, etc. Sliver 46fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul * triangles may generate non-sequential quads. 47fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul */ 48fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paulstatic void 49fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian PaulNAME(struct quad_stage *qs, 50fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul struct quad_header *quads[], 51fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul unsigned nr) 52fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul{ 53fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul unsigned i, pass = 0; 54fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul const unsigned ix = quads[0]->input.x0; 55fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul const unsigned iy = quads[0]->input.y0; 56fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul const float fx = (float) ix; 57fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul const float fy = (float) iy; 58fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul const float dzdx = quads[0]->posCoef->dadx[2]; 59fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul const float dzdy = quads[0]->posCoef->dady[2]; 60fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul const float z0 = quads[0]->posCoef->a0[2] + dzdx * fx + dzdy * fy; 61fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul struct softpipe_cached_tile *tile; 62fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul ushort (*depth16)[TILE_SIZE]; 63fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul ushort init_idepth[4], idepth[4], depth_step; 64fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul const float scale = 65535.0; 65fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 66fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul /* compute scaled depth of the four pixels in first quad */ 67fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul init_idepth[0] = (ushort)((z0) * scale); 68fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul init_idepth[1] = (ushort)((z0 + dzdx) * scale); 69fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul init_idepth[2] = (ushort)((z0 + dzdy) * scale); 70fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul init_idepth[3] = (ushort)((z0 + dzdx + dzdy) * scale); 71fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 72fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth_step = (ushort)(dzdx * scale); 73fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 74740d5bed77120aba4d815b5e2d28b109f214a800Dave Airlie tile = sp_get_cached_tile(qs->softpipe->zsbuf_cache, ix, iy, quads[0]->input.layer); 75fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 76fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul for (i = 0; i < nr; i++) { 77fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul const unsigned outmask = quads[i]->inout.mask; 78fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul const int dx = quads[i]->input.x0 - ix; 79fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul unsigned mask = 0; 80fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 81fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul /* compute depth for this quad */ 82fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul idepth[0] = init_idepth[0] + dx * depth_step; 83fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul idepth[1] = init_idepth[1] + dx * depth_step; 84fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul idepth[2] = init_idepth[2] + dx * depth_step; 85fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul idepth[3] = init_idepth[3] + dx * depth_step; 86fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 87fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth16 = (ushort (*)[TILE_SIZE]) 88fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul &tile->data.depth16[iy % TILE_SIZE][(ix + dx)% TILE_SIZE]; 89fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 90fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#ifdef ALWAYS 91fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul if (outmask & 1) { 92fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth16[0][0] = idepth[0]; 93fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul mask |= (1 << 0); 94fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul } 95fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 96fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul if (outmask & 2) { 97fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth16[0][1] = idepth[1]; 98fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul mask |= (1 << 1); 99fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul } 100fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 101fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul if (outmask & 4) { 102fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth16[1][0] = idepth[2]; 103fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul mask |= (1 << 2); 104fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul } 105fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 106fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul if (outmask & 8) { 107fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth16[1][1] = idepth[3]; 108fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul mask |= (1 << 3); 109fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul } 110fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#else 111fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul /* Note: OPERATOR appears here: */ 112fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul if ((outmask & 1) && (idepth[0] OPERATOR depth16[0][0])) { 113fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth16[0][0] = idepth[0]; 114fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul mask |= (1 << 0); 115fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul } 116fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 117fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul if ((outmask & 2) && (idepth[1] OPERATOR depth16[0][1])) { 118fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth16[0][1] = idepth[1]; 119fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul mask |= (1 << 1); 120fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul } 121fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 122fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul if ((outmask & 4) && (idepth[2] OPERATOR depth16[1][0])) { 123fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth16[1][0] = idepth[2]; 124fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul mask |= (1 << 2); 125fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul } 126fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 127fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul if ((outmask & 8) && (idepth[3] OPERATOR depth16[1][1])) { 128fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth16[1][1] = idepth[3]; 129fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul mask |= (1 << 3); 130fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul } 131fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#endif 132fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 133fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul depth16 = (ushort (*)[TILE_SIZE]) &depth16[0][2]; 134fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 135fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul quads[i]->inout.mask = mask; 136fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul if (quads[i]->inout.mask) 137fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul quads[pass++] = quads[i]; 138fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul } 139fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 140fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul if (pass) 141fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul qs->next->run(qs->next, quads, pass); 142fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul} 143fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 144fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul 145fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#undef NAME 146fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#undef OPERATOR 147fc1ba0423ac31cff14346dbc888255fb5fd7d1b2Brian Paul#undef ALWAYS 148