lp_setup.c revision 0718c7700533a965d7cd06b4f67b82bbae6e66a1
1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/************************************************************************** 2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 3946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * All Rights Reserved. 5946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 6946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 7946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * copy of this software and associated documentation files (the 8946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * "Software"), to deal in the Software without restriction, including 9946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 10946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 11946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * permit persons to whom the Software is furnished to do so, subject to 12946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * the following conditions: 13946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 14946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * The above copyright notice and this permission notice (including the 15946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * next paragraph) shall be included in all copies or substantial portions 16946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * of the Software. 17946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 18946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 26946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca **************************************************************************/ 27946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 28946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 29931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Tiling engine. 30946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 31931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Builds per-tile display lists and executes them on calls to 32931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * lp_setup_flush(). 33946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 34946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 351caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell#include "lp_setup_context.h" 36946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_math.h" 37946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h" 38946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 39931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_cmd_block( struct cmd_block_list *list ) 40931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 41931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct cmd_block *block = MALLOC_STRUCT(cmd_block); 42931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail->next = block; 43931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail = block; 44931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->next = NULL; 45931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->count = 0; 46931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 47946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 48931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_data_block( struct data_block_list *list ) 49931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 50931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct data_block *block = MALLOC_STRUCT(data_block); 51931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail->next = block; 52931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail = block; 53931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->next = NULL; 54931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->used = 0; 55931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 56946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 57931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void reset_context( struct setup_context *setup ) 58931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 591caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell unsigned i, j; 601caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell 610718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Free binner command lists: 620718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 63931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (i = 0; i < setup->tiles_x; i++) { 64931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (j = 0; j < setup->tiles_y; j++) { 651caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct cmd_block_list *list = &setup->tile[i][j]; 66931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct cmd_block *block; 67931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct cmd_block *tmp; 68931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 691caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (block = list->head; block != list->tail; block = tmp) { 70931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell tmp = block->next; 71931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(block); 72931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 73931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 741caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell list->head = list->tail; 75931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 76931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 77e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 780718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Free binned data: 790718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 80931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell { 811caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct data_block_list *list = &setup->data; 82931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct data_block *block, *tmp; 83931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 841caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (block = list->head; block != list->tail; block = tmp) { 85931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell tmp = block->next; 86931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(block); 87931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 88931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 891caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell list->head = list->tail; 90931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 910718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 920718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Reset some state: 930718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 940718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell setup->clear.flags = 0; 95931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 96931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 97931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 98931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 99931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 100931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Add a command to all active bins. 101931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */ 102931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void bin_everywhere( struct setup_context *setup, 1031caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell lp_rast_cmd cmd, 104931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const union lp_rast_cmd_arg *arg ) 105e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{ 106931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned i, j; 107931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (i = 0; i < setup->tiles_x; i++) 108931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (j = 0; j < setup->tiles_y; j++) 1091caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell bin_cmd( &setup->tile[i][j], cmd, arg ); 110e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell} 111e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 112931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 113931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 114931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellrasterize_bins( struct setup_context *setup, 115931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell boolean write_depth ) 116e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{ 1171caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct lp_rasterizer *rast = setup->rast; 1181caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct cmd_block *block; 1191caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell unsigned i,j,k; 1201caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell 121931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_bind_color( rast, 1221caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell setup->fb.color, 123931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell TRUE ); /* WRITE */ 124931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 125931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_bind_depth( rast, 1261caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell setup->fb.zstencil, 127931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell write_depth ); /* WRITE */ 128931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1291caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (i = 0; i < setup->tiles_x; i++) { 1301caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (j = 0; j < setup->tiles_y; j++) { 131931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 132931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_start_tile( rast, 133931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell i * TILESIZE, 134931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell j * TILESIZE ); 135931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1361caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (block = setup->tile[i][j].head; block; block = block->next) { 1371caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (k = 0; k < block->count; k++) { 1381caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell block->cmd[k]( rast, block->arg[k] ); 139931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 140931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 141931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1420718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell lp_rast_end_tile( rast ); 143931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 144931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 145931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1461caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell reset_context( setup ); 147e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell} 148e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 149931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 150931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 151931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 152931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellbegin_binning( struct setup_context *setup ) 153e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{ 154931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (setup->fb.color) { 1550718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_COLOR) 156931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell bin_everywhere( setup, 157931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_clear_color, 1580718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell &setup->clear.color ); 159931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 160931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell bin_everywhere( setup, 161931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_load_color, 162931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell NULL ); 163931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 164931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 165931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (setup->fb.zstencil) { 1660718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 167931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell bin_everywhere( setup, 168931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_clear_zstencil, 1690718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell &setup->clear.zstencil ); 170931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 171931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell bin_everywhere( setup, 172931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_load_zstencil, 173931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell NULL ); 174931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 175e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell} 176e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 177e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 178931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen 179931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears. 180931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * 181931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles. 182946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 183931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 184931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellexecute_clears( struct setup_context *setup ) 185946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 186931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell begin_binning( setup ); 1870718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell rasterize_bins( setup, TRUE ); 188946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 189946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 190931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 191931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 192931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellset_state( struct setup_context *setup, 193931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned new_state ) 194931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 195931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned old_state = setup->state; 196931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 197931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == new_state) 198931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 199931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 200931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell switch (new_state) { 201931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_ACTIVE: 202931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == SETUP_FLUSHED) 2030718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell begin_binning( setup ); 204931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 205931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 206931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_CLEARED: 207931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == SETUP_ACTIVE) { 208931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell assert(0); 209931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 210931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 211931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 212931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 213931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_FLUSHED: 2140718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (old_state == SETUP_CLEARED) 215931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell execute_clears( setup ); 216931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 2170718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell rasterize_bins( setup, TRUE ); 218931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 219931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 220931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 221931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->state = new_state; 222931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 223931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 224931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 225946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid 226931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_flush( struct setup_context *setup, 227931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 228946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 229931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_FLUSHED ); 230946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 231946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 232946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 233931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 234931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_bind_framebuffer( struct setup_context *setup, 235931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct pipe_surface *color, 236931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct pipe_surface *zstencil ) 237946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 238931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned width, height; 239946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 240931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_FLUSHED ); 241931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 242931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell pipe_surface_reference( &setup->fb.color, color ); 243931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell pipe_surface_reference( &setup->fb.zstencil, zstencil ); 244931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 245931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell width = MAX2( color->width, zstencil->width ); 246931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell height = MAX2( color->height, zstencil->height ); 247931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 248931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->tiles_x = align( width, TILESIZE ) / TILESIZE; 249931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->tiles_y = align( height, TILESIZE ) / TILESIZE; 250931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 251931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 252931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 253931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_clear( struct setup_context *setup, 254931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float *clear_color, 255931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell double clear_depth, 256931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned clear_stencil, 257931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 258931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 259931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (setup->state == SETUP_ACTIVE) { 260931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct lp_rast_clear_info *clear_info; 261931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 262931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell clear_info = alloc_clear_info( setup ); 263946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 264931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (flags & PIPE_CLEAR_COLOR) { 265931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell pack_color( setup, 266931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell clear_info->color, 267931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell clear_color ); 268931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell bin_everywhere(setup, lp_rast_clear_color, clear_info ); 269931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 27089498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell 271931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (flags & PIPE_CLEAR_DEPTH_STENCIL) { 272931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell pack_depth_stencil( setup, 273931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell clear_info->depth, 274931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell clear_depth, 275931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell clear_stencil ); 276931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 277931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell bin_everywhere(setup, lp_rast_clear_zstencil, clear_info ); 278931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 279946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 280946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 281931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_CLEARED ); 2820718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 283931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->clear.flags |= flags; 284931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 285931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (flags & PIPE_CLEAR_COLOR) { 2860718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell util_pack_color(rgba, 2870718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell setup->fb.cbuf->format, 2880718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell &setup->clear.color.clear_color ); 289931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 290931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 291931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (flags & PIPE_CLEAR_DEPTH_STENCIL) { 2920718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell setup->clear.zstencil.clear_zstencil = 2930718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell util_pack_z_stencil(setup->fb.zsbuf->format, 2940718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell depth, 2950718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell stencil); 296931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 297946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 298931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 299931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 300931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 301931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 302931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_set_fs_inputs( struct setup_context *setup, 303931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const enum lp_interp *interp, 304931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned nr ) 305931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 306931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell memcpy( setup->interp, interp, nr * sizeof interp[0] ); 307931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 30889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell 3090718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid 3100718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwelllp_setup_set_shader_state( struct setup_context *setup, 3110718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const struct jit_context *jc ) 3120718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell{ 3130718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell} 3140718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 315931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 316931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 317931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfirst_triangle( struct setup_context *setup, 318931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v0)[4], 319931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v1)[4], 320931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v2)[4]) 321931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 322931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, STATE_ACTIVE ); 323931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup_choose_triangle( setup, v0, v1, v2 ); 324931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 325931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 326931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 327931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 328931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Stubs for lines & points for now: 329931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */ 330931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 331931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_point(struct setup_context *setup, 332931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v0)[4]) 333931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 334931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->point( setup, v0 ); 335946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 336946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 337931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 338931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_line(struct setup_context *setup, 339931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v0)[4], 340931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v1)[4]) 341931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 342931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->line( setup, v0, v1 ); 343931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 344931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 345931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 3460718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwelllp_setup_tri(struct setup_context *setup, 3470718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v0)[4], 3480718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v1)[4], 3490718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v2)[4]) 350931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 351931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 352931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 353946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 354946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 35589498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwellvoid setup_destroy_context( struct setup_context *setup ) 356946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 357931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_destroy( setup->rast ); 35889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell FREE( setup ); 359946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 360946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 361946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 362946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 363931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Create a new primitive tiling engine. Currently also creates a 364931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * rasterizer to use with it. 365946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 366931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstruct setup_context *setup_create_context( void ) 367946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 36889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell struct setup_context *setup = CALLOC_STRUCT(setup_context); 369946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 370931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->rast = lp_rast_create( void ); 371931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (!setup->rast) 372931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell goto fail; 373931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 374931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (i = 0; i < TILES_X; i++) 375931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (j = 0; j < TILES_Y; j++) 376931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->tile[i][j].first = 377931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->tile[i][j].next = CALLOC_STRUCT(cmd_block); 378946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 379946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca return setup; 380931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 381931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfail: 382931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(setup); 383931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return NULL; 384946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 385946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 386