lp_setup.c revision 8be645d53a0d5d0ca50e4e9597043225e2231b6d
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 3586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li#include <limits.h> 3686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 37d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "pipe/p_defines.h" 381fc5a318a64b10567ed6990eb04b2dc3ecb2b347Brian Paul#include "util/u_framebuffer.h" 39a1af8eec66c5f7ec421e8011b41c1a7c36319f9fJosé Fonseca#include "util/u_inlines.h" 40946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h" 41253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell#include "util/u_pack_color.h" 429fae289fcd098027952c6b586292214ec586a2ecBrian Paul#include "lp_context.h" 43663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#include "lp_scene.h" 44663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#include "lp_scene_queue.h" 45d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_texture.h" 465ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_debug.h" 475ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_fence.h" 4886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li#include "lp_query.h" 495ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_rast.h" 50d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_setup_context.h" 51b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca#include "lp_screen.h" 529fae289fcd098027952c6b586292214ec586a2ecBrian Paul#include "lp_state.h" 5323e951d0da5802fec70996e46ad6f0abc411594cKeith Whitwell#include "state_tracker/sw_winsys.h" 54946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 555ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_context.h" 565ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_vbuf.h" 5780eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 58677a055fa0cf7b6476c716be187513c41060d417José Fonseca 590639765b2850739af1678f10fc0c5706d5827776Brian Paulstatic void set_scene_state( struct lp_setup_context *, enum setup_state ); 60946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 61946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 62663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwellstruct lp_scene * 633160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_get_current_scene(struct lp_setup_context *setup) 6422b07b8be4c2939b00e10f17fa91e68682808594Brian Paul{ 65663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell if (!setup->scene) { 66946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 67591401ff05f878ff1607a1a34db1319103025d8fKeith Whitwell /* wait for a free/empty scene 68591401ff05f878ff1607a1a34db1319103025d8fKeith Whitwell */ 69591401ff05f878ff1607a1a34db1319103025d8fKeith Whitwell setup->scene = lp_scene_dequeue(setup->empty_scenes, TRUE); 70946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 71049b4c340575ebc788d9a009829980fafa587effBrian Paul assert(lp_scene_is_empty(setup->scene)); 72946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 735fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell lp_scene_begin_binning(setup->scene, 745fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell &setup->fb ); 753bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul } 76663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell return setup->scene; 7722b07b8be4c2939b00e10f17fa91e68682808594Brian Paul} 78946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 79946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 80bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul/** 81bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul * Check if the size of the current scene has exceeded the limit. 82bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul * If so, flush/render it. 83bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul */ 84bb527c0af6c53b335330da1063979f5ac3a19174Brian Paulstatic void 85bb527c0af6c53b335330da1063979f5ac3a19174Brian Paulsetup_check_scene_size_and_flush(struct lp_setup_context *setup) 86bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul{ 87bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul if (setup->scene) { 88bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul struct lp_scene *scene = lp_setup_get_current_scene(setup); 89bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul unsigned size = lp_scene_get_size(scene); 90bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul 91bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul if (size > LP_MAX_SCENE_SIZE) { 92bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul /*printf("LLVMPIPE: scene size = %u, flushing.\n", size);*/ 93bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul set_scene_state( setup, SETUP_FLUSHED ); 94bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul /*assert(lp_scene_get_size(scene) == 0);*/ 95bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul } 96bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul } 97bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul} 98bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul 99bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul 1004d2b0eb19e432f83845a55d552b5d1d61f040459José Fonsecastatic void 1013160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_triangle( struct lp_setup_context *setup, 102253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 103253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4], 104253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v2)[4]) 1054d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca{ 1065ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_ACTIVE ); 107253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_triangle( setup ); 108253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 109253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 1104d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 111253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 1123160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_line( struct lp_setup_context *setup, 113253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 114253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4]) 115253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 1165ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_ACTIVE ); 117253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_line( setup ); 118253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line( setup, v0, v1 ); 1194d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca} 1204d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 121253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 1223160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_point( struct lp_setup_context *setup, 123253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4]) 124253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 1255ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_ACTIVE ); 126253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_point( setup ); 127253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point( setup, v0 ); 128253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 1294d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 1303160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastatic void reset_context( struct lp_setup_context *setup ) 131931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 132a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 1334d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 134301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca /* Reset derived state */ 1352e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = 0; 1362e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = NULL; 137301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca setup->fs.stored = NULL; 138f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty = ~0; 139946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1403bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul /* no current bin */ 141663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell setup->scene = NULL; 142946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1430718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Reset some state: 1440718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 1450718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell setup->clear.flags = 0; 1461e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger setup->clear.clearzs.clearzs_mask = 0; 147946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 148253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Have an explicit "start-binning" call and get rid of this 149253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * pointer twiddling? 150946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 151253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line = first_line; 152253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point = first_point; 153253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle = first_triangle; 154946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 155946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 156946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 157663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell/** Rasterize all scene's bins */ 158931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 159b73c9ba9195ac436960b90649db35bb11d23f9d0Brian Paullp_setup_rasterize_scene( struct lp_setup_context *setup ) 160946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 161663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene *scene = lp_setup_get_current_scene(setup); 162946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 163b73c9ba9195ac436960b90649db35bb11d23f9d0Brian Paul lp_scene_rasterize(scene, setup->rast); 164946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1651caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell reset_context( setup ); 166946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 167a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__); 16880eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell} 16980eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 170931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 171931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 172931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 1733160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecabegin_binning( struct lp_setup_context *setup ) 17480eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell{ 175663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene *scene = lp_setup_get_current_scene(setup); 1761e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger boolean need_zsload = FALSE; 1771e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (setup->fb.zsbuf && 1781e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger ((setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) && 1791e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger util_format_is_depth_and_stencil(setup->fb.zsbuf->format)) 1801e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger need_zsload = TRUE; 18122b07b8be4c2939b00e10f17fa91e68682808594Brian Paul 182da45f49cc63fff06513dc28d9616084fc81798d4Keith Whitwell LP_DBG(DEBUG_SETUP, "%s color: %s depth: %s\n", __FUNCTION__, 183da45f49cc63fff06513dc28d9616084fc81798d4Keith Whitwell (setup->clear.flags & PIPE_CLEAR_COLOR) ? "clear": "load", 1841e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger need_zsload ? "clear": "load"); 185402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 186c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell if (setup->fb.nr_cbufs) { 1870639765b2850739af1678f10fc0c5706d5827776Brian Paul if (setup->clear.flags & PIPE_CLEAR_COLOR) { 188663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_bin_everywhere( scene, 189c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell lp_rast_clear_color, 190c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell setup->clear.color ); 1910639765b2850739af1678f10fc0c5706d5827776Brian Paul scene->has_color_clear = TRUE; 1920639765b2850739af1678f10fc0c5706d5827776Brian Paul } 193931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 194931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1957f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell if (setup->fb.zsbuf) { 1960639765b2850739af1678f10fc0c5706d5827776Brian Paul if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) { 1971e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (!need_zsload) 1981e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger scene->has_depthstencil_clear = TRUE; 1991e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger lp_scene_bin_everywhere( scene, 2001e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger lp_rast_clear_zstencil, 2011e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger lp_rast_arg_clearzs(&setup->clear.clearzs) ); 2020639765b2850739af1678f10fc0c5706d5827776Brian Paul } 203931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 2043094fc200920f9d5eb62136d3b25896229fb0dbfBrian Paul 205a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s done\n", __FUNCTION__); 206946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 207946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 208946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 209931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen 210931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears. 211931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * 212931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles. 213b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca */ 214931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 2153160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaexecute_clears( struct lp_setup_context *setup ) 216b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca{ 217a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 218b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 219931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell begin_binning( setup ); 220b73c9ba9195ac436960b90649db35bb11d23f9d0Brian Paul lp_setup_rasterize_scene( setup ); 221b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca} 222b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 223b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 224931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 2253160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaset_scene_state( struct lp_setup_context *setup, 2260639765b2850739af1678f10fc0c5706d5827776Brian Paul enum setup_state new_state ) 227946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 228931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned old_state = setup->state; 22980eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 230931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == new_state) 231931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 232931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 233a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s old %d new %d\n", __FUNCTION__, old_state, new_state); 234402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 235931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell switch (new_state) { 236931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_ACTIVE: 237402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell begin_binning( setup ); 238931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 239931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 240931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_CLEARED: 241931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == SETUP_ACTIVE) { 242931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell assert(0); 243931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 24408811032c2dd8f38d2ef65d7fd8794112e029b63Keith Whitwell } 245931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 246931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 247931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_FLUSHED: 2480718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (old_state == SETUP_CLEARED) 249931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell execute_clears( setup ); 250931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 251b73c9ba9195ac436960b90649db35bb11d23f9d0Brian Paul lp_setup_rasterize_scene( setup ); 252931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 2530639765b2850739af1678f10fc0c5706d5827776Brian Paul 2540639765b2850739af1678f10fc0c5706d5827776Brian Paul default: 2550639765b2850739af1678f10fc0c5706d5827776Brian Paul assert(0 && "invalid setup state mode"); 256946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 257946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 258931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->state = new_state; 259946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 260946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 261946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 2620639765b2850739af1678f10fc0c5706d5827776Brian Paul/** 2630639765b2850739af1678f10fc0c5706d5827776Brian Paul * \param flags bitmask of PIPE_FLUSH_x flags 2640639765b2850739af1678f10fc0c5706d5827776Brian Paul */ 265946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid 2663160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_flush( struct lp_setup_context *setup, 267931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 268946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 269a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 270402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 2710639765b2850739af1678f10fc0c5706d5827776Brian Paul if (setup->scene) { 2720639765b2850739af1678f10fc0c5706d5827776Brian Paul struct lp_scene *scene = lp_setup_get_current_scene(setup); 273aa7a47dcbdfff3c6858ff3618170ec17ca72d337José Fonseca union lp_rast_cmd_arg dummy = {0}; 2740639765b2850739af1678f10fc0c5706d5827776Brian Paul 2750639765b2850739af1678f10fc0c5706d5827776Brian Paul if (flags & (PIPE_FLUSH_SWAPBUFFERS | 2760639765b2850739af1678f10fc0c5706d5827776Brian Paul PIPE_FLUSH_FRAME)) { 2770639765b2850739af1678f10fc0c5706d5827776Brian Paul /* Store colors in the linear color buffer(s). 2780639765b2850739af1678f10fc0c5706d5827776Brian Paul * If we don't do this here, we'll end up converting the tiled 2790639765b2850739af1678f10fc0c5706d5827776Brian Paul * data to linear in the texture_unmap() function, which will 2800639765b2850739af1678f10fc0c5706d5827776Brian Paul * not be a parallel/threaded operation as here. 2810639765b2850739af1678f10fc0c5706d5827776Brian Paul */ 2820639765b2850739af1678f10fc0c5706d5827776Brian Paul lp_scene_bin_everywhere(scene, lp_rast_store_color, dummy); 2830639765b2850739af1678f10fc0c5706d5827776Brian Paul } 2840639765b2850739af1678f10fc0c5706d5827776Brian Paul } 2850639765b2850739af1678f10fc0c5706d5827776Brian Paul 2865ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_FLUSHED ); 287946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 288946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 289946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 290931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 2913160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_bind_framebuffer( struct lp_setup_context *setup, 2929fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul const struct pipe_framebuffer_state *fb ) 293946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 294a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 295946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 2965fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /* Flush any old scene. 2975fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 2985ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_FLUSHED ); 299677a055fa0cf7b6476c716be187513c41060d417José Fonseca 3008be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca /* 3018be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca * Ensure the old scene is not reused. 3028be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca */ 3038be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca assert(!setup->scene); 3048be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca 3055fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /* Set new state. This will be picked up later when we next need a 3065fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell * scene. 3075fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 3087f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell util_copy_framebuffer_state(&setup->fb, fb); 309946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 310946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 311946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 312931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 3133160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_clear( struct lp_setup_context *setup, 314253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float *color, 315253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell double depth, 316253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell unsigned stencil, 317931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 31817aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{ 319663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct lp_scene *scene = lp_setup_get_current_scene(setup); 320659609e0ae27071a601794935c85547e315dedebJosé Fonseca unsigned i; 3211e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger boolean full_zs_clear = TRUE; 3221e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger uint32_t mask = 0; 32317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 324a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state); 32517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 32617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 3274cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_COLOR) { 328659609e0ae27071a601794935c85547e315dedebJosé Fonseca for (i = 0; i < 4; ++i) 329659609e0ae27071a601794935c85547e315dedebJosé Fonseca setup->clear.color.clear_color[i] = float_to_ubyte(color[i]); 33017aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 33117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 3324cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 3331e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (setup->fb.zsbuf && 33426d5d4d99510148eef4fd20845b7790b4fedc355Roland Scheidegger ((flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) && 3351e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger util_format_is_depth_and_stencil(setup->fb.zsbuf->format)) 3361e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger full_zs_clear = FALSE; 3371e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger 3381e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (full_zs_clear) { 3391e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger setup->clear.clearzs.clearzs_value = 3401e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger util_pack_z_stencil(setup->fb.zsbuf->format, 3411e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger depth, 3421e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger stencil); 3431e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger setup->clear.clearzs.clearzs_mask = 0xffffffff; 3441e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger } 3451e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger else { 3461e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger /* hmm */ 3471e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger uint32_t tmpval; 3481e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (flags & PIPE_CLEAR_DEPTH) { 3491e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger tmpval = util_pack_z(setup->fb.zsbuf->format, 3501e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger depth); 3511e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger switch (setup->fb.zsbuf->format) { 3521e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger case PIPE_FORMAT_Z24_UNORM_S8_USCALED: 3531e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger mask = 0xffffff; 3541e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger break; 3551e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 3561e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger mask = 0xffffff00; 3571e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger break; 3581e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger default: 3591e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger assert(0); 3601e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger } 3611e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger } 3621e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger else { 3631e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger switch (setup->fb.zsbuf->format) { 3641e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger case PIPE_FORMAT_Z24_UNORM_S8_USCALED: 3651e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger mask = 0xff000000; 3661e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger tmpval = stencil << 24; 3671e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger break; 3681e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger case PIPE_FORMAT_S8_USCALED_Z24_UNORM: 3691e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger mask = 0xff; 3701e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger tmpval = stencil; 3711e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger break; 3721e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger default: 3731e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger assert(0); 374a52f577270300bf3b986f175d26f96ae83c048d9Vinson Lee tmpval = 0; 3751e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger } 3761e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger } 3771e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger setup->clear.clearzs.clearzs_mask |= mask; 3781e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger setup->clear.clearzs.clearzs_value = 3791e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger (setup->clear.clearzs.clearzs_value & ~mask) | (tmpval & mask); 3801e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger } 38117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 38217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 383931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (setup->state == SETUP_ACTIVE) { 384663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* Add the clear to existing scene. In the unusual case where 3859a6567f1ed88727545f747e8670b713f17627c94Brian Paul * both color and depth-stencil are being cleared when there's 3869a6567f1ed88727545f747e8670b713f17627c94Brian Paul * already been some rendering, we could discard the currently 3879a6567f1ed88727545f747e8670b713f17627c94Brian Paul * binned scene and start again, but I don't see that as being 3889a6567f1ed88727545f747e8670b713f17627c94Brian Paul * a common usage. 389253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 3900639765b2850739af1678f10fc0c5706d5827776Brian Paul if (flags & PIPE_CLEAR_COLOR) { 391663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_bin_everywhere( scene, 3920b279c5382da021a71cdc8ed3afa09983817539cBrian Paul lp_rast_clear_color, 3930b279c5382da021a71cdc8ed3afa09983817539cBrian Paul setup->clear.color ); 3940639765b2850739af1678f10fc0c5706d5827776Brian Paul scene->has_color_clear = TRUE; 3950639765b2850739af1678f10fc0c5706d5827776Brian Paul } 39617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 3971e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 3981e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (full_zs_clear) 3991e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger scene->has_depthstencil_clear = TRUE; 4001e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger else 4011e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger setup->clear.clearzs.clearzs_mask = mask; 4021e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger lp_scene_bin_everywhere( scene, 4030b279c5382da021a71cdc8ed3afa09983817539cBrian Paul lp_rast_clear_zstencil, 4041e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger lp_rast_arg_clearzs(&setup->clear.clearzs) ); 4051e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger 4061e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger 4070639765b2850739af1678f10fc0c5706d5827776Brian Paul } 4080639765b2850739af1678f10fc0c5706d5827776Brian Paul 409946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 410946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 411253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Put ourselves into the 'pre-clear' state, specifically to try 412253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * and accumulate multiple clears to color and depth_stencil 413253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * buffers which the app or state-tracker might issue 414253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * separately. 41517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca */ 4165ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell set_scene_state( setup, SETUP_CLEARED ); 4170718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 418931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->clear.flags |= flags; 41917aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 420946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 421946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 422946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 423946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 4246cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul * Emit a fence. 425946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 4266cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paulstruct pipe_fence_handle * 4273160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_fence( struct lp_setup_context *setup ) 428946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 429bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca if (setup->num_threads == 0) { 430bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca return NULL; 431bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca } 432bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca else { 433bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca struct lp_scene *scene = lp_setup_get_current_scene(setup); 434bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca const unsigned rank = lp_scene_get_num_bins( scene ); /* xxx */ 435bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca struct lp_fence *fence = lp_fence_create(rank); 436946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 437bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca LP_DBG(DEBUG_SETUP, "%s rank %u\n", __FUNCTION__, rank); 438946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 439bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca set_scene_state( setup, SETUP_ACTIVE ); 440a9063cad0f0190ff88cd20fbad5aa87bf1a943f6Brian Paul 441bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca /* insert the fence into all command bins */ 442bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca lp_scene_bin_everywhere( scene, 443bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca lp_rast_fence, 444bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca lp_rast_arg_fence(fence) ); 445946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 446bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca return (struct pipe_fence_handle *) fence; 447bd6e9e33501ad4351029d0eb0efa6b83f9f05445José Fonseca } 4486cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul} 449946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 450946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 451415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid 4523160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_triangle_state( struct lp_setup_context *setup, 453e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell unsigned cull_mode, 454fdfe06ad804ea13e6e436d66c1bcafe0bde2f545Brian Paul boolean ccw_is_frontface, 455a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca boolean scissor, 456a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca boolean gl_rasterization_rules) 457415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{ 458a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 459946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 460415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->ccw_is_frontface = ccw_is_frontface; 461415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->cullmode = cull_mode; 462415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->triangle = first_triangle; 463fdfe06ad804ea13e6e436d66c1bcafe0bde2f545Brian Paul setup->scissor_test = scissor; 464a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca setup->pixel_offset = gl_rasterization_rules ? 0.5f : 0.0f; 465946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 466946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 467946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 468946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 469931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 4703160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_inputs( struct lp_setup_context *setup, 471253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const struct lp_shader_input *input, 472931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned nr ) 473946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 474a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %p %u\n", __FUNCTION__, (void *) input, nr); 475946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 476253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell memcpy( setup->fs.input, input, nr * sizeof input[0] ); 477253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->fs.nr_inputs = nr; 478931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 479946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 4800718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid 48118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecalp_setup_set_fs_variant( struct lp_setup_context *setup, 48218fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca struct lp_fragment_shader_variant *variant) 483946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 484d9096926f84b33e122e3b2942ff66dc183894b50Brian Paul LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, 48518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca variant); 486d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: reference count */ 487946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 48818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca setup->fs.current.variant = variant; 4890e042bed49c51fef38b02b7cc05efa504f2f703dBrian Paul setup->dirty |= LP_SETUP_NEW_FS; 490946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 491946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 492d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 4933160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_constants(struct lp_setup_context *setup, 494287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *buffer) 495946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 496a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) buffer); 497402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 498287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&setup->constants.current, buffer); 499931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 5002e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_CONSTANTS; 501946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 502946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 503946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 504d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 5053160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_alpha_ref_value( struct lp_setup_context *setup, 506d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca float alpha_ref_value ) 507946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 508a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %f\n", __FUNCTION__, alpha_ref_value); 509946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 51085999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) { 51185999695829823e459e11822b4846ed1db5c055dJosé Fonseca setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value; 5122e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 513d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 514d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 515946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 516d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 517eee51147979208feffdf37c588ebbce4df6b40d6Brian Paullp_setup_set_stencil_ref_values( struct lp_setup_context *setup, 518eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul const ubyte refs[2] ) 519eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul{ 520eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul LP_DBG(DEBUG_SETUP, "%s %d %d\n", __FUNCTION__, refs[0], refs[1]); 521eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul 522521c61ff017ab15b829abbe9a98b179136a36009Brian Paul if (setup->fs.current.jit_context.stencil_ref_front != refs[0] || 523521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_back != refs[1]) { 524521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_front = refs[0]; 525521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_back = refs[1]; 526eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul setup->dirty |= LP_SETUP_NEW_FS; 527eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul } 528eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul} 529eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul 530eee51147979208feffdf37c588ebbce4df6b40d6Brian Paulvoid 5313160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_blend_color( struct lp_setup_context *setup, 532d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca const struct pipe_blend_color *blend_color ) 533d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 534a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 535946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 536f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca assert(blend_color); 537946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 538f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) { 539f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color); 540f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty |= LP_SETUP_NEW_BLEND_COLOR; 541d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 542d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 543946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 544946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5454461442849bfdb817334b38567136f7f9dabdf59Brian Paulvoid 5463160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_scissor( struct lp_setup_context *setup, 5474461442849bfdb817334b38567136f7f9dabdf59Brian Paul const struct pipe_scissor_state *scissor ) 5484461442849bfdb817334b38567136f7f9dabdf59Brian Paul{ 5494461442849bfdb817334b38567136f7f9dabdf59Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 550946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5514461442849bfdb817334b38567136f7f9dabdf59Brian Paul assert(scissor); 552946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5534461442849bfdb817334b38567136f7f9dabdf59Brian Paul if (memcmp(&setup->scissor.current, scissor, sizeof(*scissor)) != 0) { 5544461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->scissor.current = *scissor; /* struct copy */ 5554461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->dirty |= LP_SETUP_NEW_SCISSOR; 556946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 557946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 558946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 559946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5605ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid 5613160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_flatshade_first( struct lp_setup_context *setup, 5625ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell boolean flatshade_first ) 563946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 5645ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->flatshade_first = flatshade_first; 56517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca} 56617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 56717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 5685ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid 5693160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_vertex_info( struct lp_setup_context *setup, 5705ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell struct vertex_info *vertex_info ) 57117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{ 5725ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell /* XXX: just silently holding onto the pointer: 5735ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell */ 5745ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->vertex_info = vertex_info; 575946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 576946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 577946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 578946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 5791fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol * Called during state validation when LP_NEW_SAMPLER_VIEW is set. 580946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 581d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 58247bfbd452c93e6a8db013fb90d9f42210cf24889Keith Whitwelllp_setup_set_fragment_sampler_views(struct lp_setup_context *setup, 5831fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol unsigned num, 5841fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol struct pipe_sampler_view **views) 585946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 58617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca unsigned i; 587d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 588a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 589402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 590d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca assert(num <= PIPE_MAX_SAMPLERS); 591d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 592d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { 5931fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol struct pipe_sampler_view *view = i < num ? views[i] : NULL; 594d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 5951fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol if(view) { 596287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex = view->texture; 597287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct llvmpipe_resource *lp_tex = llvmpipe_resource(tex); 59885999695829823e459e11822b4846ed1db5c055dJosé Fonseca struct lp_jit_texture *jit_tex; 59985999695829823e459e11822b4846ed1db5c055dJosé Fonseca jit_tex = &setup->fs.current.jit_context.textures[i]; 600080c40ab32b2abd6d8381b4a0cc143d36a1652b2José Fonseca jit_tex->width = tex->width0; 601080c40ab32b2abd6d8381b4a0cc143d36a1652b2José Fonseca jit_tex->height = tex->height0; 602b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul jit_tex->depth = tex->depth0; 603b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul jit_tex->last_level = tex->last_level; 6042ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 6052ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul /* We're referencing the texture's internal data, so save a 6062ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul * reference to it. 6072ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul */ 608287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&setup->fs.current_tex[i], tex); 6092ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 610f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul if (!lp_tex->dt) { 611f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul /* regular texture - setup array of mipmap level pointers */ 612f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul int j; 61319371fb60da8ec27a6024d0bf38b82cf3ca787e4Brian Paul for (j = 0; j <= tex->last_level; j++) { 6140639765b2850739af1678f10fc0c5706d5827776Brian Paul jit_tex->data[j] = 615202ff7db490f4a1d041a88f11665fbd3ccea2201Brian Paul llvmpipe_get_texture_image_all(lp_tex, j, LP_TEX_USAGE_READ, 616202ff7db490f4a1d041a88f11665fbd3ccea2201Brian Paul LP_TEX_LAYOUT_LINEAR); 617f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul jit_tex->row_stride[j] = lp_tex->row_stride[j]; 618f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul jit_tex->img_stride[j] = lp_tex->img_stride[j]; 619f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul } 620b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca } 621b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca else { 622f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul /* display target texture/surface */ 623b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca /* 624b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca * XXX: Where should this be unmapped? 625b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca */ 626b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca 627b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca struct llvmpipe_screen *screen = llvmpipe_screen(tex->screen); 62894ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct sw_winsys *winsys = screen->winsys; 629f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul jit_tex->data[0] = winsys->displaytarget_map(winsys, lp_tex->dt, 630287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_TRANSFER_READ); 631f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul jit_tex->row_stride[0] = lp_tex->row_stride[0]; 632f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul jit_tex->img_stride[0] = lp_tex->img_stride[0]; 633f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul assert(jit_tex->data[0]); 634b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca } 635d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 63617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 637d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 6382e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 639946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 640946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 641946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 642946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 643d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Is the given texture referenced by any scene? 644d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Note: we have to check all scenes including any scenes currently 645d59fe448967addb3025d7df90888ff950e03a343Brian Paul * being rendered and the current scene being built. 646946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 647cd9d9e2436a0815f6ed3a61d2cdf8fad53278506Brian Paulunsigned 648287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwelllp_setup_is_resource_referenced( const struct lp_setup_context *setup, 649287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource *texture ) 650946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 651d59fe448967addb3025d7df90888ff950e03a343Brian Paul unsigned i; 652946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 65312872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul /* check the render targets */ 65412872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul for (i = 0; i < setup->fb.nr_cbufs; i++) { 65512872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul if (setup->fb.cbufs[i]->texture == texture) 65612872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 65712872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul } 658018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) { 65912872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 660946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 661946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 662018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul /* check textures referenced by the scene */ 663018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul for (i = 0; i < Elements(setup->scenes); i++) { 664287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (lp_scene_is_resource_referenced(setup->scenes[i], texture)) { 665018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul return PIPE_REFERENCED_FOR_READ; 666018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul } 667946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 668946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 669c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca return PIPE_UNREFERENCED; 670946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 671946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 672946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 673946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 674a27b12171d84c6e731af08f48a657c377f8549baBrian Paul * Called by vbuf code when we're about to draw something. 675946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 676946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid 6773160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_update_state( struct lp_setup_context *setup ) 678946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 679bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul struct lp_scene *scene; 680946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 681a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 682946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 683bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul setup_check_scene_size_and_flush(setup); 684bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul 685bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul scene = lp_setup_get_current_scene(setup); 686bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul 68718fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca assert(setup->fs.current.variant); 688946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6899fae289fcd098027952c6b586292214ec586a2ecBrian Paul /* Some of the 'draw' pipeline stages may have changed some driver state. 6909fae289fcd098027952c6b586292214ec586a2ecBrian Paul * Make sure we've processed those state changes before anything else. 6919fae289fcd098027952c6b586292214ec586a2ecBrian Paul * 6929fae289fcd098027952c6b586292214ec586a2ecBrian Paul * XXX this is the only place where llvmpipe_context is used in the 6939fae289fcd098027952c6b586292214ec586a2ecBrian Paul * setup code. This may get refactored/changed... 6949fae289fcd098027952c6b586292214ec586a2ecBrian Paul */ 6959fae289fcd098027952c6b586292214ec586a2ecBrian Paul { 6969fae289fcd098027952c6b586292214ec586a2ecBrian Paul struct llvmpipe_context *lp = llvmpipe_context(scene->pipe); 6979fae289fcd098027952c6b586292214ec586a2ecBrian Paul if (lp->dirty) { 6989fae289fcd098027952c6b586292214ec586a2ecBrian Paul llvmpipe_update_derived(lp); 6999fae289fcd098027952c6b586292214ec586a2ecBrian Paul } 7009fae289fcd098027952c6b586292214ec586a2ecBrian Paul assert(lp->dirty == 0); 7019fae289fcd098027952c6b586292214ec586a2ecBrian Paul } 7029fae289fcd098027952c6b586292214ec586a2ecBrian Paul 703f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) { 704f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca uint8_t *stored; 705f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca unsigned i, j; 70680eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 707663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell stored = lp_scene_alloc_aligned(scene, 4 * 16, 16); 708946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 709477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul if (stored) { 710477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul /* smear each blend color component across 16 ubyte elements */ 711477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul for (i = 0; i < 4; ++i) { 712477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]); 713477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul for (j = 0; j < 16; ++j) 714477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul stored[i*16 + j] = c; 715477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul } 716946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 717477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul setup->blend_color.stored = stored; 718477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul 719477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul setup->fs.current.jit_context.blend_color = setup->blend_color.stored; 720477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul } 721f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca 722f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty |= LP_SETUP_NEW_FS; 723946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 724946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7254461442849bfdb817334b38567136f7f9dabdf59Brian Paul if (setup->dirty & LP_SETUP_NEW_SCISSOR) { 7264461442849bfdb817334b38567136f7f9dabdf59Brian Paul float *stored; 727946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7284461442849bfdb817334b38567136f7f9dabdf59Brian Paul stored = lp_scene_alloc_aligned(scene, 4 * sizeof(int32_t), 16); 729946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 730477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul if (stored) { 731477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul stored[0] = (float) setup->scissor.current.minx; 732477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul stored[1] = (float) setup->scissor.current.miny; 733477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul stored[2] = (float) setup->scissor.current.maxx; 734477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul stored[3] = (float) setup->scissor.current.maxy; 735946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 736477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul setup->scissor.stored = stored; 737946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 738477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul setup->fs.current.jit_context.scissor_xmin = stored[0]; 739477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul setup->fs.current.jit_context.scissor_ymin = stored[1]; 740477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul setup->fs.current.jit_context.scissor_xmax = stored[2]; 741477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul setup->fs.current.jit_context.scissor_ymax = stored[3]; 742477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul } 743946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7444461442849bfdb817334b38567136f7f9dabdf59Brian Paul setup->dirty |= LP_SETUP_NEW_FS; 7454461442849bfdb817334b38567136f7f9dabdf59Brian Paul } 746946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7472e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->dirty & LP_SETUP_NEW_CONSTANTS) { 748287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *buffer = setup->constants.current; 749946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7502e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(buffer) { 751287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned current_size = buffer->width0; 7520639765b2850739af1678f10fc0c5706d5827776Brian Paul const void *current_data = llvmpipe_resource_data(buffer); 753946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7542e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca /* TODO: copy only the actually used constants? */ 755946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7562e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->constants.stored_size != current_size || 7572e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca !setup->constants.stored_data || 7582e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca memcmp(setup->constants.stored_data, 7592e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_data, 7602e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_size) != 0) { 7612e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca void *stored; 762946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 763663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell stored = lp_scene_alloc(scene, current_size); 7642e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(stored) { 7652e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca memcpy(stored, 7662e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_data, 7672e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_size); 7682e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = current_size; 7692e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = stored; 770946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 771946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 772946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 773946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 7742e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = 0; 7752e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = NULL; 7762e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 777946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7782e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->fs.current.jit_context.constants = setup->constants.stored_data; 7792e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 7802e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 7812e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 7822e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 7832e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->dirty & LP_SETUP_NEW_FS) { 78485999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(!setup->fs.stored || 78585999695829823e459e11822b4846ed1db5c055dJosé Fonseca memcmp(setup->fs.stored, 78685999695829823e459e11822b4846ed1db5c055dJosé Fonseca &setup->fs.current, 78785999695829823e459e11822b4846ed1db5c055dJosé Fonseca sizeof setup->fs.current) != 0) { 788663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* The fs state that's been stored in the scene is different from 789e2f46344560f8f1193b311ad41883011e67eea00Brian Paul * the new, current state. So allocate a new lp_rast_state object 790e2f46344560f8f1193b311ad41883011e67eea00Brian Paul * and append it to the bin's setup data buffer. 791e2f46344560f8f1193b311ad41883011e67eea00Brian Paul */ 7922ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul uint i; 793e2f46344560f8f1193b311ad41883011e67eea00Brian Paul struct lp_rast_state *stored = 794663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored); 79585999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(stored) { 79685999695829823e459e11822b4846ed1db5c055dJosé Fonseca memcpy(stored, 79785999695829823e459e11822b4846ed1db5c055dJosé Fonseca &setup->fs.current, 79885999695829823e459e11822b4846ed1db5c055dJosé Fonseca sizeof setup->fs.current); 79985999695829823e459e11822b4846ed1db5c055dJosé Fonseca setup->fs.stored = stored; 800e2f46344560f8f1193b311ad41883011e67eea00Brian Paul 801e2f46344560f8f1193b311ad41883011e67eea00Brian Paul /* put the state-set command into all bins */ 802663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_bin_state_command( scene, 803663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_rast_set_state, 804663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_rast_arg_state(setup->fs.stored) ); 805946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 8062ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 8072ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul /* The scene now references the textures in the rasterization 8082ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul * state record. Note that now. 8092ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul */ 8102ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul for (i = 0; i < Elements(setup->fs.current_tex); i++) { 8112ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul if (setup->fs.current_tex[i]) 812f855193796b834e9f06775f8a7130837d1f86f95Brian Paul lp_scene_add_resource_reference(scene, setup->fs.current_tex[i]); 8132ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul } 814946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 815946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 816608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 8172e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty = 0; 8182e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 81985999695829823e459e11822b4846ed1db5c055dJosé Fonseca assert(setup->fs.stored); 820946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 821946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 822608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 823946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 824b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell/* Only caller is lp_setup_vbuf_destroy() 825b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell */ 826253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid 8273160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_destroy( struct lp_setup_context *setup ) 828946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 8292ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul uint i; 8302ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 831415b271b5100d64579690111bc8eb549866865a7Keith Whitwell reset_context( setup ); 832946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 8335f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul util_unreference_framebuffer_state(&setup->fb); 8345f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul 8352ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul for (i = 0; i < Elements(setup->fs.current_tex); i++) { 836287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&setup->fs.current_tex[i], NULL); 8372ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul } 8382ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 839287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&setup->constants.current, NULL); 840946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 841663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* free the scenes in the 'empty' queue */ 842591401ff05f878ff1607a1a34db1319103025d8fKeith Whitwell while (1) { 843591401ff05f878ff1607a1a34db1319103025d8fKeith Whitwell struct lp_scene *scene = lp_scene_dequeue(setup->empty_scenes, FALSE); 844663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell if (!scene) 845d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul break; 846663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_destroy(scene); 847946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 848946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 8490728db86bc8d4e9223aad56d0848f1fc4cb95f13Brian Paul lp_scene_queue_destroy(setup->empty_scenes); 8500728db86bc8d4e9223aad56d0848f1fc4cb95f13Brian Paul 851931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_destroy( setup->rast ); 852946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 85389498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell FREE( setup ); 854946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 855946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 856946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 857946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 8585ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * Create a new primitive tiling engine. Plug it into the backend of 8595ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * the draw module. Currently also creates a rasterizer to use with 8605ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * it. 861946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 8623160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastruct lp_setup_context * 8635fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwelllp_setup_create( struct pipe_context *pipe, 8645ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell struct draw_context *draw ) 865946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 86639be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen); 8673160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonseca struct lp_setup_context *setup = CALLOC_STRUCT(lp_setup_context); 86839be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca unsigned i; 869946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 870a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell if (!setup) 871a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell return NULL; 872a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell 8735ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell lp_setup_init_vbuf(setup); 8745ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 875663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell setup->empty_scenes = lp_scene_queue_create(); 876663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell if (!setup->empty_scenes) 877d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul goto fail; 878946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 8795fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /* XXX: move this to the screen and share between contexts: 8805fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 88139be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca setup->num_threads = screen->num_threads; 88239be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca setup->rast = lp_rast_create(screen->num_threads); 883931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (!setup->rast) 884931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell goto fail; 885931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 8865ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->vbuf = draw_vbuf_stage(draw, &setup->base); 8875ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell if (!setup->vbuf) 8885ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell goto fail; 8895ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 8905ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell draw_set_rasterize_stage(draw, setup->vbuf); 8915ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell draw_set_render(draw, &setup->base); 8925ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 893663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* create some empty scenes */ 894663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell for (i = 0; i < MAX_SCENES; i++) { 8955fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell setup->scenes[i] = lp_scene_create( pipe, setup->empty_scenes ); 8965fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell 897d59fe448967addb3025d7df90888ff950e03a343Brian Paul lp_scene_enqueue(setup->empty_scenes, setup->scenes[i]); 89880eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell } 899946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 900163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->triangle = first_triangle; 901163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->line = first_line; 902163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->point = first_point; 903163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell 904301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca setup->dirty = ~0; 90508811032c2dd8f38d2ef65d7fd8794112e029b63Keith Whitwell 906946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca return setup; 907931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 908931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfail: 9095ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell if (setup->rast) 9105ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell lp_rast_destroy( setup->rast ); 9115ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 9125ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell if (setup->vbuf) 9135ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell ; 9145ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 915663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell if (setup->empty_scenes) 916663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_queue_destroy(setup->empty_scenes); 917d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul 918931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(setup); 919931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return NULL; 920946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 921946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 92286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 92386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/** 92486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put a BeginQuery command into all bins. 92586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */ 92686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid 92786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_begin_query(struct lp_setup_context *setup, 92886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li struct llvmpipe_query *pq) 92986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{ 93086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li struct lp_scene * scene = lp_setup_get_current_scene(setup); 93186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li union lp_rast_cmd_arg cmd_arg; 93286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 93386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li /* init the query to its beginning state */ 93486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li pq->done = FALSE; 93586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li pq->tile_count = 0; 93686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li pq->num_tiles = scene->tiles_x * scene->tiles_y; 93786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li assert(pq->num_tiles > 0); 93886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 93986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li memset(pq->count, 0, sizeof(pq->count)); /* reset all counters */ 94086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 9418be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca set_scene_state( setup, SETUP_ACTIVE ); 9428be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca 94386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li cmd_arg.query_obj = pq; 94486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li lp_scene_bin_everywhere(scene, lp_rast_begin_query, cmd_arg); 94586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li pq->binned = TRUE; 94686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li} 94786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 94886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 94986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/** 95086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put an EndQuery command into all bins. 95186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */ 95286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid 95386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq) 95486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{ 95586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li struct lp_scene * scene = lp_setup_get_current_scene(setup); 95686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li union lp_rast_cmd_arg cmd_arg; 95786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 9588be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca set_scene_state( setup, SETUP_ACTIVE ); 9598be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca 96086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li cmd_arg.query_obj = pq; 96186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li lp_scene_bin_everywhere(scene, lp_rast_end_query, cmd_arg); 96286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li} 963