lp_setup.c revision ad6730fadbbeacea96322e31064ede9ea7ebad6f
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" 432b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul#include "lp_memory.h" 44663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#include "lp_scene.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 59ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean set_scene_state( struct lp_setup_context *, enum setup_state, 609f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell const char *reason); 619f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic boolean try_update_scene_state( struct lp_setup_context *setup ); 62946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 63946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 649f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic void 659f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_setup_get_empty_scene(struct lp_setup_context *setup) 6622b07b8be4c2939b00e10f17fa91e68682808594Brian Paul{ 679f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(setup->scene == NULL); 689f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 699f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->scene_idx++; 709f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->scene_idx %= Elements(setup->scenes); 719f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 729f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->scene = setup->scenes[setup->scene_idx]; 739f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 749f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (setup->scene->fence) { 759f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (LP_DEBUG & DEBUG_SETUP) 769f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell debug_printf("%s: wait for scene %d\n", 779f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell __FUNCTION__, setup->scene->fence->id); 789f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 799f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_fence_wait(setup->scene->fence); 803bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul } 819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 829f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_scene_begin_binning(setup->scene, &setup->fb); 839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 8422b07b8be4c2939b00e10f17fa91e68682808594Brian Paul} 85946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 86946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 874d2b0eb19e432f83845a55d552b5d1d61f040459José Fonsecastatic void 883160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_triangle( struct lp_setup_context *setup, 89253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 90253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4], 91253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v2)[4]) 924d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca{ 939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(setup->state == SETUP_ACTIVE); 94253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_triangle( setup ); 95253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 96253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 974d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 98253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 993160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_line( struct lp_setup_context *setup, 100253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 101253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4]) 102253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 1039f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(setup->state == SETUP_ACTIVE); 104253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_line( setup ); 105253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line( setup, v0, v1 ); 1064d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca} 1074d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 108253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 1093160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_point( struct lp_setup_context *setup, 110253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4]) 111253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 1129f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(setup->state == SETUP_ACTIVE); 113253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_point( setup ); 114253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point( setup, v0 ); 115253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 1164d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 1179f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic void lp_setup_reset( struct lp_setup_context *setup ) 118931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 119a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 1204d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 121301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca /* Reset derived state */ 1222e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = 0; 1232e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = NULL; 124301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca setup->fs.stored = NULL; 125f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty = ~0; 126946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1273bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul /* no current bin */ 128663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell setup->scene = NULL; 129946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1300718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Reset some state: 1310718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 132c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell memset(&setup->clear, 0, sizeof setup->clear); 133946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 134253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Have an explicit "start-binning" call and get rid of this 135253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * pointer twiddling? 136946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 137253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line = first_line; 138253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point = first_point; 139253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle = first_triangle; 140946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 141946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 142946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 143663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell/** Rasterize all scene's bins */ 144931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 145b73c9ba9195ac436960b90649db35bb11d23f9d0Brian Paullp_setup_rasterize_scene( struct lp_setup_context *setup ) 146946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 1479f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scene; 148edac740095fb2514b512034b334947f72648cd51Roland Scheidegger struct llvmpipe_screen *screen = llvmpipe_screen(scene->pipe->screen); 149946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1509f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_scene_end_binning(scene); 1519f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 15218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_reference(&setup->last_fence, scene->fence); 15318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 15418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (setup->last_fence) 15518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell setup->last_fence->issued = TRUE; 15618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 157edac740095fb2514b512034b334947f72648cd51Roland Scheidegger pipe_mutex_lock(screen->rast_mutex); 1589f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_rast_queue_scene(screen->rast, scene); 1599f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_rast_finish(screen->rast); 160edac740095fb2514b512034b334947f72648cd51Roland Scheidegger pipe_mutex_unlock(screen->rast_mutex); 161946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1629f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_scene_end_rasterization(setup->scene); 1639f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_setup_reset( setup ); 164946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 165a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__); 16680eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell} 16780eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 168931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 169931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 170ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean 1713160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecabegin_binning( struct lp_setup_context *setup ) 17280eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell{ 1739f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scene; 1741e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger boolean need_zsload = FALSE; 1759f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell boolean ok; 1769f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell unsigned i, j; 17718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 178040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell assert(scene); 179040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell assert(scene->fence == NULL); 180040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell 181040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell /* Always create a fence: 18218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell */ 183040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell scene->fence = lp_fence_create(MAX2(1, setup->num_threads)); 184ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!scene->fence) 185ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 186040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell 1879f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell /* Initialize the bin flags and x/y coords: 1889f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell */ 1899f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell for (i = 0; i < scene->tiles_x; i++) { 1909f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell for (j = 0; j < scene->tiles_y; j++) { 1919f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell scene->tile[i][j].x = i; 1929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell scene->tile[i][j].y = j; 1939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 1949f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 1959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 1969f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell ok = try_update_scene_state(setup); 197ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!ok) 198ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 19918452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 2001e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (setup->fb.zsbuf && 2011e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger ((setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) && 2021e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger util_format_is_depth_and_stencil(setup->fb.zsbuf->format)) 2031e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger need_zsload = TRUE; 20422b07b8be4c2939b00e10f17fa91e68682808594Brian Paul 205da45f49cc63fff06513dc28d9616084fc81798d4Keith Whitwell LP_DBG(DEBUG_SETUP, "%s color: %s depth: %s\n", __FUNCTION__, 206da45f49cc63fff06513dc28d9616084fc81798d4Keith Whitwell (setup->clear.flags & PIPE_CLEAR_COLOR) ? "clear": "load", 2071e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger need_zsload ? "clear": "load"); 208402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 209c1a04416023e24621e4992caf593e8dfe8d7a2fcKeith Whitwell if (setup->fb.nr_cbufs) { 2100639765b2850739af1678f10fc0c5706d5827776Brian Paul if (setup->clear.flags & PIPE_CLEAR_COLOR) { 2116419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell ok = lp_scene_bin_everywhere( scene, 2129f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_CLEAR_COLOR, 2136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->clear.color ); 214ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!ok) 215ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 2160639765b2850739af1678f10fc0c5706d5827776Brian Paul } 217931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 218931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 2197f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell if (setup->fb.zsbuf) { 2200639765b2850739af1678f10fc0c5706d5827776Brian Paul if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) { 2211e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (!need_zsload) 2221e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger scene->has_depthstencil_clear = TRUE; 223ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 2246419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell ok = lp_scene_bin_everywhere( scene, 2259f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_CLEAR_ZSTENCIL, 2266419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell lp_rast_arg_clearzs( 2279f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->clear.zsvalue, 2289f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->clear.zsmask)); 229ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!ok) 230ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 2310639765b2850739af1678f10fc0c5706d5827776Brian Paul } 232931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 2333094fc200920f9d5eb62136d3b25896229fb0dbfBrian Paul 23418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (setup->active_query) { 2356419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell ok = lp_scene_bin_everywhere( scene, 2369f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_BEGIN_QUERY, 2376419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell lp_rast_arg_query(setup->active_query) ); 238ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!ok) 239ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 24018452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell } 24118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 2429f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->clear.flags = 0; 2439f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->clear.zsmask = 0; 2449f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->clear.zsvalue = 0; 2459f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 246a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s done\n", __FUNCTION__); 247ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 248946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 249946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 250946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 251931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen 252931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears. 253931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * 254931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles. 255b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca */ 256ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean 2573160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaexecute_clears( struct lp_setup_context *setup ) 258b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca{ 259a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 260b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 261ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return begin_binning( setup ); 262b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca} 263b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 2649f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellconst char *states[] = { 2659f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell "FLUSHED", 2669f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell "EMPTY ", 2679f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell "CLEARED", 2689f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell "ACTIVE " 2699f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell}; 2709f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 271b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 272ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean 2733160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaset_scene_state( struct lp_setup_context *setup, 2749f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell enum setup_state new_state, 2759f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell const char *reason) 276946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 277931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned old_state = setup->state; 27880eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 279931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == new_state) 280ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 2819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 28210d0a835bc3d8eb89637381be41ffd463f363b75Keith Whitwell if (LP_DEBUG & DEBUG_SCENE) { 2839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell debug_printf("%s old %s new %s%s%s\n", 2849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell __FUNCTION__, 2859f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell states[old_state], 2869f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell states[new_state], 2879f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell (new_state == SETUP_FLUSHED) ? ": " : "", 2889f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell (new_state == SETUP_FLUSHED) ? reason : ""); 289f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell 290f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell if (new_state == SETUP_FLUSHED && setup->scene) 29110d0a835bc3d8eb89637381be41ffd463f363b75Keith Whitwell lp_debug_draw_bins_by_cmd_length(setup->scene); 2929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 293a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca 2949f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell /* wait for a free/empty scene 2959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell */ 2969f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (old_state == SETUP_FLUSHED) 2979f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_setup_get_empty_scene(setup); 298931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 2999f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell switch (new_state) { 300931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_CLEARED: 301a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca break; 302a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca 303a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca case SETUP_ACTIVE: 304ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!begin_binning( setup )) 305ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell goto fail; 306931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 307a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca 308931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_FLUSHED: 3090718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (old_state == SETUP_CLEARED) 310ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!execute_clears( setup )) 311ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell goto fail; 3129f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 3139f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_setup_rasterize_scene( setup ); 314a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca assert(setup->scene == NULL); 315931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 3160639765b2850739af1678f10fc0c5706d5827776Brian Paul 3170639765b2850739af1678f10fc0c5706d5827776Brian Paul default: 3180639765b2850739af1678f10fc0c5706d5827776Brian Paul assert(0 && "invalid setup state mode"); 319ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell goto fail; 320946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 321946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 322931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->state = new_state; 323ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 324ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 325ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellfail: 326ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (setup->scene) { 327ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell lp_scene_end_rasterization(setup->scene); 328ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell setup->scene = NULL; 329ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell } 330ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 331ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell setup->state = SETUP_FLUSHED; 332ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell lp_setup_reset( setup ); 333ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 334946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 335946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 336946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3370639765b2850739af1678f10fc0c5706d5827776Brian Paul/** 3380639765b2850739af1678f10fc0c5706d5827776Brian Paul * \param flags bitmask of PIPE_FLUSH_x flags 3390639765b2850739af1678f10fc0c5706d5827776Brian Paul */ 340946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid 3413160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_flush( struct lp_setup_context *setup, 3423bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell unsigned flags, 343b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell struct pipe_fence_handle **fence, 344b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell const char *reason) 345946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 3469f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell set_scene_state( setup, SETUP_FLUSHED, reason ); 3473bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell 34818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (fence) { 34918452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_reference((struct lp_fence **)fence, setup->last_fence); 3500639765b2850739af1678f10fc0c5706d5827776Brian Paul } 351946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 352946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 353946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 354931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 3553160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_bind_framebuffer( struct lp_setup_context *setup, 3569fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul const struct pipe_framebuffer_state *fb ) 357946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 358a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 359946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3605fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /* Flush any old scene. 3615fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 3629f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ ); 363677a055fa0cf7b6476c716be187513c41060d417José Fonseca 3648be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca /* 3658be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca * Ensure the old scene is not reused. 3668be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca */ 3678be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca assert(!setup->scene); 3688be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca 3695fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /* Set new state. This will be picked up later when we next need a 3705fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell * scene. 3715fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 3727f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell util_copy_framebuffer_state(&setup->fb, fb); 37329bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->framebuffer.x0 = 0; 37429bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->framebuffer.y0 = 0; 37529bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->framebuffer.x1 = fb->width-1; 37629bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->framebuffer.y1 = fb->height-1; 37729bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->dirty |= LP_SETUP_NEW_SCISSOR; 378946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 379946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 380946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3816419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean 3826419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_try_clear( struct lp_setup_context *setup, 3836419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell const float *color, 3846419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell double depth, 3856419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell unsigned stencil, 3866419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell unsigned flags ) 38717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{ 388c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell uint32_t zsmask = 0; 389c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell uint32_t zsvalue = 0; 3909f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell union lp_rast_cmd_arg color_arg; 391659609e0ae27071a601794935c85547e315dedebJosé Fonseca unsigned i; 39217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 393a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state); 39417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 3954cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_COLOR) { 396c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell for (i = 0; i < 4; i++) 3979f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell color_arg.clear_color[i] = float_to_ubyte(color[i]); 39817aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 39917aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 4004cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 4019fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca uint32_t zmask = (flags & PIPE_CLEAR_DEPTH) ? ~0 : 0; 4029fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca uint32_t smask = (flags & PIPE_CLEAR_STENCIL) ? ~0 : 0; 4039f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 404c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell zsvalue = util_pack_z_stencil(setup->fb.zsbuf->format, 405c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell depth, 406c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell stencil); 407c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell 4089fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca 4099fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca zsmask = util_pack_mask_z_stencil(setup->fb.zsbuf->format, 4109f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell zmask, 4119f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell smask); 4129fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca 4139fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca zsvalue &= zsmask; 41417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 41517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 416931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (setup->state == SETUP_ACTIVE) { 4179f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scene; 4189f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 419663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* Add the clear to existing scene. In the unusual case where 4209a6567f1ed88727545f747e8670b713f17627c94Brian Paul * both color and depth-stencil are being cleared when there's 4219a6567f1ed88727545f747e8670b713f17627c94Brian Paul * already been some rendering, we could discard the currently 4229a6567f1ed88727545f747e8670b713f17627c94Brian Paul * binned scene and start again, but I don't see that as being 4239a6567f1ed88727545f747e8670b713f17627c94Brian Paul * a common usage. 424253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 4250639765b2850739af1678f10fc0c5706d5827776Brian Paul if (flags & PIPE_CLEAR_COLOR) { 4266419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_scene_bin_everywhere( scene, 4279f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_CLEAR_COLOR, 4289f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell color_arg )) 4296419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 4300639765b2850739af1678f10fc0c5706d5827776Brian Paul } 43117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 4321e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 4336419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_scene_bin_everywhere( scene, 4349f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_CLEAR_ZSTENCIL, 4359f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_rast_arg_clearzs(zsvalue, zsmask) )) 4366419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 4370639765b2850739af1678f10fc0c5706d5827776Brian Paul } 438946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 439946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 440253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Put ourselves into the 'pre-clear' state, specifically to try 441253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * and accumulate multiple clears to color and depth_stencil 442253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * buffers which the app or state-tracker might issue 443253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * separately. 44417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca */ 4459f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell set_scene_state( setup, SETUP_CLEARED, __FUNCTION__ ); 4460718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 447931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->clear.flags |= flags; 448c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell 449c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 450c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell setup->clear.zsmask |= zsmask; 451c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell setup->clear.zsvalue = 452c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell (setup->clear.zsvalue & ~zsmask) | (zsvalue & zsmask); 453c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell } 454c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell 455c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell if (flags & PIPE_CLEAR_COLOR) { 456c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell memcpy(setup->clear.color.clear_color, 4579f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell &color_arg, 4589fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca sizeof setup->clear.color.clear_color); 459c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell } 46017aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 4619f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 4626419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return TRUE; 4636419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell} 464946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 4656419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellvoid 4666419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_clear( struct lp_setup_context *setup, 4676419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell const float *color, 4686419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell double depth, 4696419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell unsigned stencil, 4706419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell unsigned flags ) 471946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 4726419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_setup_try_clear( setup, color, depth, stencil, flags )) { 4736419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell lp_setup_flush(setup, 0, NULL, __FUNCTION__); 474946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 4756419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_setup_try_clear( setup, color, depth, stencil, flags )) 4766419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell assert(0); 4776419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 4786419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell} 479a9063cad0f0190ff88cd20fbad5aa87bf1a943f6Brian Paul 4803bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell 481946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 482946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 483946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 484415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid 4853160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_triangle_state( struct lp_setup_context *setup, 486e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell unsigned cull_mode, 487fdfe06ad804ea13e6e436d66c1bcafe0bde2f545Brian Paul boolean ccw_is_frontface, 488a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca boolean scissor, 489a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca boolean gl_rasterization_rules) 490415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{ 491a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 492946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 493415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->ccw_is_frontface = ccw_is_frontface; 494415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->cullmode = cull_mode; 495415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->triangle = first_triangle; 496a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca setup->pixel_offset = gl_rasterization_rules ? 0.5f : 0.0f; 49729bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell 49829bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell if (setup->scissor_test != scissor) { 49929bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->dirty |= LP_SETUP_NEW_SCISSOR; 50029bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->scissor_test = scissor; 50129bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell } 502946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 503946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5045286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tayvoid 5055286dd701640976ffc328e8e85fb3830746851a1Hui Qi Taylp_setup_set_line_state( struct lp_setup_context *setup, 5065286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay float line_width) 5075286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay{ 5085286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 509946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5105286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay setup->line_width = line_width; 5115286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay} 512946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 51357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tayvoid 51457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taylp_setup_set_point_state( struct lp_setup_context *setup, 51529ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay float point_size, 51629ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay boolean point_size_per_vertex, 517c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul uint sprite_coord_enable, 518c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul uint sprite_coord_origin) 51957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{ 52057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 52157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 52257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay setup->point_size = point_size; 523c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul setup->sprite_coord_enable = sprite_coord_enable; 524c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul setup->sprite_coord_origin = sprite_coord_origin; 52529ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay setup->point_size_per_vertex = point_size_per_vertex; 52657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay} 52757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 528931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 5293160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_inputs( struct lp_setup_context *setup, 530253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const struct lp_shader_input *input, 531931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned nr ) 532946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 533a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %p %u\n", __FUNCTION__, (void *) input, nr); 534946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 535253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell memcpy( setup->fs.input, input, nr * sizeof input[0] ); 536253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->fs.nr_inputs = nr; 537931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 538946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5390718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid 54018fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecalp_setup_set_fs_variant( struct lp_setup_context *setup, 54118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca struct lp_fragment_shader_variant *variant) 542946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 543d9096926f84b33e122e3b2942ff66dc183894b50Brian Paul LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, 54418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca variant); 545d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: reference count */ 546946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 54718fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca setup->fs.current.variant = variant; 5480e042bed49c51fef38b02b7cc05efa504f2f703dBrian Paul setup->dirty |= LP_SETUP_NEW_FS; 549946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 550946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 551d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 5523160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_constants(struct lp_setup_context *setup, 553287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *buffer) 554946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 555a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) buffer); 556402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 557287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&setup->constants.current, buffer); 558931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 5592e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_CONSTANTS; 560946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 561946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 562946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 563d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 5643160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_alpha_ref_value( struct lp_setup_context *setup, 565d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca float alpha_ref_value ) 566946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 567a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %f\n", __FUNCTION__, alpha_ref_value); 568946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 56985999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) { 57085999695829823e459e11822b4846ed1db5c055dJosé Fonseca setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value; 5712e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 572d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 573d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 574946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 575d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 576eee51147979208feffdf37c588ebbce4df6b40d6Brian Paullp_setup_set_stencil_ref_values( struct lp_setup_context *setup, 577eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul const ubyte refs[2] ) 578eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul{ 579eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul LP_DBG(DEBUG_SETUP, "%s %d %d\n", __FUNCTION__, refs[0], refs[1]); 580eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul 581521c61ff017ab15b829abbe9a98b179136a36009Brian Paul if (setup->fs.current.jit_context.stencil_ref_front != refs[0] || 582521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_back != refs[1]) { 583521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_front = refs[0]; 584521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_back = refs[1]; 585eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul setup->dirty |= LP_SETUP_NEW_FS; 586eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul } 587eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul} 588eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul 589eee51147979208feffdf37c588ebbce4df6b40d6Brian Paulvoid 5903160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_blend_color( struct lp_setup_context *setup, 591d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca const struct pipe_blend_color *blend_color ) 592d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 593a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 594946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 595f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca assert(blend_color); 596946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 597f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) { 598f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color); 599f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty |= LP_SETUP_NEW_BLEND_COLOR; 600d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 601d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 602946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 603946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6044461442849bfdb817334b38567136f7f9dabdf59Brian Paulvoid 6053160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_scissor( struct lp_setup_context *setup, 6064461442849bfdb817334b38567136f7f9dabdf59Brian Paul const struct pipe_scissor_state *scissor ) 6074461442849bfdb817334b38567136f7f9dabdf59Brian Paul{ 6084461442849bfdb817334b38567136f7f9dabdf59Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 609946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6104461442849bfdb817334b38567136f7f9dabdf59Brian Paul assert(scissor); 611946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 61229bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->scissor.x0 = scissor->minx; 61329bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->scissor.x1 = scissor->maxx-1; 61429bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->scissor.y0 = scissor->miny; 61529bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->scissor.y1 = scissor->maxy-1; 61629bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->dirty |= LP_SETUP_NEW_SCISSOR; 617946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 618946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 619946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6205ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid 6213160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_flatshade_first( struct lp_setup_context *setup, 6225ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell boolean flatshade_first ) 623946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 6245ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->flatshade_first = flatshade_first; 62517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca} 62617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 62717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 6285ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid 6293160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_vertex_info( struct lp_setup_context *setup, 6305ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell struct vertex_info *vertex_info ) 63117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{ 6325ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell /* XXX: just silently holding onto the pointer: 6335ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell */ 6345ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->vertex_info = vertex_info; 635946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 636946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 637946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 638946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 6391fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol * Called during state validation when LP_NEW_SAMPLER_VIEW is set. 640946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 641d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 64247bfbd452c93e6a8db013fb90d9f42210cf24889Keith Whitwelllp_setup_set_fragment_sampler_views(struct lp_setup_context *setup, 6431fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol unsigned num, 644fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca struct pipe_sampler_view **views) 645946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 64617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca unsigned i; 647d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 648a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 649402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 650d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca assert(num <= PIPE_MAX_SAMPLERS); 651d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 652d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { 6531fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol struct pipe_sampler_view *view = i < num ? views[i] : NULL; 654d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 655fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca if (view) { 656287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *tex = view->texture; 657287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct llvmpipe_resource *lp_tex = llvmpipe_resource(tex); 65885999695829823e459e11822b4846ed1db5c055dJosé Fonseca struct lp_jit_texture *jit_tex; 65985999695829823e459e11822b4846ed1db5c055dJosé Fonseca jit_tex = &setup->fs.current.jit_context.textures[i]; 660080c40ab32b2abd6d8381b4a0cc143d36a1652b2José Fonseca jit_tex->width = tex->width0; 661080c40ab32b2abd6d8381b4a0cc143d36a1652b2José Fonseca jit_tex->height = tex->height0; 662b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul jit_tex->depth = tex->depth0; 663b5038fdd65535012086535c6a87bc56c91a65c87Brian Paul jit_tex->last_level = tex->last_level; 6642ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 6652ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul /* We're referencing the texture's internal data, so save a 6662ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul * reference to it. 6672ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul */ 668287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&setup->fs.current_tex[i], tex); 6692ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 670f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul if (!lp_tex->dt) { 671f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul /* regular texture - setup array of mipmap level pointers */ 672f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul int j; 67319371fb60da8ec27a6024d0bf38b82cf3ca787e4Brian Paul for (j = 0; j <= tex->last_level; j++) { 6740639765b2850739af1678f10fc0c5706d5827776Brian Paul jit_tex->data[j] = 675202ff7db490f4a1d041a88f11665fbd3ccea2201Brian Paul llvmpipe_get_texture_image_all(lp_tex, j, LP_TEX_USAGE_READ, 676202ff7db490f4a1d041a88f11665fbd3ccea2201Brian Paul LP_TEX_LAYOUT_LINEAR); 677f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul jit_tex->row_stride[j] = lp_tex->row_stride[j]; 678f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul jit_tex->img_stride[j] = lp_tex->img_stride[j]; 6792b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul 6805f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell if ((LP_PERF & PERF_TEX_MEM) || 6815f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell !jit_tex->data[j]) { 6822b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul /* out of memory - use dummy tile memory */ 6832f6d47a7c8d6e69e5154de44115aab9ba35a41d2Keith Whitwell jit_tex->data[j] = lp_dummy_tile; 6845f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell jit_tex->width = TILE_SIZE/8; 6855f00819cb382bdb70c29e2db3c6ff22a879bf10fKeith Whitwell jit_tex->height = TILE_SIZE/8; 6862b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul jit_tex->depth = 1; 6872b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul jit_tex->last_level = 0; 6882b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul jit_tex->row_stride[j] = 0; 6892b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul jit_tex->img_stride[j] = 0; 6902b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul } 691f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul } 692b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca } 693b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca else { 694f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul /* display target texture/surface */ 695b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca /* 696b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca * XXX: Where should this be unmapped? 697b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca */ 698b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca struct llvmpipe_screen *screen = llvmpipe_screen(tex->screen); 69994ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct sw_winsys *winsys = screen->winsys; 700f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul jit_tex->data[0] = winsys->displaytarget_map(winsys, lp_tex->dt, 701287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PIPE_TRANSFER_READ); 702f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul jit_tex->row_stride[0] = lp_tex->row_stride[0]; 703f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul jit_tex->img_stride[0] = lp_tex->img_stride[0]; 704f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul assert(jit_tex->data[0]); 705b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca } 706d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 70717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 708d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 7092e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 710946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 711946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 712946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 713946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 714fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca * Called during state validation when LP_NEW_SAMPLER is set. 715fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca */ 716fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonsecavoid 717fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonsecalp_setup_set_fragment_sampler_state(struct lp_setup_context *setup, 718fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca unsigned num, 719fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca const struct pipe_sampler_state **samplers) 720fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca{ 721fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca unsigned i; 722fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 723fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 724fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 725fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca assert(num <= PIPE_MAX_SAMPLERS); 726fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 727fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { 728fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca const struct pipe_sampler_state *sampler = i < num ? samplers[i] : NULL; 729fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 730fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca if (sampler) { 731fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca struct lp_jit_texture *jit_tex; 732fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca jit_tex = &setup->fs.current.jit_context.textures[i]; 733fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 734fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca jit_tex->min_lod = sampler->min_lod; 735fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca jit_tex->max_lod = sampler->max_lod; 736fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca jit_tex->lod_bias = sampler->lod_bias; 737fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca COPY_4V(jit_tex->border_color, sampler->border_color); 738fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca } 739fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca } 740fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 741fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca setup->dirty |= LP_SETUP_NEW_FS; 742fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca} 743fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 744fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 745fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca/** 746d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Is the given texture referenced by any scene? 747d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Note: we have to check all scenes including any scenes currently 748d59fe448967addb3025d7df90888ff950e03a343Brian Paul * being rendered and the current scene being built. 749946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 750cd9d9e2436a0815f6ed3a61d2cdf8fad53278506Brian Paulunsigned 751287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwelllp_setup_is_resource_referenced( const struct lp_setup_context *setup, 752287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource *texture ) 753946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 754d59fe448967addb3025d7df90888ff950e03a343Brian Paul unsigned i; 755946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 75612872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul /* check the render targets */ 75712872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul for (i = 0; i < setup->fb.nr_cbufs; i++) { 75812872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul if (setup->fb.cbufs[i]->texture == texture) 75912872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 76012872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul } 761018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) { 76212872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE; 763946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 764946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 765018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul /* check textures referenced by the scene */ 766018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul for (i = 0; i < Elements(setup->scenes); i++) { 767287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (lp_scene_is_resource_referenced(setup->scenes[i], texture)) { 768018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul return PIPE_REFERENCED_FOR_READ; 769018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul } 770946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 771946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 772c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca return PIPE_UNREFERENCED; 773946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 774946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 775946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 776946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 777a27b12171d84c6e731af08f48a657c377f8549baBrian Paul * Called by vbuf code when we're about to draw something. 778946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 7796419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean 7806419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelltry_update_scene_state( struct lp_setup_context *setup ) 781946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 7829f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell boolean new_scene = (setup->fs.stored == NULL); 7839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scene; 784bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul 7859f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(scene); 786946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 787f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) { 788f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca uint8_t *stored; 789f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca unsigned i, j; 79080eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 791663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell stored = lp_scene_alloc_aligned(scene, 4 * 16, 16); 7929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (!stored) { 7939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(!new_scene); 7946419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 7959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 7966419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 7976419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell /* smear each blend color component across 16 ubyte elements */ 7986419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell for (i = 0; i < 4; ++i) { 7996419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]); 8006419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell for (j = 0; j < 16; ++j) 8016419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell stored[i*16 + j] = c; 802477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul } 803f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca 8046419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->blend_color.stored = stored; 8056419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->fs.current.jit_context.blend_color = setup->blend_color.stored; 806f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty |= LP_SETUP_NEW_FS; 807946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 808946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 8092e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->dirty & LP_SETUP_NEW_CONSTANTS) { 810287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell struct pipe_resource *buffer = setup->constants.current; 811946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 8122e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(buffer) { 813287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell unsigned current_size = buffer->width0; 8140639765b2850739af1678f10fc0c5706d5827776Brian Paul const void *current_data = llvmpipe_resource_data(buffer); 815946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 8162e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca /* TODO: copy only the actually used constants? */ 817946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 8182e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->constants.stored_size != current_size || 8192e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca !setup->constants.stored_data || 8202e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca memcmp(setup->constants.stored_data, 8212e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_data, 8222e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_size) != 0) { 8232e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca void *stored; 824946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 825663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell stored = lp_scene_alloc(scene, current_size); 8269f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (!stored) { 8279f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(!new_scene); 8286419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 8299f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 8306419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 8316419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell memcpy(stored, 8326419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell current_data, 8336419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell current_size); 8346419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->constants.stored_size = current_size; 8356419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->constants.stored_data = stored; 836946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 837946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 838946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 8392e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = 0; 8402e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = NULL; 8412e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 842946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 8432e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->fs.current.jit_context.constants = setup->constants.stored_data; 8442e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 8452e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 8462e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 8472e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 8486419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (setup->dirty & LP_SETUP_NEW_FS) { 8496419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!setup->fs.stored || 8506419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell memcmp(setup->fs.stored, 8516419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell &setup->fs.current, 8526419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell sizeof setup->fs.current) != 0) 8536419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell { 8546419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell struct lp_rast_state *stored; 8556419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell uint i; 8566419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 857663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* The fs state that's been stored in the scene is different from 858e2f46344560f8f1193b311ad41883011e67eea00Brian Paul * the new, current state. So allocate a new lp_rast_state object 859e2f46344560f8f1193b311ad41883011e67eea00Brian Paul * and append it to the bin's setup data buffer. 860e2f46344560f8f1193b311ad41883011e67eea00Brian Paul */ 8616419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell stored = (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored); 8629f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (!stored) { 8639f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(!new_scene); 8646419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 8659f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 8662ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 8676419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell memcpy(stored, 8686419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell &setup->fs.current, 8696419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell sizeof setup->fs.current); 8706419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->fs.stored = stored; 8716419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 8722ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul /* The scene now references the textures in the rasterization 8732ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul * state record. Note that now. 8742ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul */ 8752ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul for (i = 0; i < Elements(setup->fs.current_tex); i++) { 8766419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (setup->fs.current_tex[i]) { 8776419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_scene_add_resource_reference(scene, 8789f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->fs.current_tex[i], 8799f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell new_scene)) { 8809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(!new_scene); 8816419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 8829f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 8836419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 884d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell } 885d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell } 886d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell } 887d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell 88829bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell if (setup->dirty & LP_SETUP_NEW_SCISSOR) { 88929bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->draw_region = setup->framebuffer; 89029bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell if (setup->scissor_test) { 89129bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell u_rect_possible_intersection(&setup->scissor, 89229bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell &setup->draw_region); 89329bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell } 89429bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell } 89529bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell 8962e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty = 0; 8972e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 89885999695829823e459e11822b4846ed1db5c055dJosé Fonseca assert(setup->fs.stored); 8996419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return TRUE; 9006419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell} 9016419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 902ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellboolean 9039f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_setup_update_state( struct lp_setup_context *setup, 9049f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell boolean update_scene ) 9056419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{ 9066419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell /* Some of the 'draw' pipeline stages may have changed some driver state. 9076419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * Make sure we've processed those state changes before anything else. 9086419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * 9096419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * XXX this is the only place where llvmpipe_context is used in the 9106419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * setup code. This may get refactored/changed... 9116419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 9126419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell { 9136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell struct llvmpipe_context *lp = llvmpipe_context(setup->pipe); 9146419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (lp->dirty) { 9156419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell llvmpipe_update_derived(lp); 9166419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 9176419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 9186419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell /* Will probably need to move this somewhere else, just need 9196419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * to know about vertex shader point size attribute. 9206419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 9216419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->psize = lp->psize_slot; 9226419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 9236419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell assert(lp->dirty == 0); 9246419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 9256419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 926ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (update_scene) { 927ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!set_scene_state( setup, SETUP_ACTIVE, __FUNCTION__ )) 928ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 929ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell } 9309f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 9319f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell /* Only call into update_scene_state() if we already have a 9326419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * scene: 9336419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 9349f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (update_scene && setup->scene) { 9359f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(setup->state == SETUP_ACTIVE); 936ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 937ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (try_update_scene_state(setup)) 938ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 939ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 940ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell /* Update failed, try to restart the scene. 941ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell * 942ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell * Cannot call lp_setup_flush_and_restart() directly here 943ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell * because of potential recursion. 944ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell */ 945ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__)) 946ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 947ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 948ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!set_scene_state(setup, SETUP_ACTIVE, __FUNCTION__)) 949ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 950ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 951ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!setup->scene) 952ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 953ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 954ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return try_update_scene_state(setup); 9556419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 956ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 957ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 958946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 959946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 960608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 961946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 962b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell/* Only caller is lp_setup_vbuf_destroy() 963b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell */ 964253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid 9653160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_destroy( struct lp_setup_context *setup ) 966946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 9672ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul uint i; 9682ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 9699f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_setup_reset( setup ); 970946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 9715f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul util_unreference_framebuffer_state(&setup->fb); 9725f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul 9732ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul for (i = 0; i < Elements(setup->fs.current_tex); i++) { 974287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&setup->fs.current_tex[i], NULL); 9752ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul } 9762ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 977287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&setup->constants.current, NULL); 978946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 979663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* free the scenes in the 'empty' queue */ 9809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell for (i = 0; i < Elements(setup->scenes); i++) { 9819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scenes[i]; 9829f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 9839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (scene->fence) 9849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_fence_wait(scene->fence); 9859f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 986663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_destroy(scene); 987946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 988946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 98989498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell FREE( setup ); 990946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 991946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 992946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 993946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 9945ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * Create a new primitive tiling engine. Plug it into the backend of 9955ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * the draw module. Currently also creates a rasterizer to use with 9965ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * it. 997946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 9983160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastruct lp_setup_context * 9995fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwelllp_setup_create( struct pipe_context *pipe, 10005ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell struct draw_context *draw ) 1001946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 100239be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen); 10033160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonseca struct lp_setup_context *setup = CALLOC_STRUCT(lp_setup_context); 100439be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca unsigned i; 1005946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1006a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell if (!setup) 1007a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell return NULL; 1008a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell 10095ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell lp_setup_init_vbuf(setup); 10106419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 10116419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell /* Used only in update_state(): 10126419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 10136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->pipe = pipe; 10145ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 1015946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 101639be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca setup->num_threads = screen->num_threads; 10175ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->vbuf = draw_vbuf_stage(draw, &setup->base); 10185ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell if (!setup->vbuf) 10195ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell goto fail; 10205ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 10215ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell draw_set_rasterize_stage(draw, setup->vbuf); 10225ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell draw_set_render(draw, &setup->base); 10235ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 1024663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* create some empty scenes */ 1025663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell for (i = 0; i < MAX_SCENES; i++) { 10269f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->scenes[i] = lp_scene_create( pipe ); 102780eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell } 1028946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1029163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->triangle = first_triangle; 1030163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->line = first_line; 1031163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->point = first_point; 1032163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell 1033301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca setup->dirty = ~0; 103408811032c2dd8f38d2ef65d7fd8794112e029b63Keith Whitwell 1035946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca return setup; 1036931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1037931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfail: 10385ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell if (setup->vbuf) 10395ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell ; 10405ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 1041931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(setup); 1042931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return NULL; 1043946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 1044946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 104586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 104686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/** 104786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put a BeginQuery command into all bins. 104886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */ 104986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid 105086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_begin_query(struct lp_setup_context *setup, 105186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li struct llvmpipe_query *pq) 105286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{ 105386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li /* init the query to its beginning state */ 105418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell assert(setup->active_query == NULL); 105518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 105618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (setup->scene) { 10576419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_scene_bin_everywhere(setup->scene, 10589f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_BEGIN_QUERY, 10596419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell lp_rast_arg_query(pq))) { 10609f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 1061ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!lp_setup_flush_and_restart(setup)) 1062ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return; 10636419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 10646419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_scene_bin_everywhere(setup->scene, 10659f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_BEGIN_QUERY, 10666419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell lp_rast_arg_query(pq))) { 10676419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return; 10686419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 10696419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 107018452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell } 10718be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca 107218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell setup->active_query = pq; 107386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li} 107486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 107586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 107686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/** 107786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put an EndQuery command into all bins. 107886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */ 107986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid 108086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq) 108186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{ 108218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell union lp_rast_cmd_arg dummy = { 0 }; 108386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 108418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell assert(setup->active_query == pq); 108518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell setup->active_query = NULL; 10868be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca 108718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell /* Setup will automatically re-issue any query which carried over a 108818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell * scene boundary, and the rasterizer automatically "ends" queries 108918452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell * which are active at the end of a scene, so there is no need to 109018452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell * retry this commands on failure. 109118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell */ 109218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (setup->scene) { 109318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell /* pq->fence should be the fence of the *last* scene which 109418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell * contributed to the query result. 109518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell */ 109618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_reference(&pq->fence, setup->scene->fence); 109718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 10989f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (!lp_scene_bin_everywhere(setup->scene, 10999f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_END_QUERY, 11009f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell dummy)) { 11016419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell lp_setup_flush(setup, 0, NULL, __FUNCTION__); 11026419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 110318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell } 110418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell else { 110518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_reference(&pq->fence, setup->last_fence); 110618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell } 110786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li} 110818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 110918452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 1110ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellboolean 11116419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_flush_and_restart(struct lp_setup_context *setup) 11126419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{ 11136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (0) debug_printf("%s\n", __FUNCTION__); 11146419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 11156419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell assert(setup->state == SETUP_ACTIVE); 1116ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1117ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__)) 1118ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 1119ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1120ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!lp_setup_update_state(setup, TRUE)) 1121ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 1122ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1123ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 11246419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell} 11259f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 11269f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 1127