lp_rast_tri_tmp.h revision 4b322e71bb169af637864922edfb4108675781bb
1d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell/************************************************************************** 2d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * 3d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * Copyright 2007-2010 VMware, Inc. 4d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * All Rights Reserved. 5d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * 6d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 7d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * copy of this software and associated documentation files (the 8d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * "Software"), to deal in the Software without restriction, including 9d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 10d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 11d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to 12d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * the following conditions: 13d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * 14d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * The above copyright notice and this permission notice (including the 15d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * next paragraph) shall be included in all copies or substantial portions 16d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * of the Software. 17d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * 18d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * 26d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell **************************************************************************/ 27d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 28d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell/* 29d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * Rasterization for binned triangles within a tile 30d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 31d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 32d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 33d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 34d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell/** 35d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * Prototype for a 7 plane rasterizer function. Will codegenerate 36d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * several of these. 37d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * 38d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * XXX: Varients for more/fewer planes. 39d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * XXX: Need ways of dropping planes as we descend. 40d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * XXX: SIMD 41d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 42d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwellstatic void 43d4b64167b56f780d0dea73193c345622888fbc16Keith WhitwellTAG(do_block_4)(struct lp_rasterizer_task *task, 44d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell const struct lp_rast_triangle *tri, 45d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell const struct lp_rast_plane *plane, 46d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int x, int y, 47d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell const int *c) 48d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell{ 49510b03539413552a543e25de6b896eb10baf60aeKeith Whitwell unsigned mask = 0xffff; 50510b03539413552a543e25de6b896eb10baf60aeKeith Whitwell int j; 51d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 52510b03539413552a543e25de6b896eb10baf60aeKeith Whitwell for (j = 0; j < NR_PLANES; j++) { 53515194968d033d2c0c5678677f7606d38635d747Keith Whitwell mask &= ~build_mask(c[j] - 1, 54515194968d033d2c0c5678677f7606d38635d747Keith Whitwell plane[j].step[1], 55515194968d033d2c0c5678677f7606d38635d747Keith Whitwell plane[j].step[2]); 56d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell } 57d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 58d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell /* Now pass to the shader: 59d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 60d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell if (mask) 61d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell lp_rast_shade_quads_mask(task, &tri->inputs, x, y, mask); 62d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell} 63d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 64d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell/** 65d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * Evaluate a 16x16 block of pixels to determine which 4x4 subblocks are in/out 66d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * of the triangle's bounds. 67d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 68d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwellstatic void 69d4b64167b56f780d0dea73193c345622888fbc16Keith WhitwellTAG(do_block_16)(struct lp_rasterizer_task *task, 70d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell const struct lp_rast_triangle *tri, 71d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell const struct lp_rast_plane *plane, 72d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int x, int y, 73d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell const int *c) 74d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell{ 75d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell unsigned outmask, inmask, partmask, partial_mask; 764b322e71bb169af637864922edfb4108675781bbKeith Whitwell unsigned j; 77d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 78d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell outmask = 0; /* outside one or more trivial reject planes */ 79d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell partmask = 0; /* outside one or more trivial accept planes */ 80d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 81d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell for (j = 0; j < NR_PLANES; j++) { 824b322e71bb169af637864922edfb4108675781bbKeith Whitwell const int dcdx = plane[j].step[1] * 4; 834b322e71bb169af637864922edfb4108675781bbKeith Whitwell const int dcdy = plane[j].step[2] * 4; 844b322e71bb169af637864922edfb4108675781bbKeith Whitwell const int cox = c[j] + plane[j].eo * 4; 854b322e71bb169af637864922edfb4108675781bbKeith Whitwell const int cio = c[j] + plane[j].ei * 4 - 1; 864b322e71bb169af637864922edfb4108675781bbKeith Whitwell 874b322e71bb169af637864922edfb4108675781bbKeith Whitwell outmask |= build_mask(cox, dcdx, dcdy); 884b322e71bb169af637864922edfb4108675781bbKeith Whitwell partmask |= build_mask(cio, dcdx, dcdy); 89d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell } 90d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 91d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell if (outmask == 0xffff) 92d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell return; 93d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 94d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell /* Mask of sub-blocks which are inside all trivial accept planes: 95d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 96d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell inmask = ~partmask & 0xffff; 97d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 98d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell /* Mask of sub-blocks which are inside all trivial reject planes, 99d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * but outside at least one trivial accept plane: 100d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 101d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell partial_mask = partmask & ~outmask; 102d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 103d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell assert((partial_mask & inmask) == 0); 104d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 105d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell /* Iterate over partials: 106d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 107d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell while (partial_mask) { 108d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int i = ffs(partial_mask) - 1; 109d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int px = x + pos_table4[i][0]; 110d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int py = y + pos_table4[i][1]; 111d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int cx[NR_PLANES]; 112d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 113d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell for (j = 0; j < NR_PLANES; j++) 114d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell cx[j] = c[j] + plane[j].step[i] * 4; 115d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 116d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell partial_mask &= ~(1 << i); 117d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 118d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell TAG(do_block_4)(task, tri, plane, px, py, cx); 119d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell } 120d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 121d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell /* Iterate over fulls: 122d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 123d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell while (inmask) { 124d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int i = ffs(inmask) - 1; 125d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int px = x + pos_table4[i][0]; 126d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int py = y + pos_table4[i][1]; 127d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 128d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell inmask &= ~(1 << i); 129d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 130d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell block_full_4(task, tri, px, py); 131d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell } 132d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell} 133d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 134d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 135d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell/** 136d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * Scan the tile in chunks and figure out which pixels to rasterize 137d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * for this triangle. 138d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 139d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwellvoid 140d4b64167b56f780d0dea73193c345622888fbc16Keith WhitwellTAG(lp_rast_triangle)(struct lp_rasterizer_task *task, 141d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell const union lp_rast_cmd_arg arg) 142d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell{ 143d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell const struct lp_rast_triangle *tri = arg.triangle.tri; 144d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell unsigned plane_mask = arg.triangle.plane_mask; 145d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell const int x = task->x, y = task->y; 146d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell struct lp_rast_plane plane[NR_PLANES]; 147d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int c[NR_PLANES]; 148d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell unsigned outmask, inmask, partmask, partial_mask; 1494b322e71bb169af637864922edfb4108675781bbKeith Whitwell unsigned j, nr_planes = 0; 150d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 151d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell while (plane_mask) { 152d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int i = ffs(plane_mask) - 1; 153d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell plane[nr_planes] = tri->plane[i]; 154d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell plane_mask &= ~(1 << i); 155d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell nr_planes++; 156d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell }; 157d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 158d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell assert(nr_planes == NR_PLANES); 159d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell outmask = 0; /* outside one or more trivial reject planes */ 160d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell partmask = 0; /* outside one or more trivial accept planes */ 161d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 162d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell for (j = 0; j < NR_PLANES; j++) { 163d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell c[j] = plane[j].c + plane[j].dcdy * y - plane[j].dcdx * x; 1644b322e71bb169af637864922edfb4108675781bbKeith Whitwell } 1654b322e71bb169af637864922edfb4108675781bbKeith Whitwell 1664b322e71bb169af637864922edfb4108675781bbKeith Whitwell for (j = 0; j < NR_PLANES; j++) { 1674b322e71bb169af637864922edfb4108675781bbKeith Whitwell const int dcdx = plane[j].step[1] * 16; 1684b322e71bb169af637864922edfb4108675781bbKeith Whitwell const int dcdy = plane[j].step[2] * 16; 1694b322e71bb169af637864922edfb4108675781bbKeith Whitwell const int cox = c[j] + plane[j].eo * 16; 1704b322e71bb169af637864922edfb4108675781bbKeith Whitwell const int cio = c[j] + plane[j].ei * 16 - 1; 1714b322e71bb169af637864922edfb4108675781bbKeith Whitwell 1724b322e71bb169af637864922edfb4108675781bbKeith Whitwell outmask |= build_mask(cox, dcdx, dcdy); 1734b322e71bb169af637864922edfb4108675781bbKeith Whitwell partmask |= build_mask(cio, dcdx, dcdy); 174d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell } 175d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 176d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell if (outmask == 0xffff) 177d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell return; 178d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 179d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell /* Mask of sub-blocks which are inside all trivial accept planes: 180d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 181d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell inmask = ~partmask & 0xffff; 182d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 183d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell /* Mask of sub-blocks which are inside all trivial reject planes, 184d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell * but outside at least one trivial accept plane: 185d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 186d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell partial_mask = partmask & ~outmask; 187d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 188d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell assert((partial_mask & inmask) == 0); 189d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 190d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell /* Iterate over partials: 191d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 192d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell while (partial_mask) { 193d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int i = ffs(partial_mask) - 1; 194d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int px = x + pos_table16[i][0]; 195d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int py = y + pos_table16[i][1]; 196d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int cx[NR_PLANES]; 197d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 198d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell for (j = 0; j < NR_PLANES; j++) 199d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell cx[j] = c[j] + plane[j].step[i] * 16; 200d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 201d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell partial_mask &= ~(1 << i); 202d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 203d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell LP_COUNT(nr_partially_covered_16); 204d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell TAG(do_block_16)(task, tri, plane, px, py, cx); 205d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell } 206d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 207d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell /* Iterate over fulls: 208d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell */ 209d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell while (inmask) { 210d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int i = ffs(inmask) - 1; 211d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int px = x + pos_table16[i][0]; 212d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell int py = y + pos_table16[i][1]; 213d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 214d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell inmask &= ~(1 << i); 215d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 216d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell LP_COUNT(nr_fully_covered_16); 217d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell block_full_16(task, tri, px, py); 218d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell } 219d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell} 220d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 221d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell#undef TAG 222d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell#undef NR_PLANES 223d4b64167b56f780d0dea73193c345622888fbc16Keith Whitwell 224