1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**************************************************************************
2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc.
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.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE 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"
42b0a647f284b24ca4e0ee1f70c4839d8ec3d1a4e6Roland Scheidegger#include "util/u_viewport.h"
43c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca#include "draw/draw_pipe.h"
447d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger#include "os/os_time.h"
459fae289fcd098027952c6b586292214ec586a2ecBrian Paul#include "lp_context.h"
462b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul#include "lp_memory.h"
47663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#include "lp_scene.h"
48d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_texture.h"
495ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_debug.h"
505ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_fence.h"
5186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li#include "lp_query.h"
525ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_rast.h"
53d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_setup_context.h"
54b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca#include "lp_screen.h"
559fae289fcd098027952c6b586292214ec586a2ecBrian Paul#include "lp_state.h"
5623e951d0da5802fec70996e46ad6f0abc411594cKeith Whitwell#include "state_tracker/sw_winsys.h"
57946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
585ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_context.h"
595ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_vbuf.h"
6080eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
61677a055fa0cf7b6476c716be187513c41060d417José Fonseca
62ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean set_scene_state( struct lp_setup_context *, enum setup_state,
639f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                             const char *reason);
649f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic boolean try_update_scene_state( struct lp_setup_context *setup );
65946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
66946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
679f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic void
689f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_setup_get_empty_scene(struct lp_setup_context *setup)
6922b07b8be4c2939b00e10f17fa91e68682808594Brian Paul{
70db9a1052d1b2014419134c93aa4e05c9d1579378José Fonseca   assert(setup->scene == NULL);
71db9a1052d1b2014419134c93aa4e05c9d1579378José Fonseca
729f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->scene_idx++;
731d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul   setup->scene_idx %= ARRAY_SIZE(setup->scenes);
749f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
759f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->scene = setup->scenes[setup->scene_idx];
769f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
779f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   if (setup->scene->fence) {
789f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      if (LP_DEBUG & DEBUG_SETUP)
799f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         debug_printf("%s: wait for scene %d\n",
809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                      __FUNCTION__, setup->scene->fence->id);
819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
829f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      lp_fence_wait(setup->scene->fence);
833bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul   }
849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
852d368b982af5e6566c7da7fd2bc8b190af28188bJosé Fonseca   lp_scene_begin_binning(setup->scene, &setup->fb, setup->rasterizer_discard);
862d368b982af5e6566c7da7fd2bc8b190af28188bJosé Fonseca
8722b07b8be4c2939b00e10f17fa91e68682808594Brian Paul}
88946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
89946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
904d2b0eb19e432f83845a55d552b5d1d61f040459José Fonsecastatic void
913160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_triangle( struct lp_setup_context *setup,
92253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v0)[4],
93253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v1)[4],
94253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v2)[4])
954d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca{
969f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
97253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_triangle( setup );
98253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->triangle( setup, v0, v1, v2 );
99253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
1004d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
101253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
1023160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_line( struct lp_setup_context *setup,
103253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	    const float (*v0)[4],
104253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	    const float (*v1)[4])
105253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
1069f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
107253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_line( setup );
108253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->line( setup, v0, v1 );
1094d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca}
1104d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
111253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
1123160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_point( struct lp_setup_context *setup,
113253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	     const float (*v0)[4])
114253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
1159f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
116253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_point( setup );
117253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->point( setup, v0 );
118253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
1194d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
120efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulvoid lp_setup_reset( struct lp_setup_context *setup )
121931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
1221d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   unsigned i;
1231d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca
124a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
1254d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
126301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca   /* Reset derived state */
1271d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul   for (i = 0; i < ARRAY_SIZE(setup->constants); ++i) {
1281d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      setup->constants[i].stored_size = 0;
1291d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      setup->constants[i].stored_data = NULL;
1301d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   }
131301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca   setup->fs.stored = NULL;
132f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   setup->dirty = ~0;
133946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1343bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul   /* no current bin */
135663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   setup->scene = NULL;
136946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1370718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Reset some state:
1380718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
139c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell   memset(&setup->clear, 0, sizeof setup->clear);
140946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
141253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   /* Have an explicit "start-binning" call and get rid of this
142253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell    * pointer twiddling?
143946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca    */
144253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->line = first_line;
145253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->point = first_point;
146253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->triangle = first_triangle;
147946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
148946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
149946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
150663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell/** Rasterize all scene's bins */
151931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
152b73c9ba9195ac436960b90649db35bb11d23f9d0Brian Paullp_setup_rasterize_scene( struct lp_setup_context *setup )
153946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
1549f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   struct lp_scene *scene = setup->scene;
155edac740095fb2514b512034b334947f72648cd51Roland Scheidegger   struct llvmpipe_screen *screen = llvmpipe_screen(scene->pipe->screen);
156946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1572e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   scene->num_active_queries = setup->active_binned_queries;
1582e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   memcpy(scene->active_queries, setup->active_queries,
1592e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger          scene->num_active_queries * sizeof(scene->active_queries[0]));
16008203428800554215657f1ebf19d74328103800eRoland Scheidegger
1619f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_scene_end_binning(scene);
1629f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
16318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   lp_fence_reference(&setup->last_fence, scene->fence);
16418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
16518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (setup->last_fence)
16618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      setup->last_fence->issued = TRUE;
16718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
168edac740095fb2514b512034b334947f72648cd51Roland Scheidegger   pipe_mutex_lock(screen->rast_mutex);
1696f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger
1706f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger   /* FIXME: We enqueue the scene then wait on the rasterizer to finish.
1716f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * This means we never actually run any vertex stuff in parallel to
1726f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * rasterization (not in the same context at least) which is what the
1736f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * multiple scenes per setup is about - when we get a new empty scene
1746f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * any old one is already empty again because we waited here for
1756f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * raster tasks to be finished. Ideally, we shouldn't need to wait here
1766f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * and rely on fences elsewhere when waiting is necessary.
1776f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * Certainly, lp_scene_end_rasterization() would need to be deferred too
1786f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * and there's probably other bits why this doesn't actually work.
1796f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    */
1809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_rast_queue_scene(screen->rast, scene);
1819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_rast_finish(screen->rast);
182edac740095fb2514b512034b334947f72648cd51Roland Scheidegger   pipe_mutex_unlock(screen->rast_mutex);
183946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_scene_end_rasterization(setup->scene);
1859f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_setup_reset( setup );
186946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
187a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__);
18880eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell}
18980eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
190931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
191931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
192ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean
1933160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecabegin_binning( struct lp_setup_context *setup )
19480eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell{
1959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   struct lp_scene *scene = setup->scene;
1961e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger   boolean need_zsload = FALSE;
1979f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   boolean ok;
19818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
199040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   assert(scene);
200040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   assert(scene->fence == NULL);
201040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell
202040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   /* Always create a fence:
20318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell    */
204040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   scene->fence = lp_fence_create(MAX2(1, setup->num_threads));
205ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!scene->fence)
206ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
207040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell
2089f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   ok = try_update_scene_state(setup);
209ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!ok)
210ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
21118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
2121e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger   if (setup->fb.zsbuf &&
2131e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger       ((setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) &&
2141e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger        util_format_is_depth_and_stencil(setup->fb.zsbuf->format))
2151e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger      need_zsload = TRUE;
21622b07b8be4c2939b00e10f17fa91e68682808594Brian Paul
217a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   LP_DBG(DEBUG_SETUP, "%s color clear bufs: %x depth: %s\n", __FUNCTION__,
218a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger          setup->clear.flags >> 2,
2191e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger          need_zsload ? "clear": "load");
220402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
221a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (setup->clear.flags & PIPE_CLEAR_COLOR) {
222a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      unsigned cbuf;
223a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      for (cbuf = 0; cbuf < setup->fb.nr_cbufs; cbuf++) {
224a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         assert(PIPE_CLEAR_COLOR0 == 1 << 2);
225a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         if (setup->clear.flags & (1 << (2 + cbuf))) {
226a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            union lp_rast_cmd_arg clearrb_arg;
227a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            struct lp_rast_clear_rb *cc_scene =
228a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               (struct lp_rast_clear_rb *)
229a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                  lp_scene_alloc(scene, sizeof(struct lp_rast_clear_rb));
230a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
231a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            if (!cc_scene) {
232a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               return FALSE;
233a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            }
234a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
235a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            cc_scene->cbuf = cbuf;
236a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            cc_scene->color_val = setup->clear.color_val[cbuf];
237a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            clearrb_arg.clear_rb = cc_scene;
238a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
239a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            if (!lp_scene_bin_everywhere(scene,
240a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                         LP_RAST_OP_CLEAR_COLOR,
241a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                         clearrb_arg))
242a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               return FALSE;
243a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         }
2440639765b2850739af1678f10fc0c5706d5827776Brian Paul      }
245931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
246931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
2477f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell   if (setup->fb.zsbuf) {
2480639765b2850739af1678f10fc0c5706d5827776Brian Paul      if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) {
2496419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         ok = lp_scene_bin_everywhere( scene,
2509f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                       LP_RAST_OP_CLEAR_ZSTENCIL,
2516419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                                       lp_rast_arg_clearzs(
2529f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                          setup->clear.zsvalue,
2539f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                          setup->clear.zsmask));
254ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         if (!ok)
255ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell            return FALSE;
2560639765b2850739af1678f10fc0c5706d5827776Brian Paul      }
257931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
2583094fc200920f9d5eb62136d3b25896229fb0dbfBrian Paul
2599f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->clear.flags = 0;
2609f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->clear.zsmask = 0;
2619f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->clear.zsvalue = 0;
2629f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
26359b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger   scene->had_queries = !!setup->active_binned_queries;
26459b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger
265a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s done\n", __FUNCTION__);
266ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
267946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
268946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
269946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
270931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen
271931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears.
272931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell *
273931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles.
274b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca */
275ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean
2763160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaexecute_clears( struct lp_setup_context *setup )
277b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca{
278a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
279b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca
280ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return begin_binning( setup );
281b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca}
282b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca
2839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellconst char *states[] = {
2849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   "FLUSHED",
2859f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   "CLEARED",
2869f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   "ACTIVE "
2879f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell};
2889f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
289b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca
290ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean
2913160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaset_scene_state( struct lp_setup_context *setup,
2929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                 enum setup_state new_state,
2939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                 const char *reason)
294946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
295931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   unsigned old_state = setup->state;
29680eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
297931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (old_state == new_state)
298ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return TRUE;
2999f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
30010d0a835bc3d8eb89637381be41ffd463f363b75Keith Whitwell   if (LP_DEBUG & DEBUG_SCENE) {
3019f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      debug_printf("%s old %s new %s%s%s\n",
3029f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   __FUNCTION__,
3039f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   states[old_state],
3049f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   states[new_state],
3059f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   (new_state == SETUP_FLUSHED) ? ": " : "",
3069f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   (new_state == SETUP_FLUSHED) ? reason : "");
307f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
308f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      if (new_state == SETUP_FLUSHED && setup->scene)
30910d0a835bc3d8eb89637381be41ffd463f363b75Keith Whitwell         lp_debug_draw_bins_by_cmd_length(setup->scene);
3109f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   }
311a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca
3129f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   /* wait for a free/empty scene
3139f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell    */
3149f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   if (old_state == SETUP_FLUSHED)
3159f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      lp_setup_get_empty_scene(setup);
316931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
3179f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   switch (new_state) {
318931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_CLEARED:
319a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca      break;
320a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca
321a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca   case SETUP_ACTIVE:
322ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!begin_binning( setup ))
323ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         goto fail;
324931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
325a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca
326931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_FLUSHED:
3270718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (old_state == SETUP_CLEARED)
328ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         if (!execute_clears( setup ))
329ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell            goto fail;
3309f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
3319f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      lp_setup_rasterize_scene( setup );
332a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca      assert(setup->scene == NULL);
333931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
3340639765b2850739af1678f10fc0c5706d5827776Brian Paul
3350639765b2850739af1678f10fc0c5706d5827776Brian Paul   default:
3360639765b2850739af1678f10fc0c5706d5827776Brian Paul      assert(0 && "invalid setup state mode");
337ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      goto fail;
338946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
339946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
340931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->state = new_state;
341ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
342ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
343ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellfail:
344ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (setup->scene) {
345ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      lp_scene_end_rasterization(setup->scene);
346ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      setup->scene = NULL;
347ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   }
348ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
349ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   setup->state = SETUP_FLUSHED;
350ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   lp_setup_reset( setup );
351ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return FALSE;
352946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
353946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
354946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
355946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid
3563160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_flush( struct lp_setup_context *setup,
357b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell                struct pipe_fence_handle **fence,
358b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell                const char *reason)
359946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
3609f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   set_scene_state( setup, SETUP_FLUSHED, reason );
3613bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell
36218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (fence) {
36318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      lp_fence_reference((struct lp_fence **)fence, setup->last_fence);
3640639765b2850739af1678f10fc0c5706d5827776Brian Paul   }
365946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
366946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
367946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
368931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
3693160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_bind_framebuffer( struct lp_setup_context *setup,
3709fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul                           const struct pipe_framebuffer_state *fb )
371946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
372a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
373946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
3745fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell   /* Flush any old scene.
3755fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell    */
3769f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ );
377677a055fa0cf7b6476c716be187513c41060d417José Fonseca
3788be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca   /*
3798be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca    * Ensure the old scene is not reused.
3808be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca    */
3818be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca   assert(!setup->scene);
3828be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca
3835fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell   /* Set new state.  This will be picked up later when we next need a
3845fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell    * scene.
3855fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell    */
3867f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell   util_copy_framebuffer_state(&setup->fb, fb);
38729bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.x0 = 0;
38829bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.y0 = 0;
38929bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.x1 = fb->width-1;
39029bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.y1 = fb->height-1;
39129bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->dirty |= LP_SETUP_NEW_SCISSOR;
392946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
393946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
394946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
395a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger/*
396a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * Try to clear one color buffer of the attached fb, either by binning a clear
397a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * command or queuing up the clear for later (when binning is started).
398a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger */
3996419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean
400a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerlp_setup_try_clear_color_buffer(struct lp_setup_context *setup,
401a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                const union pipe_color_union *color,
402a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                unsigned cbuf)
40317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{
404a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   union lp_rast_cmd_arg clearrb_arg;
405a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   union util_color uc;
406a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   enum pipe_format format = setup->fb.cbufs[cbuf]->format;
40717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
408a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
40917aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
410a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (util_format_is_pure_integer(format)) {
411a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      /*
412a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * We expect int/uint clear values here, though some APIs
413a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * might disagree (but in any case util_pack_color()
414a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * couldn't handle it)...
415a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       */
416a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (util_format_is_pure_sint(format)) {
417a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         util_format_write_4i(format, color->i, 0, &uc, 0, 0, 0, 1, 1);
418a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
419a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      else {
420a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         assert(util_format_is_pure_uint(format));
421a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         util_format_write_4ui(format, color->ui, 0, &uc, 0, 0, 0, 1, 1);
422a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
423a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
424a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   else {
425a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      util_pack_color(color->f, format, &uc);
42617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
42717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
428a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (setup->state == SETUP_ACTIVE) {
429a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      struct lp_scene *scene = setup->scene;
4309f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
431a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      /* Add the clear to existing scene.  In the unusual case where
432a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * both color and depth-stencil are being cleared when there's
433a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * already been some rendering, we could discard the currently
434a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * binned scene and start again, but I don't see that as being
435a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * a common usage.
436a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       */
437a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      struct lp_rast_clear_rb *cc_scene =
438a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         (struct lp_rast_clear_rb *)
439a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            lp_scene_alloc_aligned(scene, sizeof(struct lp_rast_clear_rb), 8);
440c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell
441a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!cc_scene) {
442a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         return FALSE;
443a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
4449fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca
445a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      cc_scene->cbuf = cbuf;
446a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      cc_scene->color_val = uc;
447a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      clearrb_arg.clear_rb = cc_scene;
4489fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca
449a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!lp_scene_bin_everywhere(scene,
450a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   LP_RAST_OP_CLEAR_COLOR,
451a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   clearrb_arg))
452a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         return FALSE;
45317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
454a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   else {
455a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      /* Put ourselves into the 'pre-clear' state, specifically to try
456a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * and accumulate multiple clears to color and depth_stencil
457a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * buffers which the app or state-tracker might issue
458a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * separately.
459a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       */
460a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      set_scene_state( setup, SETUP_CLEARED, __FUNCTION__ );
461a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
462a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      assert(PIPE_CLEAR_COLOR0 == (1 << 2));
463a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.flags |= 1 << (cbuf + 2);
464a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.color_val[cbuf] = uc;
465a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
466a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
467a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   return TRUE;
468a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger}
469a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
470a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerstatic boolean
471a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerlp_setup_try_clear_zs(struct lp_setup_context *setup,
472a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                      double depth,
473a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                      unsigned stencil,
474a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                      unsigned flags)
475a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger{
476a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint64_t zsmask = 0;
477a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint64_t zsvalue = 0;
478a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint32_t zmask32;
479a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint8_t smask8;
480b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger   enum pipe_format format = setup->fb.zsbuf->format;
481a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
482a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
483a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
484a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   zmask32 = (flags & PIPE_CLEAR_DEPTH) ? ~0 : 0;
485a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   smask8 = (flags & PIPE_CLEAR_STENCIL) ? ~0 : 0;
486a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
487b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger   zsvalue = util_pack64_z_stencil(format, depth, stencil);
488a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
489b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger   zsmask = util_pack64_mask_z_stencil(format, zmask32, smask8);
490a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
491a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   zsvalue &= zsmask;
49217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
493b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger   if (format == PIPE_FORMAT_Z24X8_UNORM ||
494b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger       format == PIPE_FORMAT_X8Z24_UNORM) {
495b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger      /*
496b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger       * Make full mask if there's "X" bits so we can do full
497b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger       * clear (without rmw).
498b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger       */
499b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger      uint32_t zsmask_full = 0;
500b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger      zsmask_full = util_pack_mask_z_stencil(format, ~0, ~0);
501b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger      zsmask |= ~zsmask_full;
502b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger   }
503b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger
504931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (setup->state == SETUP_ACTIVE) {
5059f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      struct lp_scene *scene = setup->scene;
5069f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
507663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell      /* Add the clear to existing scene.  In the unusual case where
5089a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * both color and depth-stencil are being cleared when there's
5099a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * already been some rendering, we could discard the currently
5109a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * binned scene and start again, but I don't see that as being
5119a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * a common usage.
512253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       */
513a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!lp_scene_bin_everywhere(scene,
514a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   LP_RAST_OP_CLEAR_ZSTENCIL,
515a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   lp_rast_arg_clearzs(zsvalue, zsmask)))
516a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         return FALSE;
517946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
518946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   else {
519253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell      /* Put ourselves into the 'pre-clear' state, specifically to try
520253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * and accumulate multiple clears to color and depth_stencil
521253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * buffers which the app or state-tracker might issue
522253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * separately.
52317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca       */
5249f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      set_scene_state( setup, SETUP_CLEARED, __FUNCTION__ );
5250718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
526931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      setup->clear.flags |= flags;
527c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell
528a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.zsmask |= zsmask;
529a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.zsvalue =
530a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         (setup->clear.zsvalue & ~zsmask) | (zsvalue & zsmask);
53117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
532a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
5336419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   return TRUE;
5346419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}
535946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
5366419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellvoid
5376419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_clear( struct lp_setup_context *setup,
538babab2876080af0fe65249dff559244aebd0b87eRoland Scheidegger                const union pipe_color_union *color,
5396419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                double depth,
5406419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                unsigned stencil,
5416419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                unsigned flags )
542946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
543a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   unsigned i;
544946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
545a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   /*
546a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * Note any of these (max 9) clears could fail (but at most there should
547a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * be just one failure!). This avoids doing the previous succeeded
548a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * clears again (we still clear tiles twice if a clear command succeeded
549a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * partially for one buffer).
550a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    */
551a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
552a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      unsigned flagszs = flags & PIPE_CLEAR_DEPTHSTENCIL;
553a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs)) {
554a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         lp_setup_flush(setup, NULL, __FUNCTION__);
555a9063cad0f0190ff88cd20fbad5aa87bf1a943f6Brian Paul
556a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs))
557a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            assert(0);
558a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
559a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
5603bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell
561a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (flags & PIPE_CLEAR_COLOR) {
562a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      assert(PIPE_CLEAR_COLOR0 == (1 << 2));
563a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      for (i = 0; i < setup->fb.nr_cbufs; i++) {
564a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         if ((flags & (1 << (2 + i))) && setup->fb.cbufs[i]) {
565a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            if (!lp_setup_try_clear_color_buffer(setup, color, i)) {
566a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               lp_setup_flush(setup, NULL, __FUNCTION__);
567a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
568a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               if (!lp_setup_try_clear_color_buffer(setup, color, i))
569a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                  assert(0);
570a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            }
571a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         }
572a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
573a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
574a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger}
575946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
576946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
577946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
578415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid
5793160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_triangle_state( struct lp_setup_context *setup,
580e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell                             unsigned cull_mode,
581fdfe06ad804ea13e6e436d66c1bcafe0bde2f545Brian Paul                             boolean ccw_is_frontface,
582a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca                             boolean scissor,
5832737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca                             boolean half_pixel_center,
5842737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca                             boolean bottom_edge_rule)
585415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{
586a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
587946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
588415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->ccw_is_frontface = ccw_is_frontface;
589415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->cullmode = cull_mode;
590415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->triangle = first_triangle;
5912737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   setup->pixel_offset = half_pixel_center ? 0.5f : 0.0f;
5922737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   setup->bottom_edge_rule = bottom_edge_rule;
59329bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell
59429bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   if (setup->scissor_test != scissor) {
59529bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell      setup->dirty |= LP_SETUP_NEW_SCISSOR;
59629bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell      setup->scissor_test = scissor;
59729bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   }
598946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
599946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
6005286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tayvoid
6015286dd701640976ffc328e8e85fb3830746851a1Hui Qi Taylp_setup_set_line_state( struct lp_setup_context *setup,
6025286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay			 float line_width)
6035286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay{
6045286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
605946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
6065286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay   setup->line_width = line_width;
6075286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay}
608946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
60957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tayvoid
61057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taylp_setup_set_point_state( struct lp_setup_context *setup,
611a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                          float point_size,
61229ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay                          boolean point_size_per_vertex,
613c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul                          uint sprite_coord_enable,
614c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul                          uint sprite_coord_origin)
61557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{
61657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
61757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
61857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   setup->point_size = point_size;
619c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul   setup->sprite_coord_enable = sprite_coord_enable;
620c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul   setup->sprite_coord_origin = sprite_coord_origin;
62129ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay   setup->point_size_per_vertex = point_size_per_vertex;
62257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay}
62357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
624931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
6255b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwelllp_setup_set_setup_variant( struct lp_setup_context *setup,
6265b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell			    const struct lp_setup_variant *variant)
627946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
6285b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
6295b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
6305b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   setup->setup.variant = variant;
631931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
632946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
6330718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid
63418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecalp_setup_set_fs_variant( struct lp_setup_context *setup,
63518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca                         struct lp_fragment_shader_variant *variant)
636946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
637d9096926f84b33e122e3b2942ff66dc183894b50Brian Paul   LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__,
63818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca          variant);
639d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   /* FIXME: reference count */
640946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
64118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   setup->fs.current.variant = variant;
6420e042bed49c51fef38b02b7cc05efa504f2f703dBrian Paul   setup->dirty |= LP_SETUP_NEW_FS;
643946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
644946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
645d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
6463160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_constants(struct lp_setup_context *setup,
6471d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                          unsigned num,
6483427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul                          struct pipe_constant_buffer *buffers)
649946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
6501d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   unsigned i;
6511d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca
6521d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) buffers);
653402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
6541d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul   assert(num <= ARRAY_SIZE(setup->constants));
655931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
6561d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   for (i = 0; i < num; ++i) {
6573427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul      util_copy_constant_buffer(&setup->constants[i].current, &buffers[i]);
6583427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul   }
6591d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul   for (; i < ARRAY_SIZE(setup->constants); i++) {
6603427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul      util_copy_constant_buffer(&setup->constants[i].current, NULL);
6611d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   }
6623427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul   setup->dirty |= LP_SETUP_NEW_CONSTANTS;
663946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
664946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
665946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
666d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
6673160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_alpha_ref_value( struct lp_setup_context *setup,
668d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                              float alpha_ref_value )
669946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
670a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s %f\n", __FUNCTION__, alpha_ref_value);
671946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
67285999695829823e459e11822b4846ed1db5c055dJosé Fonseca   if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) {
67385999695829823e459e11822b4846ed1db5c055dJosé Fonseca      setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value;
6742e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca      setup->dirty |= LP_SETUP_NEW_FS;
675d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
676d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
677946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
678d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
679eee51147979208feffdf37c588ebbce4df6b40d6Brian Paullp_setup_set_stencil_ref_values( struct lp_setup_context *setup,
680eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul                                 const ubyte refs[2] )
681eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul{
682eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul   LP_DBG(DEBUG_SETUP, "%s %d %d\n", __FUNCTION__, refs[0], refs[1]);
683eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul
684521c61ff017ab15b829abbe9a98b179136a36009Brian Paul   if (setup->fs.current.jit_context.stencil_ref_front != refs[0] ||
685521c61ff017ab15b829abbe9a98b179136a36009Brian Paul       setup->fs.current.jit_context.stencil_ref_back != refs[1]) {
686521c61ff017ab15b829abbe9a98b179136a36009Brian Paul      setup->fs.current.jit_context.stencil_ref_front = refs[0];
687521c61ff017ab15b829abbe9a98b179136a36009Brian Paul      setup->fs.current.jit_context.stencil_ref_back = refs[1];
688eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul      setup->dirty |= LP_SETUP_NEW_FS;
689eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul   }
690eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul}
691eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul
692eee51147979208feffdf37c588ebbce4df6b40d6Brian Paulvoid
6933160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_blend_color( struct lp_setup_context *setup,
694d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                          const struct pipe_blend_color *blend_color )
695d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
696a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
697946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
698f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   assert(blend_color);
699946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
700f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) {
701f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color);
702f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      setup->dirty |= LP_SETUP_NEW_BLEND_COLOR;
703d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
704d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
705946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
706946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
7074461442849bfdb817334b38567136f7f9dabdf59Brian Paulvoid
70897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusinlp_setup_set_scissors( struct lp_setup_context *setup,
70997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin                       const struct pipe_scissor_state *scissors )
7104461442849bfdb817334b38567136f7f9dabdf59Brian Paul{
71197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   unsigned i;
7124461442849bfdb817334b38567136f7f9dabdf59Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
713946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
71497b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   assert(scissors);
715946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
71697b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   for (i = 0; i < PIPE_MAX_VIEWPORTS; ++i) {
71797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].x0 = scissors[i].minx;
71897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].x1 = scissors[i].maxx-1;
71997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].y0 = scissors[i].miny;
72097b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].y1 = scissors[i].maxy-1;
72197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   }
72229bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->dirty |= LP_SETUP_NEW_SCISSOR;
723946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
724946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
725946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
7265ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid
7273160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_flatshade_first( struct lp_setup_context *setup,
7285ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell                              boolean flatshade_first )
729946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
7305ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   setup->flatshade_first = flatshade_first;
73117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca}
73217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
73377b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlievoid
73477b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlielp_setup_set_rasterizer_discard( struct lp_setup_context *setup,
73577b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie                                 boolean rasterizer_discard )
73677b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie{
7375b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie   if (setup->rasterizer_discard != rasterizer_discard) {
7385b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie      setup->rasterizer_discard = rasterizer_discard;
7395b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie      set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ );
7405b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie   }
74177b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie}
74217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
7435ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid
7443160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_vertex_info( struct lp_setup_context *setup,
7455ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell                          struct vertex_info *vertex_info )
74617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{
7475ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   /* XXX: just silently holding onto the pointer:
7485ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell    */
7495ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   setup->vertex_info = vertex_info;
750946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
751946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
752946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
753946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
7540319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * Called during state validation when LP_NEW_VIEWPORT is set.
7550319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure */
7560319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClurevoid
7570319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClurelp_setup_set_viewports(struct lp_setup_context *setup,
7580319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure                       unsigned num_viewports,
7590319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure                       const struct pipe_viewport_state *viewports)
7600319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure{
761e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure   struct llvmpipe_context *lp = llvmpipe_context(setup->pipe);
7620319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   unsigned i;
7630319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7640319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
7650319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7660319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   assert(num_viewports <= PIPE_MAX_VIEWPORTS);
7670319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   assert(viewports);
7680319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7690319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   /*
7700319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure    * For use in lp_state_fs.c, propagate the viewport values for all viewports.
7710319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure    */
7720319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   for (i = 0; i < num_viewports; i++) {
7730319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      float min_depth;
7740319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      float max_depth;
775b0a647f284b24ca4e0ee1f70c4839d8ec3d1a4e6Roland Scheidegger      util_viewport_zmin_zmax(&viewports[i], lp->rasterizer->clip_halfz,
776b0a647f284b24ca4e0ee1f70c4839d8ec3d1a4e6Roland Scheidegger                              &min_depth, &max_depth);
7770319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7780319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      if (setup->viewports[i].min_depth != min_depth ||
7790319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->viewports[i].max_depth != max_depth) {
7800319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->viewports[i].min_depth = min_depth;
7810319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->viewports[i].max_depth = max_depth;
7820319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->dirty |= LP_SETUP_NEW_VIEWPORTS;
7830319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      }
7840319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   }
7850319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure}
7860319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7870319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7880319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure/**
7891fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol * Called during state validation when LP_NEW_SAMPLER_VIEW is set.
790946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
791d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
79247bfbd452c93e6a8db013fb90d9f42210cf24889Keith Whitwelllp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
7931fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol                                    unsigned num,
7941fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol                                    struct pipe_sampler_view **views)
795946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
7962f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger   unsigned i, max_tex_num;
797d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
798a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
799402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
800c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger   assert(num <= PIPE_MAX_SHADER_SAMPLER_VIEWS);
801d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
8022f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger   max_tex_num = MAX2(num, setup->fs.current_tex_num);
8032f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger
8042f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger   for (i = 0; i < max_tex_num; i++) {
8051fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol      struct pipe_sampler_view *view = i < num ? views[i] : NULL;
806d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
807fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      if (view) {
80820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger         struct pipe_resource *res = view->texture;
80920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger         struct llvmpipe_resource *lp_tex = llvmpipe_resource(res);
81085999695829823e459e11822b4846ed1db5c055dJosé Fonseca         struct lp_jit_texture *jit_tex;
81185999695829823e459e11822b4846ed1db5c055dJosé Fonseca         jit_tex = &setup->fs.current.jit_context.textures[i];
8126d50148742512606f2abd76a2dcef6c87a5c7471Roland Scheidegger
8132ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul         /* We're referencing the texture's internal data, so save a
8142ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          * reference to it.
8152ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          */
81620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger         pipe_resource_reference(&setup->fs.current_tex[i], res);
8172ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
818f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul         if (!lp_tex->dt) {
81926097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            /* regular texture - setup array of mipmap level offsets */
820f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul            int j;
82120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            unsigned first_level = 0;
82220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            unsigned last_level = 0;
82320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
82420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            if (llvmpipe_resource_is_texture(res)) {
82520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               first_level = view->u.tex.first_level;
82620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               last_level = view->u.tex.last_level;
82720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               assert(first_level <= last_level);
82820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               assert(last_level <= res->last_level);
8297e1521f191afe30fcf02a25b68fbf89278f014d3Roland Scheidegger               jit_tex->base = lp_tex->tex_data;
83020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            }
83120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            else {
832aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger              jit_tex->base = lp_tex->data;
83320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            }
83420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
835aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger            if (LP_PERF & PERF_TEX_MEM) {
836aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger               /* use dummy tile memory */
83726097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->base = lp_dummy_tile;
83826097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->width = TILE_SIZE/8;
83926097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->height = TILE_SIZE/8;
84026097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->depth = 1;
84126097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->first_level = 0;
84226097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->last_level = 0;
843b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul               jit_tex->mip_offsets[0] = 0;
844b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul               jit_tex->row_stride[0] = 0;
845b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul               jit_tex->img_stride[0] = 0;
84626097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            }
84726097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            else {
84820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->width = res->width0;
84920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->height = res->height0;
85020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->depth = res->depth0;
85120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->first_level = first_level;
85220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->last_level = last_level;
85320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
85420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               if (llvmpipe_resource_is_texture(res)) {
85520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  for (j = first_level; j <= last_level; j++) {
856aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger                     jit_tex->mip_offsets[j] = lp_tex->mip_offsets[j];
85720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     jit_tex->row_stride[j] = lp_tex->row_stride[j];
85820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     jit_tex->img_stride[j] = lp_tex->img_stride[j];
85920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  }
86020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
861fe707c0373cf73f9323014f7bc38f20120d4f096Roland Scheidegger                  if (res->target == PIPE_TEXTURE_1D_ARRAY ||
862fe707c0373cf73f9323014f7bc38f20120d4f096Roland Scheidegger                      res->target == PIPE_TEXTURE_2D_ARRAY ||
863fe707c0373cf73f9323014f7bc38f20120d4f096Roland Scheidegger                      res->target == PIPE_TEXTURE_CUBE ||
864fe707c0373cf73f9323014f7bc38f20120d4f096Roland Scheidegger                      res->target == PIPE_TEXTURE_CUBE_ARRAY) {
86587978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                     /*
86687978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * For array textures, we don't have first_layer, instead
86787978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * adjust last_layer (stored as depth) plus the mip level offsets
86887978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * (as we have mip-first layout can't just adjust base ptr).
86987978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * XXX For mip levels, could do something similar.
87087978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      */
87120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     jit_tex->depth = view->u.tex.last_layer - view->u.tex.first_layer + 1;
87287978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                     for (j = first_level; j <= last_level; j++) {
87387978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                        jit_tex->mip_offsets[j] += view->u.tex.first_layer *
87487978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                                                   lp_tex->img_stride[j];
87587978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                     }
876e6c66f4fb060cf2566d2b5e091b76a098566344dRoland Scheidegger                     if (view->target == PIPE_TEXTURE_CUBE ||
877e6c66f4fb060cf2566d2b5e091b76a098566344dRoland Scheidegger                         view->target == PIPE_TEXTURE_CUBE_ARRAY) {
878ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger                        assert(jit_tex->depth % 6 == 0);
879ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger                     }
88020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     assert(view->u.tex.first_layer <= view->u.tex.last_layer);
88120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     assert(view->u.tex.last_layer < res->array_size);
88220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  }
88320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               }
88420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               else {
88587978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                  /*
8867cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák                   * For buffers, we don't have "offset", instead adjust
8877cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák                   * the size (stored as width) plus the base pointer.
88887978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                   */
88920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  unsigned view_blocksize = util_format_get_blocksize(view->format);
89020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  /* probably don't really need to fill that out */
89120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->mip_offsets[0] = 0;
89220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->row_stride[0] = 0;
8933d29e75a5f59639c3b9dfed26cd41ab13c0d60fcRoland Scheidegger                  jit_tex->img_stride[0] = 0;
89420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
89520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  /* everything specified in number of elements here. */
8967cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák                  jit_tex->width = view->u.buf.size / view_blocksize;
8977cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák                  jit_tex->base = (uint8_t *)jit_tex->base + view->u.buf.offset;
89820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  /* XXX Unsure if we need to sanitize parameters? */
8997cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák                  assert(view->u.buf.offset + view->u.buf.size <= res->width0);
9002b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul               }
901f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul            }
902b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca         }
903b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca         else {
904f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul            /* display target texture/surface */
905b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca            /*
906b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca             * XXX: Where should this be unmapped?
907b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca             */
90820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            struct llvmpipe_screen *screen = llvmpipe_screen(res->screen);
90994ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell            struct sw_winsys *winsys = screen->winsys;
91026097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            jit_tex->base = winsys->displaytarget_map(winsys, lp_tex->dt,
91126097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger                                                         PIPE_TRANSFER_READ);
912f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul            jit_tex->row_stride[0] = lp_tex->row_stride[0];
913f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul            jit_tex->img_stride[0] = lp_tex->img_stride[0];
91426097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            jit_tex->mip_offsets[0] = 0;
91520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->width = res->width0;
91620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->height = res->height0;
91720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->depth = res->depth0;
91820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->first_level = jit_tex->last_level = 0;
91926097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            assert(jit_tex->base);
920b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca         }
921d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      }
9222f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger      else {
9232f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger         pipe_resource_reference(&setup->fs.current_tex[i], NULL);
9242f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger      }
92517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
9262f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger   setup->fs.current_tex_num = num;
927d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
9282e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca   setup->dirty |= LP_SETUP_NEW_FS;
929946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
930946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
931946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
932946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
933fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca * Called during state validation when LP_NEW_SAMPLER is set.
934fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca */
935fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonsecavoid
936fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonsecalp_setup_set_fragment_sampler_state(struct lp_setup_context *setup,
937fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca                                    unsigned num,
938b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul                                    struct pipe_sampler_state **samplers)
939fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca{
940fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   unsigned i;
941fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
942fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
943fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
944fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   assert(num <= PIPE_MAX_SAMPLERS);
945fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
946fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
947fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      const struct pipe_sampler_state *sampler = i < num ? samplers[i] : NULL;
948fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
949fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      if (sampler) {
950c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         struct lp_jit_sampler *jit_sam;
951c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam = &setup->fs.current.jit_context.samplers[i];
952fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
953c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam->min_lod = sampler->min_lod;
954c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam->max_lod = sampler->max_lod;
955c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam->lod_bias = sampler->lod_bias;
956c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         COPY_4V(jit_sam->border_color, sampler->border_color.f);
957fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      }
958fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   }
959fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
960fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   setup->dirty |= LP_SETUP_NEW_FS;
961fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca}
962fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
963fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
964fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca/**
965d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Is the given texture referenced by any scene?
966d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Note: we have to check all scenes including any scenes currently
967d59fe448967addb3025d7df90888ff950e03a343Brian Paul * being rendered and the current scene being built.
968946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
969cd9d9e2436a0815f6ed3a61d2cdf8fad53278506Brian Paulunsigned
970287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwelllp_setup_is_resource_referenced( const struct lp_setup_context *setup,
971287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                const struct pipe_resource *texture )
972946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
973d59fe448967addb3025d7df90888ff950e03a343Brian Paul   unsigned i;
974946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
97512872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul   /* check the render targets */
97612872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul   for (i = 0; i < setup->fb.nr_cbufs; i++) {
977d6fa71fbb0d365cefdabfea9de62cfece71f7486Brian Paul      if (setup->fb.cbufs[i] && setup->fb.cbufs[i]->texture == texture)
97825485f4b69447514ab8b595aced90c75606a99bdMarek Olšák         return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE;
97912872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul   }
980018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul   if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) {
98125485f4b69447514ab8b595aced90c75606a99bdMarek Olšák      return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE;
982946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
983946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
984018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul   /* check textures referenced by the scene */
9851d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul   for (i = 0; i < ARRAY_SIZE(setup->scenes); i++) {
986287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      if (lp_scene_is_resource_referenced(setup->scenes[i], texture)) {
98725485f4b69447514ab8b595aced90c75606a99bdMarek Olšák         return LP_REFERENCED_FOR_READ;
988018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul      }
989946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
990946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
99125485f4b69447514ab8b595aced90c75606a99bdMarek Olšák   return LP_UNREFERENCED;
992946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
993946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
994946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
995946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
996a27b12171d84c6e731af08f48a657c377f8549baBrian Paul * Called by vbuf code when we're about to draw something.
9970319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure *
9980319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * This function stores all dirty state in the current scene's display list
9990319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * memory, via lp_scene_alloc().  We can not pass pointers of mutable state to
10000319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * the JIT functions, as the JIT functions will be called later on, most likely
10010319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * on a different thread.
10020319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure *
10030319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * When processing dirty state it is imperative that we don't refer to any
10040319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * pointers previously allocated with lp_scene_alloc() in this function (or any
10050319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * function) as they may belong to a scene freed since then.
1006946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
10076419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean
10086419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelltry_update_scene_state( struct lp_setup_context *setup )
1009946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
1010586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger   static const float fake_const_buf[4];
10119f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   boolean new_scene = (setup->fs.stored == NULL);
10129f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   struct lp_scene *scene = setup->scene;
10131d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   unsigned i;
1014bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul
10159f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(scene);
1016946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10170319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   if (setup->dirty & LP_SETUP_NEW_VIEWPORTS) {
10180319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      /*
10190319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       * Record new depth range state for changes due to viewport updates.
10200319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       *
10210319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       * TODO: Collapse the existing viewport and depth range information
10220319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       *       into one structure, for access by JIT.
10230319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       */
10240319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      struct lp_jit_viewport *stored;
10250319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10260319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      stored = (struct lp_jit_viewport *)
10270319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure         lp_scene_alloc(scene, sizeof setup->viewports);
10280319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10290319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      if (!stored) {
10300319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure         assert(!new_scene);
10310319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure         return FALSE;
10320319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      }
10330319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10340319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      memcpy(stored, setup->viewports, sizeof setup->viewports);
10350319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10360319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      setup->fs.current.jit_context.viewports = stored;
10370319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      setup->dirty |= LP_SETUP_NEW_FS;
10380319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   }
10390319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
1040f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) {
1041f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      uint8_t *stored;
1042fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      float* fstored;
1043f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      unsigned i, j;
1044fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      unsigned size;
1045fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
1046fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      /* Alloc u8_blend_color (16 x i8) and f_blend_color (4 or 8 x f32) */
1047fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      size  = 4 * 16 * sizeof(uint8_t);
1048fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      size += (LP_MAX_VECTOR_LENGTH / 4) * sizeof(float);
10492f65f61beac3a45fdf27bf25d7b13cd1fa2bbb8cRoland Scheidegger      stored = lp_scene_alloc_aligned(scene, size, LP_MIN_VECTOR_ALIGN);
105080eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
10519f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      if (!stored) {
10529f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         assert(!new_scene);
10536419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         return FALSE;
10549f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      }
10556419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1056fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      /* Store floating point colour */
1057fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      fstored = (float*)(stored + 4*16);
1058fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      for (i = 0; i < (LP_MAX_VECTOR_LENGTH / 4); ++i) {
1059fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         fstored[i] = setup->blend_color.current.color[i % 4];
1060fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      }
1061fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
10626419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      /* smear each blend color component across 16 ubyte elements */
10636419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      for (i = 0; i < 4; ++i) {
10646419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]);
10656419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         for (j = 0; j < 16; ++j)
10666419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            stored[i*16 + j] = c;
1067477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul      }
1068f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca
10696419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      setup->blend_color.stored = stored;
1070fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      setup->fs.current.jit_context.u8_blend_color = stored;
1071fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      setup->fs.current.jit_context.f_blend_color = fstored;
1072f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      setup->dirty |= LP_SETUP_NEW_FS;
1073946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
1074946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10751d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   if (setup->dirty & LP_SETUP_NEW_CONSTANTS) {
10761d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul      for (i = 0; i < ARRAY_SIZE(setup->constants); ++i) {
10773427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         struct pipe_resource *buffer = setup->constants[i].current.buffer;
1078afeb92220690c8f27cdc56c30e109ca175d51d83José Fonseca         const unsigned current_size = MIN2(setup->constants[i].current.buffer_size,
1079afeb92220690c8f27cdc56c30e109ca175d51d83José Fonseca                                            LP_MAX_TGSI_CONST_BUFFER_SIZE);
10803427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         const ubyte *current_data = NULL;
108193b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin         int num_constants;
1082946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1083afeb92220690c8f27cdc56c30e109ca175d51d83José Fonseca         STATIC_ASSERT(DATA_BLOCK_SIZE >= LP_MAX_TGSI_CONST_BUFFER_SIZE);
1084afeb92220690c8f27cdc56c30e109ca175d51d83José Fonseca
10851d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         if (buffer) {
10863427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            /* resource buffer */
10873427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            current_data = (ubyte *) llvmpipe_resource_data(buffer);
10883427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         }
10893427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         else if (setup->constants[i].current.user_buffer) {
10903427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            /* user-space buffer */
10913427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            current_data = (ubyte *) setup->constants[i].current.user_buffer;
10923427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         }
10933427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul
10943427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         if (current_data) {
10953427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            current_data += setup->constants[i].current.buffer_offset;
1096946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10971d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            /* TODO: copy only the actually used constants? */
1098946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10991d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            if (setup->constants[i].stored_size != current_size ||
11001d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               !setup->constants[i].stored_data ||
11011d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               memcmp(setup->constants[i].stored_data,
11021d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_data,
11031d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_size) != 0) {
11041d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               void *stored;
1105946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
11061d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               stored = lp_scene_alloc(scene, current_size);
11071d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               if (!stored) {
11081d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                  assert(!new_scene);
11091d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                  return FALSE;
11101d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               }
11116419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
11121d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               memcpy(stored,
11131d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_data,
11141d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_size);
11151d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               setup->constants[i].stored_size = current_size;
11161d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               setup->constants[i].stored_data = stored;
11171d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            }
1118586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger            setup->fs.current.jit_context.constants[i] =
1119586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger               setup->constants[i].stored_data;
11201d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         }
11211d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         else {
11221d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            setup->constants[i].stored_size = 0;
11231d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            setup->constants[i].stored_data = NULL;
1124586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger            setup->fs.current.jit_context.constants[i] = fake_const_buf;
1125946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca         }
1126946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
112793b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin         num_constants =
112893b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin            setup->constants[i].stored_size / (sizeof(float) * 4);
112993b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin         setup->fs.current.jit_context.num_constants[i] = num_constants;
11301d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         setup->dirty |= LP_SETUP_NEW_FS;
11311d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      }
11322e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca   }
11332e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca
11342e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca
11356419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   if (setup->dirty & LP_SETUP_NEW_FS) {
11366419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      if (!setup->fs.stored ||
11376419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell          memcmp(setup->fs.stored,
11386419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                 &setup->fs.current,
11396419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                 sizeof setup->fs.current) != 0)
11406419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      {
11416419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         struct lp_rast_state *stored;
11426419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1143663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell         /* The fs state that's been stored in the scene is different from
1144e2f46344560f8f1193b311ad41883011e67eea00Brian Paul          * the new, current state.  So allocate a new lp_rast_state object
1145e2f46344560f8f1193b311ad41883011e67eea00Brian Paul          * and append it to the bin's setup data buffer.
1146e2f46344560f8f1193b311ad41883011e67eea00Brian Paul          */
11476419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         stored = (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored);
11489f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         if (!stored) {
11499f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell            assert(!new_scene);
11506419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            return FALSE;
11519f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         }
11522ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
11536419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         memcpy(stored,
11546419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                &setup->fs.current,
11556419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                sizeof setup->fs.current);
11566419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         setup->fs.stored = stored;
11576419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
11582ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul         /* The scene now references the textures in the rasterization
11592ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          * state record.  Note that now.
11602ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          */
11611d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul         for (i = 0; i < ARRAY_SIZE(setup->fs.current_tex); i++) {
11626419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            if (setup->fs.current_tex[i]) {
11636419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell               if (!lp_scene_add_resource_reference(scene,
11649f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                                    setup->fs.current_tex[i],
11659f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                                    new_scene)) {
11669f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                  assert(!new_scene);
11676419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                  return FALSE;
11689f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell               }
11696419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            }
1170d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell         }
1171d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell      }
1172d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell   }
1173d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell
117429bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   if (setup->dirty & LP_SETUP_NEW_SCISSOR) {
117597b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      unsigned i;
117697b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      for (i = 0; i < PIPE_MAX_VIEWPORTS; ++i) {
117797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin         setup->draw_regions[i] = setup->framebuffer;
117897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin         if (setup->scissor_test) {
117997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin            u_rect_possible_intersection(&setup->scissors[i],
118097b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin                                         &setup->draw_regions[i]);
118197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin         }
118229bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell      }
118329bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   }
1184bfcf1ba1c4879102eb05460528b02a23d81eac99Roland Scheidegger
11852e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca   setup->dirty = 0;
11862e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca
118785999695829823e459e11822b4846ed1db5c055dJosé Fonseca   assert(setup->fs.stored);
11886419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   return TRUE;
11896419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}
11906419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1191ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellboolean
11929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_setup_update_state( struct lp_setup_context *setup,
11939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                       boolean update_scene )
11946419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{
11956419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   /* Some of the 'draw' pipeline stages may have changed some driver state.
11966419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * Make sure we've processed those state changes before anything else.
11976419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    *
11986419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * XXX this is the only place where llvmpipe_context is used in the
11996419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * setup code.  This may get refactored/changed...
12006419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    */
12016419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   {
12026419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      struct llvmpipe_context *lp = llvmpipe_context(setup->pipe);
12036419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      if (lp->dirty) {
12046419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         llvmpipe_update_derived(lp);
12056419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      }
12066419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1207efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      if (lp->setup->dirty) {
1208efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         llvmpipe_update_setup(lp);
1209efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      }
1210efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1211efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      assert(setup->setup.variant);
1212efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
12136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      /* Will probably need to move this somewhere else, just need
12146419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell       * to know about vertex shader point size attribute.
12156419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell       */
1216af7ba989fb5a39925a0a1261ed281fe7f48a16cfRoland Scheidegger      setup->psize_slot = lp->psize_slot;
121797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->viewport_index_slot = lp->viewport_index_slot;
1218d8146f240e628e70d4c07f7e805a179f70c36e23Roland Scheidegger      setup->layer_slot = lp->layer_slot;
1219d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin      setup->face_slot = lp->face_slot;
12206419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
12216419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      assert(lp->dirty == 0);
12225b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
12235b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      assert(lp->setup_variant.key.size ==
12245b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	     setup->setup.variant->key.size);
12255b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
12265b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      assert(memcmp(&lp->setup_variant.key,
12275b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell		    &setup->setup.variant->key,
12285b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell		    setup->setup.variant->key.size) == 0);
12296419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   }
12306419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
123168a4f6324712d7eae327ee438a41c432ec72f11dKeith Whitwell   if (update_scene && setup->state != SETUP_ACTIVE) {
1232ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!set_scene_state( setup, SETUP_ACTIVE, __FUNCTION__ ))
1233ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1234ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   }
12359f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
12369f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   /* Only call into update_scene_state() if we already have a
12376419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * scene:
12386419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    */
12399f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   if (update_scene && setup->scene) {
12409f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      assert(setup->state == SETUP_ACTIVE);
1241ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1242ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (try_update_scene_state(setup))
1243ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return TRUE;
1244ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1245ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      /* Update failed, try to restart the scene.
1246ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       *
1247ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       * Cannot call lp_setup_flush_and_restart() directly here
1248ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       * because of potential recursion.
1249ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       */
1250ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__))
1251ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1252ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1253ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!set_scene_state(setup, SETUP_ACTIVE, __FUNCTION__))
1254ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1255ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1256ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!setup->scene)
1257ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1258ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1259ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return try_update_scene_state(setup);
12606419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   }
1261ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1262ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
1263946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1264946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1265608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca
1266946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1267b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell/* Only caller is lp_setup_vbuf_destroy()
1268b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell */
1269253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid
12703160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_destroy( struct lp_setup_context *setup )
1271946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
12722ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul   uint i;
12732ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
12749f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_setup_reset( setup );
1275946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
12765f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul   util_unreference_framebuffer_state(&setup->fb);
12775f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul
12781d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul   for (i = 0; i < ARRAY_SIZE(setup->fs.current_tex); i++) {
1279287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&setup->fs.current_tex[i], NULL);
12802ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul   }
12812ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
12821d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul   for (i = 0; i < ARRAY_SIZE(setup->constants); i++) {
12833427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul      pipe_resource_reference(&setup->constants[i].current.buffer, NULL);
12841d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   }
1285946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1286663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   /* free the scenes in the 'empty' queue */
12871d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul   for (i = 0; i < ARRAY_SIZE(setup->scenes); i++) {
12889f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      struct lp_scene *scene = setup->scenes[i];
12899f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
12909f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      if (scene->fence)
12919f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         lp_fence_wait(scene->fence);
12929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
1293663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell      lp_scene_destroy(scene);
1294946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
1295946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1296cdd4f04f80de91d6d4e5b904ec66386d6546f977José Fonseca   lp_fence_reference(&setup->last_fence, NULL);
1297cdd4f04f80de91d6d4e5b904ec66386d6546f977José Fonseca
129889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell   FREE( setup );
1299946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1300946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1301946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1302946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
13035ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * Create a new primitive tiling engine.  Plug it into the backend of
13045ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * the draw module.  Currently also creates a rasterizer to use with
13055ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * it.
1306946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
13073160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastruct lp_setup_context *
13085fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwelllp_setup_create( struct pipe_context *pipe,
13095ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell                 struct draw_context *draw )
1310946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
131139be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca   struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen);
1312c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   struct lp_setup_context *setup;
131339be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca   unsigned i;
1314946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1315c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   setup = CALLOC_STRUCT(lp_setup_context);
1316c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   if (!setup) {
1317c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      goto no_setup;
1318c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   }
1319a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell
13205ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   lp_setup_init_vbuf(setup);
13216419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
13226419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   /* Used only in update_state():
13236419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    */
13246419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   setup->pipe = pipe;
13255ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
1326946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
132739be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca   setup->num_threads = screen->num_threads;
13285ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   setup->vbuf = draw_vbuf_stage(draw, &setup->base);
1329c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   if (!setup->vbuf) {
1330c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      goto no_vbuf;
1331c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   }
13325ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
13335ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   draw_set_rasterize_stage(draw, setup->vbuf);
13345ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   draw_set_render(draw, &setup->base);
13355ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
1336663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   /* create some empty scenes */
1337663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   for (i = 0; i < MAX_SCENES; i++) {
13389f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      setup->scenes[i] = lp_scene_create( pipe );
1339c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      if (!setup->scenes[i]) {
1340c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca         goto no_scenes;
1341c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      }
134280eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell   }
1343946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1344163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->triangle = first_triangle;
1345163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->line     = first_line;
1346163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->point    = first_point;
1347163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell
1348301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca   setup->dirty = ~0;
134908811032c2dd8f38d2ef65d7fd8794112e029b63Keith Whitwell
1350946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   return setup;
1351931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1352c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_scenes:
1353c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   for (i = 0; i < MAX_SCENES; i++) {
1354c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      if (setup->scenes[i]) {
1355c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca         lp_scene_destroy(setup->scenes[i]);
1356c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      }
1357c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   }
13585ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
1359c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   setup->vbuf->destroy(setup->vbuf);
1360c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_vbuf:
1361931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   FREE(setup);
1362c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_setup:
1363931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   return NULL;
1364946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1365946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
136686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
136786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/**
136886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put a BeginQuery command into all bins.
136986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */
137086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid
137186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_begin_query(struct lp_setup_context *setup,
137286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li                     struct llvmpipe_query *pq)
137386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{
137442dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul
137542dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul   set_scene_state(setup, SETUP_ACTIVE, "begin_query");
1376dc5dc4fd943e1da5207e0489c355e9a7ba1dff87Roland Scheidegger
137708203428800554215657f1ebf19d74328103800eRoland Scheidegger   if (!(pq->type == PIPE_QUERY_OCCLUSION_COUNTER ||
137808203428800554215657f1ebf19d74328103800eRoland Scheidegger         pq->type == PIPE_QUERY_OCCLUSION_PREDICATE ||
137908203428800554215657f1ebf19d74328103800eRoland Scheidegger         pq->type == PIPE_QUERY_PIPELINE_STATISTICS))
138008203428800554215657f1ebf19d74328103800eRoland Scheidegger      return;
138116f0d70ffe6d42d22b9e6b927b297e75a199aa78James Benton
138208203428800554215657f1ebf19d74328103800eRoland Scheidegger   /* init the query to its beginning state */
13832e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   assert(setup->active_binned_queries < LP_MAX_ACTIVE_BINNED_QUERIES);
13842e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   /* exceeding list size so just ignore the query */
13852e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   if (setup->active_binned_queries >= LP_MAX_ACTIVE_BINNED_QUERIES) {
13862e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      return;
13872e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   }
13882e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   assert(setup->active_queries[setup->active_binned_queries] == NULL);
13892e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   setup->active_queries[setup->active_binned_queries] = pq;
13902e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   setup->active_binned_queries++;
13918cce283038bf51a03de6734523c3e9ea8c8a6f33Brian Paul
139208203428800554215657f1ebf19d74328103800eRoland Scheidegger   assert(setup->scene);
139318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (setup->scene) {
13946419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      if (!lp_scene_bin_everywhere(setup->scene,
13959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                   LP_RAST_OP_BEGIN_QUERY,
13966419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                                   lp_rast_arg_query(pq))) {
13979f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
1398ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         if (!lp_setup_flush_and_restart(setup))
1399ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell            return;
14006419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
14016419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         if (!lp_scene_bin_everywhere(setup->scene,
14029f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                      LP_RAST_OP_BEGIN_QUERY,
14036419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                                      lp_rast_arg_query(pq))) {
14046419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            return;
14056419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         }
14066419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      }
140759b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger      setup->scene->had_queries |= TRUE;
140818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   }
140986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li}
141086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
141186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
141286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/**
141386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put an EndQuery command into all bins.
141486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */
141586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid
141686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq)
141786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{
141842dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul   set_scene_state(setup, SETUP_ACTIVE, "end_query");
141942dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul
142008203428800554215657f1ebf19d74328103800eRoland Scheidegger   assert(setup->scene);
142118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (setup->scene) {
142218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      /* pq->fence should be the fence of the *last* scene which
142318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell       * contributed to the query result.
142418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell       */
142518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      lp_fence_reference(&pq->fence, setup->scene->fence);
142618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
142708203428800554215657f1ebf19d74328103800eRoland Scheidegger      if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER ||
142808203428800554215657f1ebf19d74328103800eRoland Scheidegger          pq->type == PIPE_QUERY_OCCLUSION_PREDICATE ||
142908203428800554215657f1ebf19d74328103800eRoland Scheidegger          pq->type == PIPE_QUERY_PIPELINE_STATISTICS ||
143008203428800554215657f1ebf19d74328103800eRoland Scheidegger          pq->type == PIPE_QUERY_TIMESTAMP) {
14317d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger         if (pq->type == PIPE_QUERY_TIMESTAMP &&
14327d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger               !(setup->scene->tiles_x | setup->scene->tiles_y)) {
14337d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger            /*
14347d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger             * If there's a zero width/height framebuffer, there's no bins and
14357d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger             * hence no rast task is ever run. So fill in something here instead.
14367d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger             */
14377d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger            pq->end[0] = os_time_get_nano();
14387d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger         }
14397d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger
144008203428800554215657f1ebf19d74328103800eRoland Scheidegger         if (!lp_scene_bin_everywhere(setup->scene,
144108203428800554215657f1ebf19d74328103800eRoland Scheidegger                                      LP_RAST_OP_END_QUERY,
144208203428800554215657f1ebf19d74328103800eRoland Scheidegger                                      lp_rast_arg_query(pq))) {
144308203428800554215657f1ebf19d74328103800eRoland Scheidegger            if (!lp_setup_flush_and_restart(setup))
144408203428800554215657f1ebf19d74328103800eRoland Scheidegger               goto fail;
144508203428800554215657f1ebf19d74328103800eRoland Scheidegger
144608203428800554215657f1ebf19d74328103800eRoland Scheidegger            if (!lp_scene_bin_everywhere(setup->scene,
144708203428800554215657f1ebf19d74328103800eRoland Scheidegger                                         LP_RAST_OP_END_QUERY,
144808203428800554215657f1ebf19d74328103800eRoland Scheidegger                                         lp_rast_arg_query(pq))) {
144908203428800554215657f1ebf19d74328103800eRoland Scheidegger               goto fail;
145008203428800554215657f1ebf19d74328103800eRoland Scheidegger            }
145108203428800554215657f1ebf19d74328103800eRoland Scheidegger         }
145259b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger         setup->scene->had_queries |= TRUE;
14536419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      }
145418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   }
145518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   else {
145618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      lp_fence_reference(&pq->fence, setup->last_fence);
145718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   }
145808203428800554215657f1ebf19d74328103800eRoland Scheidegger
145908203428800554215657f1ebf19d74328103800eRoland Scheideggerfail:
146008203428800554215657f1ebf19d74328103800eRoland Scheidegger   /* Need to do this now not earlier since it still needs to be marked as
146108203428800554215657f1ebf19d74328103800eRoland Scheidegger    * active when binning it would cause a flush.
146208203428800554215657f1ebf19d74328103800eRoland Scheidegger    */
14632e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER ||
14642e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      pq->type == PIPE_QUERY_OCCLUSION_PREDICATE ||
14652e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      pq->type == PIPE_QUERY_PIPELINE_STATISTICS) {
14662e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      unsigned i;
14672e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger
14682e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      /* remove from active binned query list */
14692e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      for (i = 0; i < setup->active_binned_queries; i++) {
14702e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger         if (setup->active_queries[i] == pq)
14712e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger            break;
14722e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      }
14732e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      assert(i < setup->active_binned_queries);
14742e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      if (i == setup->active_binned_queries)
14752e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger         return;
14762e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      setup->active_binned_queries--;
14772e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      setup->active_queries[i] = setup->active_queries[setup->active_binned_queries];
14782e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      setup->active_queries[setup->active_binned_queries] = NULL;
14792e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   }
148086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li}
148118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
148218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
1483ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellboolean
14846419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_flush_and_restart(struct lp_setup_context *setup)
14856419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{
14866419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   if (0) debug_printf("%s\n", __FUNCTION__);
14876419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
14886419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
1489ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1490ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__))
1491ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
1492ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1493ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!lp_setup_update_state(setup, TRUE))
1494ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
1495ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1496ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
14976419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}
14989f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
14999f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
1500