lp_setup.c revision 2ad8692aad0f4ad49643d5f697a036afccdeb9f0
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" 36a1af8eec66c5f7ec421e8011b41c1a7c36319f9fJosé Fonseca#include "util/u_inlines.h" 37946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h" 38253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell#include "util/u_pack_color.h" 397f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell#include "util/u_surface.h" 40663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#include "lp_scene.h" 41663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#include "lp_scene_queue.h" 42d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_buffer.h" 43d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_texture.h" 445ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_debug.h" 455ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_fence.h" 465ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_rast.h" 47d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_setup_context.h" 48b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca#include "lp_screen.h" 4923e951d0da5802fec70996e46ad6f0abc411594cKeith Whitwell#include "state_tracker/sw_winsys.h" 50946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 515ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_context.h" 525ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_vbuf.h" 5380eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 54677a055fa0cf7b6476c716be187513c41060d417José Fonseca 553160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastatic void set_scene_state( struct lp_setup_context *, unsigned ); 56946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 57946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 58663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwellstruct lp_scene * 593160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_get_current_scene(struct lp_setup_context *setup) 6022b07b8be4c2939b00e10f17fa91e68682808594Brian Paul{ 61663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell if (!setup->scene) { 62946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 63591401ff05f878ff1607a1a34db1319103025d8fKeith Whitwell /* wait for a free/empty scene 64591401ff05f878ff1607a1a34db1319103025d8fKeith Whitwell */ 65591401ff05f878ff1607a1a34db1319103025d8fKeith Whitwell setup->scene = lp_scene_dequeue(setup->empty_scenes, TRUE); 66946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 67049b4c340575ebc788d9a009829980fafa587effBrian Paul assert(lp_scene_is_empty(setup->scene)); 68946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 695fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell lp_scene_begin_binning(setup->scene, 705fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell &setup->fb ); 713bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul } 72663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell return setup->scene; 7322b07b8be4c2939b00e10f17fa91e68682808594Brian Paul} 74946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 75946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 764d2b0eb19e432f83845a55d552b5d1d61f040459José Fonsecastatic void 773160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_triangle( struct lp_setup_context *setup, 78253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 79253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4], 80253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v2)[4]) 814d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca{ 825ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_ACTIVE ); 83253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_triangle( setup ); 84253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 85253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 864d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 87253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 883160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_line( struct lp_setup_context *setup, 89253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 90253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4]) 91253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 925ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_ACTIVE ); 93253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_line( setup ); 94253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line( setup, v0, v1 ); 954d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca} 964d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 97253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 983160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_point( struct lp_setup_context *setup, 99253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4]) 100253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 1015ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_ACTIVE ); 102253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_point( setup ); 103253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point( setup, v0 ); 104253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 1054d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 1063160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastatic void reset_context( struct lp_setup_context *setup ) 107931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 108a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 1094d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 110301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca /* Reset derived state */ 1112e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = 0; 1122e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = NULL; 113301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca setup->fs.stored = NULL; 114f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty = ~0; 115946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1163bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul /* no current bin */ 117663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell setup->scene = NULL; 118946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1190718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Reset some state: 1200718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 1210718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell setup->clear.flags = 0; 122946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 123253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Have an explicit "start-binning" call and get rid of this 124253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * pointer twiddling? 125946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 126253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line = first_line; 127253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point = first_point; 128253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle = first_triangle; 129946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 130946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 131946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 132663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell/** Rasterize all scene's bins */ 133931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 1343160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_rasterize_scene( struct lp_setup_context *setup, 1355fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell boolean write_depth ) 136946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 137663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene *scene = lp_setup_get_current_scene(setup); 138946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1395fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell lp_scene_rasterize(scene, 1405fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell setup->rast, 1417f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell write_depth); 142946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1431caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell reset_context( setup ); 144946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 145a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__); 14680eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell} 14780eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 148931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 149931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 150931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 1513160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecabegin_binning( struct lp_setup_context *setup ) 15280eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell{ 153663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene *scene = lp_setup_get_current_scene(setup); 15422b07b8be4c2939b00e10f17fa91e68682808594Brian Paul 155da45f49cc63fff06513dc28d9616084fc81798d4Keith Whitwell LP_DBG(DEBUG_SETUP, "%s color: %s depth: %s\n", __FUNCTION__, 156da45f49cc63fff06513dc28d9616084fc81798d4Keith Whitwell (setup->clear.flags & PIPE_CLEAR_COLOR) ? "clear": "load", 157da45f49cc63fff06513dc28d9616084fc81798d4Keith Whitwell (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) ? "clear": "load"); 158402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 159c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell if (setup->fb.nr_cbufs) { 1600718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_COLOR) 161663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_bin_everywhere( scene, 162c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell lp_rast_clear_color, 163c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell setup->clear.color ); 164931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 165663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_bin_everywhere( scene, 166c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell lp_rast_load_color, 167c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell lp_rast_arg_null() ); 168931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 169931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1707f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell if (setup->fb.zsbuf) { 1710718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 172663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_bin_everywhere( scene, 173c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell lp_rast_clear_zstencil, 174c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell setup->clear.zstencil ); 175931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 1763094fc200920f9d5eb62136d3b25896229fb0dbfBrian Paul 177a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s done\n", __FUNCTION__); 178946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 179946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 180946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 181931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen 182931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears. 183931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * 184931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles. 185b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca */ 186931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 1873160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaexecute_clears( struct lp_setup_context *setup ) 188b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca{ 189a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 190b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 191931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell begin_binning( setup ); 192663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_setup_rasterize_scene( setup, TRUE ); 193b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca} 194b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 195b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 196931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 1973160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaset_scene_state( struct lp_setup_context *setup, 198931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned new_state ) 199946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 200931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned old_state = setup->state; 20180eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 202931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == new_state) 203931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 204931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 205a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s old %d new %d\n", __FUNCTION__, old_state, new_state); 206402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 207931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell switch (new_state) { 208931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_ACTIVE: 209402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell begin_binning( setup ); 210931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 211931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 212931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_CLEARED: 213931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == SETUP_ACTIVE) { 214931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell assert(0); 215931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 21608811032c2dd8f38d2ef65d7fd8794112e029b63Keith Whitwell } 217931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 218931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 219931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_FLUSHED: 2200718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (old_state == SETUP_CLEARED) 221931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell execute_clears( setup ); 222931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 223663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_setup_rasterize_scene( setup, TRUE ); 224931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 225946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 226946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 227931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->state = new_state; 228946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 229946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 230946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 231946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid 2323160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_flush( struct lp_setup_context *setup, 233931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 234946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 235a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 236402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 2375ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_FLUSHED ); 238946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 239946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 240946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 241931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 2423160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_bind_framebuffer( struct lp_setup_context *setup, 2439fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul const struct pipe_framebuffer_state *fb ) 244946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 245a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 246946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 2475fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /* Flush any old scene. 2485fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 2495ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_FLUSHED ); 250677a055fa0cf7b6476c716be187513c41060d417José Fonseca 2515fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /* Set new state. This will be picked up later when we next need a 2525fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell * scene. 2535fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 2547f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell util_copy_framebuffer_state(&setup->fb, fb); 255946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 256946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 257946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 258931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 2593160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_clear( struct lp_setup_context *setup, 260253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float *color, 261253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell double depth, 262253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell unsigned stencil, 263931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 26417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{ 265663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene *scene = lp_setup_get_current_scene(setup); 266659609e0ae27071a601794935c85547e315dedebJosé Fonseca unsigned i; 26717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 268a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state); 26917aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 27017aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 2714cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_COLOR) { 272659609e0ae27071a601794935c85547e315dedebJosé Fonseca for (i = 0; i < 4; ++i) 273659609e0ae27071a601794935c85547e315dedebJosé Fonseca setup->clear.color.clear_color[i] = float_to_ubyte(color[i]); 27417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 27517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 2764cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 2774cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.zstencil.clear_zstencil = 2787f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell util_pack_z_stencil(setup->fb.zsbuf->format, 2794cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell depth, 2804cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell stencil); 28117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 28217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 283931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (setup->state == SETUP_ACTIVE) { 284663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* Add the clear to existing scene. In the unusual case where 2859a6567f1ed88727545f747e8670b713f17627c94Brian Paul * both color and depth-stencil are being cleared when there's 2869a6567f1ed88727545f747e8670b713f17627c94Brian Paul * already been some rendering, we could discard the currently 2879a6567f1ed88727545f747e8670b713f17627c94Brian Paul * binned scene and start again, but I don't see that as being 2889a6567f1ed88727545f747e8670b713f17627c94Brian Paul * a common usage. 289253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 2904cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_COLOR) 291663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_bin_everywhere( scene, 2920b279c5382da021a71cdc8ed3afa09983817539cBrian Paul lp_rast_clear_color, 2930b279c5382da021a71cdc8ed3afa09983817539cBrian Paul setup->clear.color ); 29417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 2954cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 296663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_bin_everywhere( scene, 2970b279c5382da021a71cdc8ed3afa09983817539cBrian Paul lp_rast_clear_zstencil, 2980b279c5382da021a71cdc8ed3afa09983817539cBrian Paul setup->clear.zstencil ); 299946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 300946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 301253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Put ourselves into the 'pre-clear' state, specifically to try 302253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * and accumulate multiple clears to color and depth_stencil 303253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * buffers which the app or state-tracker might issue 304253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * separately. 30517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca */ 3065ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_CLEARED ); 3070718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 308931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->clear.flags |= flags; 30917aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 310946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 311946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 312946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 313946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 3146cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul * Emit a fence. 315946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 3166cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paulstruct pipe_fence_handle * 3173160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_fence( struct lp_setup_context *setup ) 318946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 319663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene *scene = lp_setup_get_current_scene(setup); 320663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell const unsigned rank = lp_scene_get_num_bins( scene ); /* xxx */ 3216cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul struct lp_fence *fence = lp_fence_create(rank); 322946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3236cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul LP_DBG(DEBUG_SETUP, "%s rank %u\n", __FUNCTION__, rank); 324946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3255ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_ACTIVE ); 326946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3276cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul /* insert the fence into all command bins */ 328663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_bin_everywhere( scene, 329663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_rast_fence, 330663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_rast_arg_fence(fence) ); 331946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3326cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul return (struct pipe_fence_handle *) fence; 3336cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul} 334946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 335946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 336415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid 3373160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_triangle_state( struct lp_setup_context *setup, 338e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell unsigned cull_mode, 339fdfe06ad804ea13e6e436d66c1bcafe0bde2f545Brian Paul boolean ccw_is_frontface, 340a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca boolean scissor, 341a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca boolean gl_rasterization_rules) 342415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{ 343a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 344946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 345415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->ccw_is_frontface = ccw_is_frontface; 346415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->cullmode = cull_mode; 347415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->triangle = first_triangle; 348fdfe06ad804ea13e6e436d66c1bcafe0bde2f545Brian Paul setup->scissor_test = scissor; 349a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca setup->pixel_offset = gl_rasterization_rules ? 0.5f : 0.0f; 350946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 351946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 352946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 353946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 354931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 3553160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_inputs( struct lp_setup_context *setup, 356253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const struct lp_shader_input *input, 357931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned nr ) 358946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 359a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %p %u\n", __FUNCTION__, (void *) input, nr); 360946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 361253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell memcpy( setup->fs.input, input, nr * sizeof input[0] ); 362253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->fs.nr_inputs = nr; 363931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 364946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3650718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid 3663160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_functions( struct lp_setup_context *setup, 3672797f2bf57562c95a601a67edca3089641215cc4Brian Paul lp_jit_frag_func jit_function0, 3682797f2bf57562c95a601a67edca3089641215cc4Brian Paul lp_jit_frag_func jit_function1, 3692797f2bf57562c95a601a67edca3089641215cc4Brian Paul boolean opaque ) 370946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 3712797f2bf57562c95a601a67edca3089641215cc4Brian Paul LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) jit_function0); 372d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: reference count */ 373946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3742797f2bf57562c95a601a67edca3089641215cc4Brian Paul setup->fs.current.jit_function[0] = jit_function0; 3752797f2bf57562c95a601a67edca3089641215cc4Brian Paul setup->fs.current.jit_function[1] = jit_function1; 376a1acbff299c444913418e65da473745cd901a2dbJosé Fonseca setup->fs.current.opaque = opaque; 3770e042bed49c51fef38b02b7cc05efa504f2f703dBrian Paul setup->dirty |= LP_SETUP_NEW_FS; 378946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 379946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 380d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 3813160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_constants(struct lp_setup_context *setup, 382d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_buffer *buffer) 383946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 384a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) buffer); 385402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 3862e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca pipe_buffer_reference(&setup->constants.current, buffer); 387931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 3882e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_CONSTANTS; 389946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 390946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 391946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 392d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 3933160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_alpha_ref_value( struct lp_setup_context *setup, 394d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca float alpha_ref_value ) 395946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 396a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %f\n", __FUNCTION__, alpha_ref_value); 397946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 39885999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) { 39985999695829823e459e11822b4846ed1db5c055dJosé Fonseca setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value; 4002e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 401d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 402d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 403946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 404d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 405eee51147979208feffdf37c588ebbce4df6b40d6Brian Paullp_setup_set_stencil_ref_values( struct lp_setup_context *setup, 406eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul const ubyte refs[2] ) 407eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul{ 408eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul LP_DBG(DEBUG_SETUP, "%s %d %d\n", __FUNCTION__, refs[0], refs[1]); 409eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul 410521c61ff017ab15b829abbe9a98b179136a36009Brian Paul if (setup->fs.current.jit_context.stencil_ref_front != refs[0] || 411521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_back != refs[1]) { 412521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_front = refs[0]; 413521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_back = refs[1]; 414eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul setup->dirty |= LP_SETUP_NEW_FS; 415eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul } 416eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul} 417eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul 418eee51147979208feffdf37c588ebbce4df6b40d6Brian Paulvoid 4193160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_blend_color( struct lp_setup_context *setup, 420d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca const struct pipe_blend_color *blend_color ) 421d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 422a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 423946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 424f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca assert(blend_color); 425946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 426f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) { 427f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color); 428f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty |= LP_SETUP_NEW_BLEND_COLOR; 429d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 430d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 431946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 432946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 4334461442849bfdb817334b38567136f7f9dabdf59Brian Paulvoid 4343160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_scissor( struct lp_setup_context *setup, 4354461442849bfdb817334b38567136f7f9dabdf59Brian Paul const struct pipe_scissor_state *scissor ) 4364461442849bfdb817334b38567136f7f9dabdf59Brian Paul{ 4374461442849bfdb817334b38567136f7f9dabdf59Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 438946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 4394461442849bfdb817334b38567136f7f9dabdf59Brian Paul assert(scissor); 440946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 4414461442849bfdb817334b38567136f7f9dabdf59Brian Paul if (memcmp(&setup->scissor.current, scissor, sizeof(*scissor)) != 0) { 4424461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->scissor.current = *scissor; /* struct copy */ 4434461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->dirty |= LP_SETUP_NEW_SCISSOR; 444946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 445946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 446946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 447946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 4485ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid 4493160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_flatshade_first( struct lp_setup_context *setup, 4505ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell boolean flatshade_first ) 451946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 4525ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->flatshade_first = flatshade_first; 45317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca} 45417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 45517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 4565ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid 4573160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_vertex_info( struct lp_setup_context *setup, 4585ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell struct vertex_info *vertex_info ) 45917aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{ 4605ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell /* XXX: just silently holding onto the pointer: 4615ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell */ 4625ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->vertex_info = vertex_info; 463946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 464946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 465946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 466946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 4671fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol * Called during state validation when LP_NEW_SAMPLER_VIEW is set. 468946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 469d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 47047bfbd452c93e6a8db013fb90d9f42210cf24889Keith Whitwelllp_setup_set_fragment_sampler_views(struct lp_setup_context *setup, 4711fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol unsigned num, 4721fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol struct pipe_sampler_view **views) 473946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 47417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca unsigned i; 475d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 476a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 477402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 478d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca assert(num <= PIPE_MAX_SAMPLERS); 479d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 480d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { 4811fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol struct pipe_sampler_view *view = i < num ? views[i] : NULL; 482d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 4831fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol if(view) { 4841fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol struct pipe_texture *tex = view->texture; 485d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct llvmpipe_texture *lp_tex = llvmpipe_texture(tex); 48685999695829823e459e11822b4846ed1db5c055dJosé Fonseca struct lp_jit_texture *jit_tex; 48785999695829823e459e11822b4846ed1db5c055dJosé Fonseca jit_tex = &setup->fs.current.jit_context.textures[i]; 488080c40ab32b2abd6d8381b4a0cc143d36a1652b2José Fonseca jit_tex->width = tex->width0; 489080c40ab32b2abd6d8381b4a0cc143d36a1652b2José Fonseca jit_tex->height = tex->height0; 490b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul jit_tex->depth = tex->depth0; 491b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul jit_tex->last_level = tex->last_level; 4922ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 4932ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul /* We're referencing the texture's internal data, so save a 4942ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul * reference to it. 4952ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul */ 4962ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul pipe_texture_reference(&setup->fs.current_tex[i], tex); 4972ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 498f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul if (!lp_tex->dt) { 499f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul /* regular texture - setup array of mipmap level pointers */ 500f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul int j; 50119371fb60da8ec27a6024d0bf38b82cf3ca787e4Brian Paul for (j = 0; j <= tex->last_level; j++) { 502f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul jit_tex->data[j] = 503f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul (ubyte *) lp_tex->data + lp_tex->level_offset[j]; 50453efb634a0c134feebb5a3e47fc33660694be9c3Brian Paul jit_tex->row_stride[j] = lp_tex->stride[j]; 505f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul } 506b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca } 507b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca else { 508f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul /* display target texture/surface */ 509b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca /* 510b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca * XXX: Where should this be unmapped? 511b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca */ 512b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca 513b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca struct llvmpipe_screen *screen = llvmpipe_screen(tex->screen); 51494ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct sw_winsys *winsys = screen->winsys; 515f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul jit_tex->data[0] = winsys->displaytarget_map(winsys, lp_tex->dt, 516b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca PIPE_BUFFER_USAGE_CPU_READ); 51753efb634a0c134feebb5a3e47fc33660694be9c3Brian Paul jit_tex->row_stride[0] = lp_tex->stride[0]; 518f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul assert(jit_tex->data[0]); 519b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca } 520d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 52117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 522d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 5232e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 524946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 525946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 526946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 527946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 528d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Is the given texture referenced by any scene? 529d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Note: we have to check all scenes including any scenes currently 530d59fe448967addb3025d7df90888ff950e03a343Brian Paul * being rendered and the current scene being built. 531946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 532cd9d9e2436a0815f6ed3a61d2cdf8fad53278506Brian Paulunsigned 5333160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_is_texture_referenced( const struct lp_setup_context *setup, 534c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca const struct pipe_texture *texture ) 535946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 536d59fe448967addb3025d7df90888ff950e03a343Brian Paul unsigned i; 537946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 53812872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul /* check the render targets */ 53912872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul for (i = 0; i < setup->fb.nr_cbufs; i++) { 54012872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul if (setup->fb.cbufs[i]->texture == texture) 54112872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 54212872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul } 543018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) { 54412872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 545946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 546946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 547018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul /* check textures referenced by the scene */ 548018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul for (i = 0; i < Elements(setup->scenes); i++) { 549b014d71fd4e35efc5de36b7cc78a7880f8ccbf33Brian Paul if (lp_scene_is_texture_referenced(setup->scenes[i], texture)) { 550018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul return PIPE_REFERENCED_FOR_READ; 551018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul } 552946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 553946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 554c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca return PIPE_UNREFERENCED; 555946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 556946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 557946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 558946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 559a27b12171d84c6e731af08f48a657c377f8549baBrian Paul * Called by vbuf code when we're about to draw something. 560946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 561946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid 5623160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_update_state( struct lp_setup_context *setup ) 563946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 564663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene *scene = lp_setup_get_current_scene(setup); 565946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 566a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 567946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 56885999695829823e459e11822b4846ed1db5c055dJosé Fonseca assert(setup->fs.current.jit_function); 569946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 570f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) { 571f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca uint8_t *stored; 572f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca unsigned i, j; 57380eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 574663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell stored = lp_scene_alloc_aligned(scene, 4 * 16, 16); 575946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5769c1debe208d07b57e88c65bae186bb339de7dee7Brian Paul /* smear each blend color component across 16 ubyte elements */ 577f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca for (i = 0; i < 4; ++i) { 578f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]); 579f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca for (j = 0; j < 16; ++j) 5804e058f6c4803be5d9d676338d6aee2775b88b87cBrian Paul stored[i*16 + j] = c; 581946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 582946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 583f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->blend_color.stored = stored; 584f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca 585f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->fs.current.jit_context.blend_color = setup->blend_color.stored; 586f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty |= LP_SETUP_NEW_FS; 587946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 588946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5894461442849bfdb817334b38567136f7f9dabdf59Brian Paul if (setup->dirty & LP_SETUP_NEW_SCISSOR) { 5904461442849bfdb817334b38567136f7f9dabdf59Brian Paul float *stored; 591946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5924461442849bfdb817334b38567136f7f9dabdf59Brian Paul stored = lp_scene_alloc_aligned(scene, 4 * sizeof(int32_t), 16); 593946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5944461442849bfdb817334b38567136f7f9dabdf59Brian Paul stored[0] = (float) setup->scissor.current.minx; 5954461442849bfdb817334b38567136f7f9dabdf59Brian Paul stored[1] = (float) setup->scissor.current.miny; 5964461442849bfdb817334b38567136f7f9dabdf59Brian Paul stored[2] = (float) setup->scissor.current.maxx; 5974461442849bfdb817334b38567136f7f9dabdf59Brian Paul stored[3] = (float) setup->scissor.current.maxy; 598946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5994461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->scissor.stored = stored; 600946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6014461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->fs.current.jit_context.scissor_xmin = stored[0]; 6024461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->fs.current.jit_context.scissor_ymin = stored[1]; 6034461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->fs.current.jit_context.scissor_xmax = stored[2]; 6044461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->fs.current.jit_context.scissor_ymax = stored[3]; 605946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6064461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->dirty |= LP_SETUP_NEW_FS; 6074461442849bfdb817334b38567136f7f9dabdf59Brian Paul } 608946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6092e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->dirty & LP_SETUP_NEW_CONSTANTS) { 6102e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca struct pipe_buffer *buffer = setup->constants.current; 611946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6122e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(buffer) { 6132e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca unsigned current_size = buffer->size; 6142e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca const void *current_data = llvmpipe_buffer(buffer)->data; 615946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6162e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca /* TODO: copy only the actually used constants? */ 617946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6182e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->constants.stored_size != current_size || 6192e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca !setup->constants.stored_data || 6202e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca memcmp(setup->constants.stored_data, 6212e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_data, 6222e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_size) != 0) { 6232e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca void *stored; 624946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 625663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell stored = lp_scene_alloc(scene, current_size); 6262e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(stored) { 6272e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca memcpy(stored, 6282e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_data, 6292e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_size); 6302e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = current_size; 6312e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = stored; 632946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 633946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 634946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 635946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 6362e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = 0; 6372e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = NULL; 6382e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 639946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6402e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->fs.current.jit_context.constants = setup->constants.stored_data; 6412e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 6422e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 6432e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 6442e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 6452e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->dirty & LP_SETUP_NEW_FS) { 64685999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(!setup->fs.stored || 64785999695829823e459e11822b4846ed1db5c055dJosé Fonseca memcmp(setup->fs.stored, 64885999695829823e459e11822b4846ed1db5c055dJosé Fonseca &setup->fs.current, 64985999695829823e459e11822b4846ed1db5c055dJosé Fonseca sizeof setup->fs.current) != 0) { 650663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* The fs state that's been stored in the scene is different from 651e2f46344560f8f1193b311ad41883011e67eea00Brian Paul * the new, current state. So allocate a new lp_rast_state object 652e2f46344560f8f1193b311ad41883011e67eea00Brian Paul * and append it to the bin's setup data buffer. 653e2f46344560f8f1193b311ad41883011e67eea00Brian Paul */ 6542ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul uint i; 655e2f46344560f8f1193b311ad41883011e67eea00Brian Paul struct lp_rast_state *stored = 656663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored); 65785999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(stored) { 65885999695829823e459e11822b4846ed1db5c055dJosé Fonseca memcpy(stored, 65985999695829823e459e11822b4846ed1db5c055dJosé Fonseca &setup->fs.current, 66085999695829823e459e11822b4846ed1db5c055dJosé Fonseca sizeof setup->fs.current); 66185999695829823e459e11822b4846ed1db5c055dJosé Fonseca setup->fs.stored = stored; 662e2f46344560f8f1193b311ad41883011e67eea00Brian Paul 663e2f46344560f8f1193b311ad41883011e67eea00Brian Paul /* put the state-set command into all bins */ 664663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_bin_state_command( scene, 665663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_rast_set_state, 666663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_rast_arg_state(setup->fs.stored) ); 667946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 6682ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 6692ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul /* The scene now references the textures in the rasterization 6702ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul * state record. Note that now. 6712ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul */ 6722ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul for (i = 0; i < Elements(setup->fs.current_tex); i++) { 6732ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul if (setup->fs.current_tex[i]) 6742ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul lp_scene_texture_reference(scene, setup->fs.current_tex[i]); 6752ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul } 676946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 677946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 678608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 6792e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty = 0; 6802e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 68185999695829823e459e11822b4846ed1db5c055dJosé Fonseca assert(setup->fs.stored); 682946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 683946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 684608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 685946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 686b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell/* Only caller is lp_setup_vbuf_destroy() 687b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell */ 688253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid 6893160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_destroy( struct lp_setup_context *setup ) 690946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 6912ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul uint i; 6922ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 693415b271b5100d64579690111bc8eb549866865a7Keith Whitwell reset_context( setup ); 694946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6952ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul for (i = 0; i < Elements(setup->fs.current_tex); i++) { 6962ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul pipe_texture_reference(&setup->fs.current_tex[i], NULL); 6972ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul } 6982ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 699301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca pipe_buffer_reference(&setup->constants.current, NULL); 700946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 701663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* free the scenes in the 'empty' queue */ 702591401ff05f878ff1607a1a34db1319103025d8fKeith Whitwell while (1) { 703591401ff05f878ff1607a1a34db1319103025d8fKeith Whitwell struct lp_scene *scene = lp_scene_dequeue(setup->empty_scenes, FALSE); 704663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell if (!scene) 705d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul break; 706663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_destroy(scene); 707946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 708946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 709931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_destroy( setup->rast ); 710946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 71189498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell FREE( setup ); 712946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 713946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 714946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 715946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 7165ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * Create a new primitive tiling engine. Plug it into the backend of 7175ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * the draw module. Currently also creates a rasterizer to use with 7185ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * it. 719946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 7203160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastruct lp_setup_context * 7215fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwelllp_setup_create( struct pipe_context *pipe, 7225ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell struct draw_context *draw ) 723946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 72480eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell unsigned i; 7253160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonseca struct lp_setup_context *setup = CALLOC_STRUCT(lp_setup_context); 726946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 727a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell if (!setup) 728a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell return NULL; 729a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell 7305ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell lp_setup_init_vbuf(setup); 7315ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 732663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell setup->empty_scenes = lp_scene_queue_create(); 733663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell if (!setup->empty_scenes) 734d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul goto fail; 735946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7365fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /* XXX: move this to the screen and share between contexts: 7375fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 7385fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell setup->rast = lp_rast_create(); 739931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (!setup->rast) 740931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell goto fail; 741931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 7425ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->vbuf = draw_vbuf_stage(draw, &setup->base); 7435ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell if (!setup->vbuf) 7445ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell goto fail; 7455ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 7465ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell draw_set_rasterize_stage(draw, setup->vbuf); 7475ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell draw_set_render(draw, &setup->base); 7485ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 749663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* create some empty scenes */ 750663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell for (i = 0; i < MAX_SCENES; i++) { 7515fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell setup->scenes[i] = lp_scene_create( pipe, setup->empty_scenes ); 7525fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell 753d59fe448967addb3025d7df90888ff950e03a343Brian Paul lp_scene_enqueue(setup->empty_scenes, setup->scenes[i]); 75480eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell } 755946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 756163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->triangle = first_triangle; 757163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->line = first_line; 758163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->point = first_point; 759163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell 760301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca setup->dirty = ~0; 76108811032c2dd8f38d2ef65d7fd8794112e029b63Keith Whitwell 762946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca return setup; 763931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 764931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfail: 7655ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell if (setup->rast) 7665ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell lp_rast_destroy( setup->rast ); 7675ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 7685ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell if (setup->vbuf) 7695ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell ; 7705ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 771663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell if (setup->empty_scenes) 772663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_queue_destroy(setup->empty_scenes); 773d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul 774931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(setup); 775931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return NULL; 776946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 777946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 778