lp_setup.c revision 402c189af7e95be99ba2e5fd71a71987ffd73c2f
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 35d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "pipe/p_defines.h" 36d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "pipe/p_inlines.h" 37946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_math.h" 38946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h" 39253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell#include "util/u_pack_color.h" 40d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_state.h" 41d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_buffer.h" 42d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_texture.h" 43d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_setup_context.h" 44253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 45402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell#define SETUP_DEBUG debug_printf 46402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 47253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void set_state( struct setup_context *, unsigned ); 48946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 49931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_cmd_block( struct cmd_block_list *list ) 50931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 51931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct cmd_block *block = MALLOC_STRUCT(cmd_block); 52931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail->next = block; 53931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail = block; 54931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->next = NULL; 55931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->count = 0; 56931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 57946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 58931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_data_block( struct data_block_list *list ) 59931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 60931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct data_block *block = MALLOC_STRUCT(data_block); 61931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail->next = block; 62931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail = block; 63931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->next = NULL; 64931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->used = 0; 65931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 66946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 67253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 68253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 69253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_triangle( struct setup_context *setup, 70253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 71253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4], 72253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v2)[4]) 73253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 74253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell set_state( setup, SETUP_ACTIVE ); 75253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_triangle( setup ); 76253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 77253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 78253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 79253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 80253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_line( struct setup_context *setup, 81253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 82253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4]) 83253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 84253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell set_state( setup, SETUP_ACTIVE ); 85253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_line( setup ); 86253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line( setup, v0, v1 ); 87253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 88253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 89253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 90253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_point( struct setup_context *setup, 91253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4]) 92253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 93253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell set_state( setup, SETUP_ACTIVE ); 94253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_point( setup ); 95253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point( setup, v0 ); 96253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 97253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 98931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void reset_context( struct setup_context *setup ) 99931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 1001caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell unsigned i, j; 1011caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell 102402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 103402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 1040718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Free binner command lists: 1050718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 106931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (i = 0; i < setup->tiles_x; i++) { 107931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (j = 0; j < setup->tiles_y; j++) { 1081caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct cmd_block_list *list = &setup->tile[i][j]; 109931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct cmd_block *block; 110931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct cmd_block *tmp; 111931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1121caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (block = list->head; block != list->tail; block = tmp) { 113931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell tmp = block->next; 114931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(block); 115931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 116931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1171caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell list->head = list->tail; 118931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 119931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 120e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 1210718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Free binned data: 1220718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 123931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell { 1241caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct data_block_list *list = &setup->data; 125931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct data_block *block, *tmp; 126931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1271caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (block = list->head; block != list->tail; block = tmp) { 128931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell tmp = block->next; 129931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(block); 130931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 131931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1321caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell list->head = list->tail; 133931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 1340718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 1350718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Reset some state: 1360718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 1370718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell setup->clear.flags = 0; 138253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 139253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Have an explicit "start-binning" call and get rid of this 140253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * pointer twiddling? 141253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 142253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line = first_line; 143253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point = first_point; 144253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle = first_triangle; 145931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 146931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 147931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 148931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 149931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 150931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Add a command to all active bins. 151931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */ 152931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void bin_everywhere( struct setup_context *setup, 1531caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell lp_rast_cmd cmd, 1544cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell const union lp_rast_cmd_arg arg ) 155e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{ 156931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned i, j; 157931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (i = 0; i < setup->tiles_x; i++) 158931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (j = 0; j < setup->tiles_y; j++) 159415b271b5100d64579690111bc8eb549866865a7Keith Whitwell bin_command( &setup->tile[i][j], cmd, arg ); 160e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell} 161e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 162931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 163931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 164931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellrasterize_bins( struct setup_context *setup, 165931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell boolean write_depth ) 166e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{ 1671caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct lp_rasterizer *rast = setup->rast; 1681caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct cmd_block *block; 1691caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell unsigned i,j,k; 1701caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell 171402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 172402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 17384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell lp_rast_begin( rast, 174e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell setup->fb.cbuf, 175e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell setup->fb.zsbuf, 176e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell setup->fb.cbuf != NULL, 177e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell setup->fb.zsbuf != NULL && write_depth, 17884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.width, 17984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.height ); 18084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell 181931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 182931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1831caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (i = 0; i < setup->tiles_x; i++) { 1841caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (j = 0; j < setup->tiles_y; j++) { 185931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 186931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_start_tile( rast, 187931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell i * TILESIZE, 188931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell j * TILESIZE ); 189931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1901caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (block = setup->tile[i][j].head; block; block = block->next) { 1911caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (k = 0; k < block->count; k++) { 1921caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell block->cmd[k]( rast, block->arg[k] ); 193931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 194931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 195931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1960718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell lp_rast_end_tile( rast ); 197931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 198931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 199931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 200e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell lp_rast_end( rast ); 201e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell 2021caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell reset_context( setup ); 203e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell} 204e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 205931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 206931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 207931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 208931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellbegin_binning( struct setup_context *setup ) 209e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{ 210402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 211402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 21284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell if (!setup->fb.cbuf && !setup->fb.zsbuf) { 21384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.width = 0; 21484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.height = 0; 21584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell } 21684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell else if (!setup->fb.zsbuf) { 21784ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.width = setup->fb.cbuf->width; 21884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.height = setup->fb.cbuf->height; 21984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell } 22084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell else if (!setup->fb.cbuf) { 22184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.width = setup->fb.zsbuf->width; 22284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.height = setup->fb.zsbuf->height; 22384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell } 22484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell else { 22584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell /* XXX: not sure what we're really supposed to do for 22684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell * mis-matched color & depth buffer sizes. 22784ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell */ 22884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.width = MIN2(setup->fb.cbuf->width, 22984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.zsbuf->width); 23084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.height = MIN2(setup->fb.cbuf->height, 23184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.zsbuf->height); 23284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell } 23384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell 234b0475a4b0d1eaa1179bc399301ed46b0b8e63497Keith Whitwell setup->tiles_x = align(setup->fb.width, TILESIZE) / TILESIZE; 235b0475a4b0d1eaa1179bc399301ed46b0b8e63497Keith Whitwell setup->tiles_y = align(setup->fb.height, TILESIZE) / TILESIZE; 23684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell 237253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell if (setup->fb.cbuf) { 2380718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_COLOR) 239931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell bin_everywhere( setup, 240931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_clear_color, 2414cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.color ); 242931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 2434cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell bin_everywhere( setup, lp_rast_load_color, lp_rast_arg_null() ); 244931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 245931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 246253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell if (setup->fb.zsbuf) { 2470718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 248931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell bin_everywhere( setup, 249931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_clear_zstencil, 2504cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.zstencil ); 251931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 2524cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell bin_everywhere( setup, lp_rast_load_zstencil, lp_rast_arg_null() ); 253931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 254e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell} 255e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 256e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 257931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen 258931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears. 259931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * 260931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles. 261946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 262931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 263931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellexecute_clears( struct setup_context *setup ) 264946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 265402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 266402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 267931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell begin_binning( setup ); 2680718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell rasterize_bins( setup, TRUE ); 269946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 270946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 271931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 272931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 273931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellset_state( struct setup_context *setup, 274931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned new_state ) 275931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 276931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned old_state = setup->state; 277931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 278931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == new_state) 279931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 280931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 281402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s old %d new %d\n", __FUNCTION__, old_state, new_state); 282402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 283931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell switch (new_state) { 284931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_ACTIVE: 285402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell begin_binning( setup ); 286931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 287931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 288931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_CLEARED: 289931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == SETUP_ACTIVE) { 290931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell assert(0); 291931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 292931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 293931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 294931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 295931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_FLUSHED: 2960718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (old_state == SETUP_CLEARED) 297931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell execute_clears( setup ); 298931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 2990718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell rasterize_bins( setup, TRUE ); 300931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 301931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 302931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 303931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->state = new_state; 304931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 305931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 306931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 307946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid 308931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_flush( struct setup_context *setup, 309931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 310946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 311402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 312402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 313931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_FLUSHED ); 314946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 315946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 316946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 317931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 318931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_bind_framebuffer( struct setup_context *setup, 319931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct pipe_surface *color, 320931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct pipe_surface *zstencil ) 321946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 322402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 323402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 324931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_FLUSHED ); 325931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 326253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell pipe_surface_reference( &setup->fb.cbuf, color ); 327253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell pipe_surface_reference( &setup->fb.zsbuf, zstencil ); 328931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 329931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 330931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 331931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_clear( struct setup_context *setup, 332253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float *color, 333253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell double depth, 334253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell unsigned stencil, 335931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 336931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 337659609e0ae27071a601794935c85547e315dedebJosé Fonseca unsigned i; 338659609e0ae27071a601794935c85547e315dedebJosé Fonseca 339402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s state %d\n", __FUNCTION__, setup->state); 340402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 341402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 3424cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_COLOR) { 343659609e0ae27071a601794935c85547e315dedebJosé Fonseca for (i = 0; i < 4; ++i) 344659609e0ae27071a601794935c85547e315dedebJosé Fonseca setup->clear.color.clear_color[i] = float_to_ubyte(color[i]); 3454cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell } 3464cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell 3474cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 3484cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.zstencil.clear_zstencil = 3494cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell util_pack_z_stencil(setup->fb.zsbuf->format, 3504cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell depth, 3514cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell stencil); 3524cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell } 3534cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell 354931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (setup->state == SETUP_ACTIVE) { 355253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Add the clear to existing bins. In the unusual case where 356253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * both color and depth-stencilare being cleared, we could 357253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * discard the currently binned scene and start again, but I 358253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * don't see that as being a common usage. 359253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 3604cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_COLOR) 3614cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell bin_everywhere( setup, 3624cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell lp_rast_clear_color, 3634cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.color ); 364253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 3654cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 3664cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell bin_everywhere( setup, 3674cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell lp_rast_clear_zstencil, 3684cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.zstencil ); 369946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 370946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 371253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Put ourselves into the 'pre-clear' state, specifically to try 372253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * and accumulate multiple clears to color and depth_stencil 373253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * buffers which the app or state-tracker might issue 374253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * separately. 375253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 376931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_CLEARED ); 3770718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 378931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->clear.flags |= flags; 379946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 380931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 381931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 382931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 383415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 384415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid 385e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwelllp_setup_set_triangle_state( struct setup_context *setup, 386e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell unsigned cull_mode, 387e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell boolean ccw_is_frontface) 388415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{ 389402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 390402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 391415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->ccw_is_frontface = ccw_is_frontface; 392415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->cullmode = cull_mode; 393415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->triangle = first_triangle; 394415b271b5100d64579690111bc8eb549866865a7Keith Whitwell} 395415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 396415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 397415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 398931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 399931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_set_fs_inputs( struct setup_context *setup, 400253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const struct lp_shader_input *input, 401931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned nr ) 402931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 403402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 404402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 405253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell memcpy( setup->fs.input, input, nr * sizeof input[0] ); 406253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->fs.nr_inputs = nr; 407931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 40889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell 4090718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid 410d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_fs( struct setup_context *setup, 411d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct lp_fragment_shader *fs ) 4120718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell{ 413402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 414d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: reference count */ 415d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 416d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_function = fs->current->jit_function; 4170718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell} 4180718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 419d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 420d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_fs_constants(struct setup_context *setup, 421d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_buffer *buffer) 422d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 423d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca const void *data = buffer ? llvmpipe_buffer(buffer)->data : NULL; 424d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_buffer *dummy; 425931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 426402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 427402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 428d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: hold on to the reference */ 429d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca dummy = NULL; 430d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca pipe_buffer_reference(&dummy, buffer); 431931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 432d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context.constants = data; 433d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 434d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context_dirty = TRUE; 435d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 436d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 437d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 438d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 439d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_alpha_ref_value( struct setup_context *setup, 440d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca float alpha_ref_value ) 441d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 442402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 443402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 444d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca if(setup->fs.jit_context.alpha_ref_value != alpha_ref_value) { 445d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context.alpha_ref_value = alpha_ref_value; 446d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context_dirty = TRUE; 447d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 448d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 449d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 450d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 451d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_blend_color( struct setup_context *setup, 452d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca const struct pipe_blend_color *blend_color ) 453d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 454d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca unsigned i, j; 455d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 456402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 457402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 458d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca if(!setup->fs.jit_context.blend_color) 459d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context.blend_color = align_malloc(4 * 16, 16); 460d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 461d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca for (i = 0; i < 4; ++i) { 462d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca uint8_t c = float_to_ubyte(blend_color->color[i]); 463d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca for (j = 0; j < 16; ++j) 464d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context.blend_color[i*4 + j] = c; 465d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 466d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 467d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context_dirty = TRUE; 468d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 469d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 470d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 471d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_sampler_textures( struct setup_context *setup, 472d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca unsigned num, struct pipe_texture **texture) 473d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 474d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_texture *dummy; 475d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca unsigned i; 476d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 477402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 478402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 479402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 480d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca assert(num <= PIPE_MAX_SAMPLERS); 481d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 482d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { 483d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_texture *tex = i < num ? texture[i] : NULL; 484d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 485d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: hold on to the reference */ 486d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca dummy = NULL; 487d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca pipe_texture_reference(&dummy, tex); 488d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 489d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca if(tex) { 490d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct llvmpipe_texture *lp_tex = llvmpipe_texture(tex); 491d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct lp_jit_texture *jit_tex = &setup->fs.jit_context.textures[i]; 492d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->width = tex->width[0]; 493d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->height = tex->height[0]; 494d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->stride = lp_tex->stride[0]; 495d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca if(!lp_tex->dt) 496d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->data = lp_tex->data; 497d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca else 498d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: map the rendertarget */ 499d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca assert(0); 500d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 501d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 502d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 503d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context_dirty = TRUE; 504d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 505d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 506c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonsecaboolean 507c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonsecalp_setup_is_texture_referenced( struct setup_context *setup, 508c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca const struct pipe_texture *texture ) 509c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca{ 510c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca /* FIXME */ 511c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca return PIPE_UNREFERENCED; 512c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca} 513c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca 514c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca 515608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonsecastatic INLINE void 516608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonsecalp_setup_update_shader_state( struct setup_context *setup ) 517608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca{ 518402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 519608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 520608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca if(setup->fs.jit_context_dirty) { 521608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca if(!setup->fs.last_jc || 522608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca memcmp(setup->fs.last_jc, &setup->fs.jit_context, sizeof *setup->fs.last_jc)) { 523608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca struct lp_jit_context *jc; 524608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 525608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca jc = get_data(&setup->data, sizeof *jc); 526608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca if(jc) { 527608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca memcpy(jc, &setup->fs.jit_context, sizeof *jc); 528608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca setup->fs.last_jc = jc; 529608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca } 530608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca } 531608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 532608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca setup->fs.jit_context_dirty = FALSE; 533608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca } 534608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 535608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca assert(setup->fs.last_jc); 536608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca} 537608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 538608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 539931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Stubs for lines & points for now: 540931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */ 541931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 542931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_point(struct setup_context *setup, 543931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v0)[4]) 544931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 545608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca lp_setup_update_shader_state(setup); 546931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->point( setup, v0 ); 547946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 548946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 549931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 550931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_line(struct setup_context *setup, 551931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v0)[4], 552931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v1)[4]) 553931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 554608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca lp_setup_update_shader_state(setup); 555931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->line( setup, v0, v1 ); 556931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 557931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 558931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 5590718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwelllp_setup_tri(struct setup_context *setup, 5600718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v0)[4], 5610718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v1)[4], 5620718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v2)[4]) 563931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 564402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell SETUP_DEBUG("%s\n", __FUNCTION__); 565402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 566608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca lp_setup_update_shader_state(setup); 567931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 568931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 569946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 570946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 571253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid 572253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwelllp_setup_destroy( struct setup_context *setup ) 573946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 574415b271b5100d64579690111bc8eb549866865a7Keith Whitwell unsigned i, j; 575415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 576415b271b5100d64579690111bc8eb549866865a7Keith Whitwell reset_context( setup ); 577415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 578415b271b5100d64579690111bc8eb549866865a7Keith Whitwell for (i = 0; i < TILES_X; i++) 579415b271b5100d64579690111bc8eb549866865a7Keith Whitwell for (j = 0; j < TILES_Y; j++) 580415b271b5100d64579690111bc8eb549866865a7Keith Whitwell FREE(setup->tile[i][j].head); 581415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 582931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_destroy( setup->rast ); 58389498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell FREE( setup ); 584946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 585946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 586946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 587946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 588931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Create a new primitive tiling engine. Currently also creates a 589931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * rasterizer to use with it. 590946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 591253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstruct setup_context * 592e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwelllp_setup_create( struct pipe_screen *screen ) 593946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 59489498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell struct setup_context *setup = CALLOC_STRUCT(setup_context); 595253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell unsigned i, j; 596946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 597e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell setup->rast = lp_rast_create( screen ); 598931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (!setup->rast) 599931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell goto fail; 600931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 601931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (i = 0; i < TILES_X; i++) 602931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (j = 0; j < TILES_Y; j++) 603253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->tile[i][j].head = 604253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->tile[i][j].tail = CALLOC_STRUCT(cmd_block); 605946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 606082b3b0a895615a60a7eae40fea14bf231960dbaKeith Whitwell setup->data.head = 607082b3b0a895615a60a7eae40fea14bf231960dbaKeith Whitwell setup->data.tail = CALLOC_STRUCT(data_block); 608082b3b0a895615a60a7eae40fea14bf231960dbaKeith Whitwell 609163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->triangle = first_triangle; 610163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->line = first_line; 611163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->point = first_point; 612163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell 613946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca return setup; 614931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 615931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfail: 616931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(setup); 617931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return NULL; 618946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 619946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 620