lp_setup.c revision b0475a4b0d1eaa1179bc399301ed46b0b8e63497
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 45253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void set_state( struct setup_context *, unsigned ); 46946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 47931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_cmd_block( struct cmd_block_list *list ) 48931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 49931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct cmd_block *block = MALLOC_STRUCT(cmd_block); 50931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail->next = block; 51931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail = block; 52931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->next = NULL; 53931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->count = 0; 54931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 55946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 56931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_data_block( struct data_block_list *list ) 57931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 58931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct data_block *block = MALLOC_STRUCT(data_block); 59931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail->next = block; 60931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell list->tail = block; 61931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->next = NULL; 62931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell block->used = 0; 63931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 64946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 65253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 66253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 67253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_triangle( struct setup_context *setup, 68253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 69253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4], 70253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v2)[4]) 71253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 72253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell set_state( setup, SETUP_ACTIVE ); 73253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_triangle( setup ); 74253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 75253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 76253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 77253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 78253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_line( struct setup_context *setup, 79253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 80253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4]) 81253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 82253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell set_state( setup, SETUP_ACTIVE ); 83253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_line( setup ); 84253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line( setup, v0, v1 ); 85253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 86253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 87253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 88253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_point( struct setup_context *setup, 89253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4]) 90253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 91253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell set_state( setup, SETUP_ACTIVE ); 92253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_point( setup ); 93253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point( setup, v0 ); 94253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 95253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 96931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void reset_context( struct setup_context *setup ) 97931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 981caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell unsigned i, j; 991caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell 1000718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Free binner command lists: 1010718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 102931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (i = 0; i < setup->tiles_x; i++) { 103931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (j = 0; j < setup->tiles_y; j++) { 1041caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct cmd_block_list *list = &setup->tile[i][j]; 105931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct cmd_block *block; 106931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct cmd_block *tmp; 107931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1081caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (block = list->head; block != list->tail; block = tmp) { 109931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell tmp = block->next; 110931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(block); 111931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 112931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1131caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell list->head = list->tail; 114931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 115931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 116e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 1170718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Free binned data: 1180718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 119931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell { 1201caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct data_block_list *list = &setup->data; 121931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct data_block *block, *tmp; 122931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1231caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (block = list->head; block != list->tail; block = tmp) { 124931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell tmp = block->next; 125931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(block); 126931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 127931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1281caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell list->head = list->tail; 129931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 1300718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 1310718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Reset some state: 1320718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 1330718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell setup->clear.flags = 0; 134253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 135253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Have an explicit "start-binning" call and get rid of this 136253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * pointer twiddling? 137253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 138253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line = first_line; 139253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point = first_point; 140253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle = first_triangle; 141931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 142931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 143931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 144931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 145931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 146931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Add a command to all active bins. 147931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */ 148931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void bin_everywhere( struct setup_context *setup, 1491caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell lp_rast_cmd cmd, 1504cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell const union lp_rast_cmd_arg arg ) 151e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{ 152931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned i, j; 153931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (i = 0; i < setup->tiles_x; i++) 154931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (j = 0; j < setup->tiles_y; j++) 155415b271b5100d64579690111bc8eb549866865a7Keith Whitwell bin_command( &setup->tile[i][j], cmd, arg ); 156e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell} 157e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 158931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 159931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 160931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellrasterize_bins( struct setup_context *setup, 161931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell boolean write_depth ) 162e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{ 1631caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct lp_rasterizer *rast = setup->rast; 1641caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell struct cmd_block *block; 1651caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell unsigned i,j,k; 1661caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell 16784ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell if (setup->state != SETUP_ACTIVE) { 16884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell /* this can happen, not a big deal */ 16984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell debug_printf("%s called when not binning\n", __FUNCTION__); 17084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell return; 17184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell } 17284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell 17384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell lp_rast_begin( rast, 17484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.width, 17584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.height ); 17684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell 177931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_bind_color( rast, 178253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->fb.cbuf, 17984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.cbuf != NULL ); 180931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 18184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell lp_rast_bind_zstencil( rast, 18284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.zsbuf, 18384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.zsbuf != NULL && write_depth ); 184931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1851caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (i = 0; i < setup->tiles_x; i++) { 1861caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (j = 0; j < setup->tiles_y; j++) { 187931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 188931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_start_tile( rast, 189931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell i * TILESIZE, 190931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell j * TILESIZE ); 191931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1921caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (block = setup->tile[i][j].head; block; block = block->next) { 1931caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell for (k = 0; k < block->count; k++) { 1941caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell block->cmd[k]( rast, block->arg[k] ); 195931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 196931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 197931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1980718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell lp_rast_end_tile( rast ); 199931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 200931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 201931210424bc46b2c13919f0ac3e0ef781eff207eKeith 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{ 21084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell if (!setup->fb.cbuf && !setup->fb.zsbuf) { 21184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.width = 0; 21284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.height = 0; 21384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell } 21484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell else if (!setup->fb.zsbuf) { 21584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.width = setup->fb.cbuf->width; 21684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.height = setup->fb.cbuf->height; 21784ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell } 21884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell else if (!setup->fb.cbuf) { 21984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.width = setup->fb.zsbuf->width; 22084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.height = setup->fb.zsbuf->height; 22184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell } 22284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell else { 22384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell /* XXX: not sure what we're really supposed to do for 22484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell * mis-matched color & depth buffer sizes. 22584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell */ 22684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.width = MIN2(setup->fb.cbuf->width, 22784ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.zsbuf->width); 22884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.height = MIN2(setup->fb.cbuf->height, 22984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell setup->fb.zsbuf->height); 23084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell } 23184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell 232b0475a4b0d1eaa1179bc399301ed46b0b8e63497Keith Whitwell setup->tiles_x = align(setup->fb.width, TILESIZE) / TILESIZE; 233b0475a4b0d1eaa1179bc399301ed46b0b8e63497Keith Whitwell setup->tiles_y = align(setup->fb.height, TILESIZE) / TILESIZE; 23484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell 235253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell if (setup->fb.cbuf) { 2360718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_COLOR) 237931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell bin_everywhere( setup, 238931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_clear_color, 2394cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.color ); 240931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 2414cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell bin_everywhere( setup, lp_rast_load_color, lp_rast_arg_null() ); 242931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 243931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 244253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell if (setup->fb.zsbuf) { 2450718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 246931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell bin_everywhere( setup, 247931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_clear_zstencil, 2484cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.zstencil ); 249931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 2504cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell bin_everywhere( setup, lp_rast_load_zstencil, lp_rast_arg_null() ); 251931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 252e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell} 253e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 254e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 255931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen 256931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears. 257931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * 258931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles. 259946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 260931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 261931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellexecute_clears( struct setup_context *setup ) 262946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 263931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell begin_binning( setup ); 2640718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell rasterize_bins( setup, TRUE ); 265946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 266946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 267931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 268931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 269931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellset_state( struct setup_context *setup, 270931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned new_state ) 271931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 272931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned old_state = setup->state; 273931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 274931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == new_state) 275931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 276931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 277931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell switch (new_state) { 278931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_ACTIVE: 279931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == SETUP_FLUSHED) 2800718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell begin_binning( setup ); 281931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 282931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 283931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_CLEARED: 284931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == SETUP_ACTIVE) { 285931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell assert(0); 286931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 287931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 288931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 289931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 290931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_FLUSHED: 2910718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (old_state == SETUP_CLEARED) 292931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell execute_clears( setup ); 293931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 2940718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell rasterize_bins( setup, TRUE ); 295931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 296931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 297931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 298931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->state = new_state; 299931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 300931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 301931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 302946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid 303931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_flush( struct setup_context *setup, 304931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 305946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 306931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_FLUSHED ); 307946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 308946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 309946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 310931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 311931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_bind_framebuffer( struct setup_context *setup, 312931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct pipe_surface *color, 313931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell struct pipe_surface *zstencil ) 314946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 315931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_FLUSHED ); 316931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 317253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell pipe_surface_reference( &setup->fb.cbuf, color ); 318253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell pipe_surface_reference( &setup->fb.zsbuf, zstencil ); 319931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 320931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 321931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 322931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_clear( struct setup_context *setup, 323253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float *color, 324253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell double depth, 325253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell unsigned stencil, 326931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 327931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 3284cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_COLOR) { 3294cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell util_pack_color(color, 3304cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->fb.cbuf->format, 3314cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell &setup->clear.color.clear_color ); 3324cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell } 3334cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell 3344cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 3354cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.zstencil.clear_zstencil = 3364cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell util_pack_z_stencil(setup->fb.zsbuf->format, 3374cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell depth, 3384cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell stencil); 3394cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell } 3404cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell 341931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (setup->state == SETUP_ACTIVE) { 342253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Add the clear to existing bins. In the unusual case where 343253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * both color and depth-stencilare being cleared, we could 344253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * discard the currently binned scene and start again, but I 345253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * don't see that as being a common usage. 346253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 3474cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_COLOR) 3484cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell bin_everywhere( setup, 3494cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell lp_rast_clear_color, 3504cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.color ); 351253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 3524cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 3534cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell bin_everywhere( setup, 3544cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell lp_rast_clear_zstencil, 3554cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.zstencil ); 356946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 357946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 358253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Put ourselves into the 'pre-clear' state, specifically to try 359253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * and accumulate multiple clears to color and depth_stencil 360253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * buffers which the app or state-tracker might issue 361253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * separately. 362253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 363931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_CLEARED ); 3640718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 365931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->clear.flags |= flags; 366946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 367931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 368931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 369931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 370415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 371415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid 372e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwelllp_setup_set_triangle_state( struct setup_context *setup, 373e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell unsigned cull_mode, 374e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell boolean ccw_is_frontface) 375415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{ 376415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->ccw_is_frontface = ccw_is_frontface; 377415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->cullmode = cull_mode; 378415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->triangle = first_triangle; 379415b271b5100d64579690111bc8eb549866865a7Keith Whitwell} 380415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 381415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 382415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 383931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 384931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_set_fs_inputs( struct setup_context *setup, 385253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const struct lp_shader_input *input, 386931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned nr ) 387931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 388253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell memcpy( setup->fs.input, input, nr * sizeof input[0] ); 389253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->fs.nr_inputs = nr; 390931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 39189498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell 3920718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid 393d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_fs( struct setup_context *setup, 394d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct lp_fragment_shader *fs ) 3950718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell{ 396d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: reference count */ 397d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 398d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_function = fs->current->jit_function; 3990718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell} 4000718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 401d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 402d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_fs_constants(struct setup_context *setup, 403d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_buffer *buffer) 404d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 405d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca const void *data = buffer ? llvmpipe_buffer(buffer)->data : NULL; 406d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_buffer *dummy; 407931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 408d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: hold on to the reference */ 409d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca dummy = NULL; 410d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca pipe_buffer_reference(&dummy, buffer); 411931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 412d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context.constants = data; 413d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 414d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context_dirty = TRUE; 415d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 416d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 417d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 418d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 419d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_alpha_ref_value( struct setup_context *setup, 420d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca float alpha_ref_value ) 421d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 422d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca if(setup->fs.jit_context.alpha_ref_value != alpha_ref_value) { 423d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context.alpha_ref_value = alpha_ref_value; 424d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context_dirty = TRUE; 425d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 426d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 427d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 428d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 429d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_blend_color( struct setup_context *setup, 430d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca const struct pipe_blend_color *blend_color ) 431d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 432d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca unsigned i, j; 433d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 434d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca if(!setup->fs.jit_context.blend_color) 435d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context.blend_color = align_malloc(4 * 16, 16); 436d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 437d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca for (i = 0; i < 4; ++i) { 438d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca uint8_t c = float_to_ubyte(blend_color->color[i]); 439d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca for (j = 0; j < 16; ++j) 440d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context.blend_color[i*4 + j] = c; 441d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 442d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 443d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context_dirty = TRUE; 444d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 445d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 446d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 447d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_sampler_textures( struct setup_context *setup, 448d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca unsigned num, struct pipe_texture **texture) 449d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 450d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_texture *dummy; 451d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca unsigned i; 452d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 453d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca assert(num <= PIPE_MAX_SAMPLERS); 454d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 455d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { 456d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_texture *tex = i < num ? texture[i] : NULL; 457d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 458d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: hold on to the reference */ 459d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca dummy = NULL; 460d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca pipe_texture_reference(&dummy, tex); 461d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 462d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca if(tex) { 463d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct llvmpipe_texture *lp_tex = llvmpipe_texture(tex); 464d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct lp_jit_texture *jit_tex = &setup->fs.jit_context.textures[i]; 465d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->width = tex->width[0]; 466d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->height = tex->height[0]; 467d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->stride = lp_tex->stride[0]; 468d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca if(!lp_tex->dt) 469d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->data = lp_tex->data; 470d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca else 471d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: map the rendertarget */ 472d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca assert(0); 473d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 474d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 475d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 476d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca setup->fs.jit_context_dirty = TRUE; 477d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 478d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 479c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonsecaboolean 480c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonsecalp_setup_is_texture_referenced( struct setup_context *setup, 481c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca const struct pipe_texture *texture ) 482c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca{ 483c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca /* FIXME */ 484c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca return PIPE_UNREFERENCED; 485c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca} 486c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca 487c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca 488931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Stubs for lines & points for now: 489931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */ 490931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 491931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_point(struct setup_context *setup, 492931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v0)[4]) 493931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 494931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->point( setup, v0 ); 495946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 496946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 497931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 498931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_line(struct setup_context *setup, 499931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v0)[4], 500931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v1)[4]) 501931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 502931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->line( setup, v0, v1 ); 503931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 504931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 505931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 5060718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwelllp_setup_tri(struct setup_context *setup, 5070718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v0)[4], 5080718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v1)[4], 5090718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v2)[4]) 510931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 511931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 512931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 513946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 514946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 515253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid 516253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwelllp_setup_destroy( struct setup_context *setup ) 517946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 518415b271b5100d64579690111bc8eb549866865a7Keith Whitwell unsigned i, j; 519415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 520415b271b5100d64579690111bc8eb549866865a7Keith Whitwell reset_context( setup ); 521415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 522415b271b5100d64579690111bc8eb549866865a7Keith Whitwell for (i = 0; i < TILES_X; i++) 523415b271b5100d64579690111bc8eb549866865a7Keith Whitwell for (j = 0; j < TILES_Y; j++) 524415b271b5100d64579690111bc8eb549866865a7Keith Whitwell FREE(setup->tile[i][j].head); 525415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 526931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_destroy( setup->rast ); 52789498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell FREE( setup ); 528946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 529946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 530946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 531946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 532931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Create a new primitive tiling engine. Currently also creates a 533931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * rasterizer to use with it. 534946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 535253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstruct setup_context * 536253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwelllp_setup_create( void ) 537946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 53889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell struct setup_context *setup = CALLOC_STRUCT(setup_context); 539253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell unsigned i, j; 540946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 541253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->rast = lp_rast_create(); 542931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (!setup->rast) 543931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell goto fail; 544931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 545931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (i = 0; i < TILES_X; i++) 546931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell for (j = 0; j < TILES_Y; j++) 547253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->tile[i][j].head = 548253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->tile[i][j].tail = CALLOC_STRUCT(cmd_block); 549946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 550946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca return setup; 551931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 552931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfail: 553931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(setup); 554931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return NULL; 555946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 556946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 557