lp_setup.c revision e6c66f4fb060cf2566d2b5e091b76a098566344d
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"
42c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca#include "draw/draw_pipe.h"
437d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger#include "os/os_time.h"
449fae289fcd098027952c6b586292214ec586a2ecBrian Paul#include "lp_context.h"
452b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul#include "lp_memory.h"
46663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#include "lp_scene.h"
47d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_texture.h"
485ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_debug.h"
495ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_fence.h"
5086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li#include "lp_query.h"
515ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_rast.h"
52d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_setup_context.h"
53b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca#include "lp_screen.h"
549fae289fcd098027952c6b586292214ec586a2ecBrian Paul#include "lp_state.h"
5523e951d0da5802fec70996e46ad6f0abc411594cKeith Whitwell#include "state_tracker/sw_winsys.h"
56946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
575ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_context.h"
585ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_vbuf.h"
5980eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
60677a055fa0cf7b6476c716be187513c41060d417José Fonseca
61ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean set_scene_state( struct lp_setup_context *, enum setup_state,
629f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                             const char *reason);
639f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic boolean try_update_scene_state( struct lp_setup_context *setup );
64946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
65946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
669f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic void
679f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_setup_get_empty_scene(struct lp_setup_context *setup)
6822b07b8be4c2939b00e10f17fa91e68682808594Brian Paul{
69db9a1052d1b2014419134c93aa4e05c9d1579378José Fonseca   assert(setup->scene == NULL);
70db9a1052d1b2014419134c93aa4e05c9d1579378José Fonseca
719f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->scene_idx++;
729f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->scene_idx %= Elements(setup->scenes);
739f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
749f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->scene = setup->scenes[setup->scene_idx];
759f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
769f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   if (setup->scene->fence) {
779f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      if (LP_DEBUG & DEBUG_SETUP)
789f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         debug_printf("%s: wait for scene %d\n",
799f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                      __FUNCTION__, setup->scene->fence->id);
809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      lp_fence_wait(setup->scene->fence);
823bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul   }
839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
842d368b982af5e6566c7da7fd2bc8b190af28188bJosé Fonseca   lp_scene_begin_binning(setup->scene, &setup->fb, setup->rasterizer_discard);
852d368b982af5e6566c7da7fd2bc8b190af28188bJosé Fonseca
8622b07b8be4c2939b00e10f17fa91e68682808594Brian Paul}
87946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
88946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
894d2b0eb19e432f83845a55d552b5d1d61f040459José Fonsecastatic void
903160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_triangle( struct lp_setup_context *setup,
91253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v0)[4],
92253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v1)[4],
93253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v2)[4])
944d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca{
959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
96253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_triangle( setup );
97253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->triangle( setup, v0, v1, v2 );
98253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
994d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
100253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
1013160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_line( struct lp_setup_context *setup,
102253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	    const float (*v0)[4],
103253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	    const float (*v1)[4])
104253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
1059f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
106253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_line( setup );
107253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->line( setup, v0, v1 );
1084d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca}
1094d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
110253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
1113160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_point( struct lp_setup_context *setup,
112253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	     const float (*v0)[4])
113253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
1149f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
115253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_point( setup );
116253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->point( setup, v0 );
117253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
1184d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
119efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulvoid lp_setup_reset( struct lp_setup_context *setup )
120931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
1211d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   unsigned i;
1221d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca
123a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
1244d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
125301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca   /* Reset derived state */
1261d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   for (i = 0; i < Elements(setup->constants); ++i) {
1271d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      setup->constants[i].stored_size = 0;
1281d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      setup->constants[i].stored_data = NULL;
1291d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   }
130301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca   setup->fs.stored = NULL;
131f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   setup->dirty = ~0;
132946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1333bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul   /* no current bin */
134663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   setup->scene = NULL;
135946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1360718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Reset some state:
1370718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
138c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell   memset(&setup->clear, 0, sizeof setup->clear);
139946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
140253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   /* Have an explicit "start-binning" call and get rid of this
141253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell    * pointer twiddling?
142946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca    */
143253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->line = first_line;
144253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->point = first_point;
145253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->triangle = first_triangle;
146946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
147946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
148946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
149663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell/** Rasterize all scene's bins */
150931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
151b73c9ba9195ac436960b90649db35bb11d23f9d0Brian Paullp_setup_rasterize_scene( struct lp_setup_context *setup )
152946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
1539f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   struct lp_scene *scene = setup->scene;
154edac740095fb2514b512034b334947f72648cd51Roland Scheidegger   struct llvmpipe_screen *screen = llvmpipe_screen(scene->pipe->screen);
155946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1562e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   scene->num_active_queries = setup->active_binned_queries;
1572e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   memcpy(scene->active_queries, setup->active_queries,
1582e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger          scene->num_active_queries * sizeof(scene->active_queries[0]));
15908203428800554215657f1ebf19d74328103800eRoland Scheidegger
1609f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_scene_end_binning(scene);
1619f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
16218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   lp_fence_reference(&setup->last_fence, scene->fence);
16318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
16418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (setup->last_fence)
16518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      setup->last_fence->issued = TRUE;
16618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
167edac740095fb2514b512034b334947f72648cd51Roland Scheidegger   pipe_mutex_lock(screen->rast_mutex);
1686f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger
1696f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger   /* FIXME: We enqueue the scene then wait on the rasterizer to finish.
1706f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * This means we never actually run any vertex stuff in parallel to
1716f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * rasterization (not in the same context at least) which is what the
1726f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * multiple scenes per setup is about - when we get a new empty scene
1736f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * any old one is already empty again because we waited here for
1746f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * raster tasks to be finished. Ideally, we shouldn't need to wait here
1756f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * and rely on fences elsewhere when waiting is necessary.
1766f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * Certainly, lp_scene_end_rasterization() would need to be deferred too
1776f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    * and there's probably other bits why this doesn't actually work.
1786f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger    */
1799f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_rast_queue_scene(screen->rast, scene);
1809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_rast_finish(screen->rast);
181edac740095fb2514b512034b334947f72648cd51Roland Scheidegger   pipe_mutex_unlock(screen->rast_mutex);
182946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_scene_end_rasterization(setup->scene);
1849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_setup_reset( setup );
185946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
186a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__);
18780eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell}
18880eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
189931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
190931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
191ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean
1923160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecabegin_binning( struct lp_setup_context *setup )
19380eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell{
1949f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   struct lp_scene *scene = setup->scene;
1951e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger   boolean need_zsload = FALSE;
1969f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   boolean ok;
19718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
198040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   assert(scene);
199040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   assert(scene->fence == NULL);
200040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell
201040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   /* Always create a fence:
20218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell    */
203040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   scene->fence = lp_fence_create(MAX2(1, setup->num_threads));
204ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!scene->fence)
205ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
206040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell
2079f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   ok = try_update_scene_state(setup);
208ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!ok)
209ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
21018452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
2111e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger   if (setup->fb.zsbuf &&
2121e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger       ((setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) &&
2131e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger        util_format_is_depth_and_stencil(setup->fb.zsbuf->format))
2141e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger      need_zsload = TRUE;
21522b07b8be4c2939b00e10f17fa91e68682808594Brian Paul
216a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   LP_DBG(DEBUG_SETUP, "%s color clear bufs: %x depth: %s\n", __FUNCTION__,
217a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger          setup->clear.flags >> 2,
2181e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger          need_zsload ? "clear": "load");
219402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
220a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (setup->clear.flags & PIPE_CLEAR_COLOR) {
221a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      unsigned cbuf;
222a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      for (cbuf = 0; cbuf < setup->fb.nr_cbufs; cbuf++) {
223a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         assert(PIPE_CLEAR_COLOR0 == 1 << 2);
224a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         if (setup->clear.flags & (1 << (2 + cbuf))) {
225a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            union lp_rast_cmd_arg clearrb_arg;
226a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            struct lp_rast_clear_rb *cc_scene =
227a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               (struct lp_rast_clear_rb *)
228a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                  lp_scene_alloc(scene, sizeof(struct lp_rast_clear_rb));
229a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
230a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            if (!cc_scene) {
231a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               return FALSE;
232a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            }
233a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
234a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            cc_scene->cbuf = cbuf;
235a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            cc_scene->color_val = setup->clear.color_val[cbuf];
236a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            clearrb_arg.clear_rb = cc_scene;
237a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
238a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            if (!lp_scene_bin_everywhere(scene,
239a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                         LP_RAST_OP_CLEAR_COLOR,
240a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                         clearrb_arg))
241a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               return FALSE;
242a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         }
2430639765b2850739af1678f10fc0c5706d5827776Brian Paul      }
244931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
245931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
2467f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell   if (setup->fb.zsbuf) {
2470639765b2850739af1678f10fc0c5706d5827776Brian Paul      if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) {
2486419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         ok = lp_scene_bin_everywhere( scene,
2499f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                       LP_RAST_OP_CLEAR_ZSTENCIL,
2506419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                                       lp_rast_arg_clearzs(
2519f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                          setup->clear.zsvalue,
2529f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                          setup->clear.zsmask));
253ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         if (!ok)
254ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell            return FALSE;
2550639765b2850739af1678f10fc0c5706d5827776Brian Paul      }
256931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
2573094fc200920f9d5eb62136d3b25896229fb0dbfBrian Paul
2589f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->clear.flags = 0;
2599f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->clear.zsmask = 0;
2609f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->clear.zsvalue = 0;
2619f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
26259b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger   scene->had_queries = !!setup->active_binned_queries;
26359b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger
264a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s done\n", __FUNCTION__);
265ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
266946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
267946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
268946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
269931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen
270931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears.
271931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell *
272931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles.
273b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca */
274ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean
2753160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaexecute_clears( struct lp_setup_context *setup )
276b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca{
277a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
278b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca
279ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return begin_binning( setup );
280b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca}
281b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca
2829f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellconst char *states[] = {
2839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   "FLUSHED",
2849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   "CLEARED",
2859f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   "ACTIVE "
2869f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell};
2879f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
288b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca
289ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean
2903160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaset_scene_state( struct lp_setup_context *setup,
2919f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                 enum setup_state new_state,
2929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                 const char *reason)
293946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
294931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   unsigned old_state = setup->state;
29580eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
296931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (old_state == new_state)
297ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return TRUE;
2989f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
29910d0a835bc3d8eb89637381be41ffd463f363b75Keith Whitwell   if (LP_DEBUG & DEBUG_SCENE) {
3009f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      debug_printf("%s old %s new %s%s%s\n",
3019f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   __FUNCTION__,
3029f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   states[old_state],
3039f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   states[new_state],
3049f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   (new_state == SETUP_FLUSHED) ? ": " : "",
3059f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   (new_state == SETUP_FLUSHED) ? reason : "");
306f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
307f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      if (new_state == SETUP_FLUSHED && setup->scene)
30810d0a835bc3d8eb89637381be41ffd463f363b75Keith Whitwell         lp_debug_draw_bins_by_cmd_length(setup->scene);
3099f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   }
310a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca
3119f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   /* wait for a free/empty scene
3129f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell    */
3139f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   if (old_state == SETUP_FLUSHED)
3149f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      lp_setup_get_empty_scene(setup);
315931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
3169f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   switch (new_state) {
317931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_CLEARED:
318a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca      break;
319a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca
320a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca   case SETUP_ACTIVE:
321ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!begin_binning( setup ))
322ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         goto fail;
323931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
324a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca
325931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_FLUSHED:
3260718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (old_state == SETUP_CLEARED)
327ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         if (!execute_clears( setup ))
328ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell            goto fail;
3299f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
3309f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      lp_setup_rasterize_scene( setup );
331a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca      assert(setup->scene == NULL);
332931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
3330639765b2850739af1678f10fc0c5706d5827776Brian Paul
3340639765b2850739af1678f10fc0c5706d5827776Brian Paul   default:
3350639765b2850739af1678f10fc0c5706d5827776Brian Paul      assert(0 && "invalid setup state mode");
336ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      goto fail;
337946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
338946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
339931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->state = new_state;
340ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
341ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
342ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellfail:
343ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (setup->scene) {
344ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      lp_scene_end_rasterization(setup->scene);
345ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      setup->scene = NULL;
346ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   }
347ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
348ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   setup->state = SETUP_FLUSHED;
349ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   lp_setup_reset( setup );
350ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return FALSE;
351946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
352946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
353946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
354946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid
3553160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_flush( struct lp_setup_context *setup,
356b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell                struct pipe_fence_handle **fence,
357b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell                const char *reason)
358946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
3599f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   set_scene_state( setup, SETUP_FLUSHED, reason );
3603bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell
36118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (fence) {
36218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      lp_fence_reference((struct lp_fence **)fence, setup->last_fence);
3630639765b2850739af1678f10fc0c5706d5827776Brian Paul   }
364946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
365946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
366946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
367931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
3683160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_bind_framebuffer( struct lp_setup_context *setup,
3699fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul                           const struct pipe_framebuffer_state *fb )
370946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
371a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
372946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
3735fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell   /* Flush any old scene.
3745fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell    */
3759f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ );
376677a055fa0cf7b6476c716be187513c41060d417José Fonseca
3778be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca   /*
3788be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca    * Ensure the old scene is not reused.
3798be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca    */
3808be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca   assert(!setup->scene);
3818be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca
3825fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell   /* Set new state.  This will be picked up later when we next need a
3835fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell    * scene.
3845fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell    */
3857f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell   util_copy_framebuffer_state(&setup->fb, fb);
38629bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.x0 = 0;
38729bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.y0 = 0;
38829bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.x1 = fb->width-1;
38929bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.y1 = fb->height-1;
39029bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->dirty |= LP_SETUP_NEW_SCISSOR;
391946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
392946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
393946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
394a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger/*
395a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * Try to clear one color buffer of the attached fb, either by binning a clear
396a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * command or queuing up the clear for later (when binning is started).
397a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger */
3986419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean
399a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerlp_setup_try_clear_color_buffer(struct lp_setup_context *setup,
400a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                const union pipe_color_union *color,
401a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                unsigned cbuf)
40217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{
403a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   union lp_rast_cmd_arg clearrb_arg;
404a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   union util_color uc;
405a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   enum pipe_format format = setup->fb.cbufs[cbuf]->format;
40617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
407a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
40817aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
409a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (util_format_is_pure_integer(format)) {
410a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      /*
411a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * We expect int/uint clear values here, though some APIs
412a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * might disagree (but in any case util_pack_color()
413a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * couldn't handle it)...
414a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       */
415a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (util_format_is_pure_sint(format)) {
416a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         util_format_write_4i(format, color->i, 0, &uc, 0, 0, 0, 1, 1);
417a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
418a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      else {
419a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         assert(util_format_is_pure_uint(format));
420a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         util_format_write_4ui(format, color->ui, 0, &uc, 0, 0, 0, 1, 1);
421a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
422a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
423a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   else {
424a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      util_pack_color(color->f, format, &uc);
42517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
42617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
427a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (setup->state == SETUP_ACTIVE) {
428a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      struct lp_scene *scene = setup->scene;
4299f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
430a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      /* Add the clear to existing scene.  In the unusual case where
431a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * both color and depth-stencil are being cleared when there's
432a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * already been some rendering, we could discard the currently
433a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * binned scene and start again, but I don't see that as being
434a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * a common usage.
435a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       */
436a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      struct lp_rast_clear_rb *cc_scene =
437a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         (struct lp_rast_clear_rb *)
438a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            lp_scene_alloc_aligned(scene, sizeof(struct lp_rast_clear_rb), 8);
439c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell
440a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!cc_scene) {
441a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         return FALSE;
442a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
4439fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca
444a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      cc_scene->cbuf = cbuf;
445a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      cc_scene->color_val = uc;
446a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      clearrb_arg.clear_rb = cc_scene;
4479fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca
448a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!lp_scene_bin_everywhere(scene,
449a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   LP_RAST_OP_CLEAR_COLOR,
450a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   clearrb_arg))
451a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         return FALSE;
45217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
453a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   else {
454a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      /* Put ourselves into the 'pre-clear' state, specifically to try
455a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * and accumulate multiple clears to color and depth_stencil
456a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * buffers which the app or state-tracker might issue
457a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * separately.
458a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       */
459a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      set_scene_state( setup, SETUP_CLEARED, __FUNCTION__ );
460a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
461a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      assert(PIPE_CLEAR_COLOR0 == (1 << 2));
462a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.flags |= 1 << (cbuf + 2);
463a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.color_val[cbuf] = uc;
464a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
465a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
466a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   return TRUE;
467a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger}
468a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
469a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerstatic boolean
470a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerlp_setup_try_clear_zs(struct lp_setup_context *setup,
471a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                      double depth,
472a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                      unsigned stencil,
473a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                      unsigned flags)
474a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger{
475a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint64_t zsmask = 0;
476a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint64_t zsvalue = 0;
477a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint32_t zmask32;
478a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint8_t smask8;
479a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
480a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
481a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
482a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   zmask32 = (flags & PIPE_CLEAR_DEPTH) ? ~0 : 0;
483a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   smask8 = (flags & PIPE_CLEAR_STENCIL) ? ~0 : 0;
484a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
485a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   zsvalue = util_pack64_z_stencil(setup->fb.zsbuf->format,
486a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   depth,
487a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   stencil);
488a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
489a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   zsmask = util_pack64_mask_z_stencil(setup->fb.zsbuf->format,
490a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                       zmask32,
491a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                       smask8);
492a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
493a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   zsvalue &= zsmask;
49417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
495931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (setup->state == SETUP_ACTIVE) {
4969f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      struct lp_scene *scene = setup->scene;
4979f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
498663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell      /* Add the clear to existing scene.  In the unusual case where
4999a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * both color and depth-stencil are being cleared when there's
5009a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * already been some rendering, we could discard the currently
5019a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * binned scene and start again, but I don't see that as being
5029a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * a common usage.
503253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       */
504a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!lp_scene_bin_everywhere(scene,
505a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   LP_RAST_OP_CLEAR_ZSTENCIL,
506a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   lp_rast_arg_clearzs(zsvalue, zsmask)))
507a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         return FALSE;
508946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
509946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   else {
510253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell      /* Put ourselves into the 'pre-clear' state, specifically to try
511253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * and accumulate multiple clears to color and depth_stencil
512253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * buffers which the app or state-tracker might issue
513253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * separately.
51417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca       */
5159f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      set_scene_state( setup, SETUP_CLEARED, __FUNCTION__ );
5160718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
517931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      setup->clear.flags |= flags;
518c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell
519a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.zsmask |= zsmask;
520a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.zsvalue =
521a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         (setup->clear.zsvalue & ~zsmask) | (zsvalue & zsmask);
52217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
523a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
5246419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   return TRUE;
5256419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}
526946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
5276419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellvoid
5286419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_clear( struct lp_setup_context *setup,
529babab2876080af0fe65249dff559244aebd0b87eRoland Scheidegger                const union pipe_color_union *color,
5306419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                double depth,
5316419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                unsigned stencil,
5326419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                unsigned flags )
533946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
534a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   unsigned i;
535946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
536a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   /*
537a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * Note any of these (max 9) clears could fail (but at most there should
538a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * be just one failure!). This avoids doing the previous succeeded
539a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * clears again (we still clear tiles twice if a clear command succeeded
540a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * partially for one buffer).
541a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    */
542a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
543a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      unsigned flagszs = flags & PIPE_CLEAR_DEPTHSTENCIL;
544a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs)) {
545a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         lp_setup_flush(setup, NULL, __FUNCTION__);
546a9063cad0f0190ff88cd20fbad5aa87bf1a943f6Brian Paul
547a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs))
548a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            assert(0);
549a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
550a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
5513bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell
552a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (flags & PIPE_CLEAR_COLOR) {
553a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      assert(PIPE_CLEAR_COLOR0 == (1 << 2));
554a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      for (i = 0; i < setup->fb.nr_cbufs; i++) {
555a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         if ((flags & (1 << (2 + i))) && setup->fb.cbufs[i]) {
556a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            if (!lp_setup_try_clear_color_buffer(setup, color, i)) {
557a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               lp_setup_flush(setup, NULL, __FUNCTION__);
558a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
559a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               if (!lp_setup_try_clear_color_buffer(setup, color, i))
560a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                  assert(0);
561a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            }
562a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         }
563a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
564a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
565a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger}
566946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
567946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
568946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
569415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid
5703160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_triangle_state( struct lp_setup_context *setup,
571e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell                             unsigned cull_mode,
572fdfe06ad804ea13e6e436d66c1bcafe0bde2f545Brian Paul                             boolean ccw_is_frontface,
573a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca                             boolean scissor,
5742737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca                             boolean half_pixel_center,
5752737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca                             boolean bottom_edge_rule)
576415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{
577a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
578946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
579415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->ccw_is_frontface = ccw_is_frontface;
580415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->cullmode = cull_mode;
581415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->triangle = first_triangle;
5822737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   setup->pixel_offset = half_pixel_center ? 0.5f : 0.0f;
5832737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   setup->bottom_edge_rule = bottom_edge_rule;
58429bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell
58529bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   if (setup->scissor_test != scissor) {
58629bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell      setup->dirty |= LP_SETUP_NEW_SCISSOR;
58729bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell      setup->scissor_test = scissor;
58829bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   }
589946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
590946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
5915286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tayvoid
5925286dd701640976ffc328e8e85fb3830746851a1Hui Qi Taylp_setup_set_line_state( struct lp_setup_context *setup,
5935286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay			 float line_width)
5945286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay{
5955286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
596946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
5975286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay   setup->line_width = line_width;
5985286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay}
599946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
60057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tayvoid
60157d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taylp_setup_set_point_state( struct lp_setup_context *setup,
602a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                          float point_size,
60329ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay                          boolean point_size_per_vertex,
604c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul                          uint sprite_coord_enable,
605c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul                          uint sprite_coord_origin)
60657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{
60757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
60857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
60957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   setup->point_size = point_size;
610c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul   setup->sprite_coord_enable = sprite_coord_enable;
611c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul   setup->sprite_coord_origin = sprite_coord_origin;
61229ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay   setup->point_size_per_vertex = point_size_per_vertex;
61357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay}
61457d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
615931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
6165b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwelllp_setup_set_setup_variant( struct lp_setup_context *setup,
6175b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell			    const struct lp_setup_variant *variant)
618946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
6195b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
6205b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
6215b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   setup->setup.variant = variant;
622931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
623946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
6240718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid
62518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecalp_setup_set_fs_variant( struct lp_setup_context *setup,
62618fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca                         struct lp_fragment_shader_variant *variant)
627946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
628d9096926f84b33e122e3b2942ff66dc183894b50Brian Paul   LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__,
62918fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca          variant);
630d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   /* FIXME: reference count */
631946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
63218fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   setup->fs.current.variant = variant;
6330e042bed49c51fef38b02b7cc05efa504f2f703dBrian Paul   setup->dirty |= LP_SETUP_NEW_FS;
634946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
635946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
636d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
6373160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_constants(struct lp_setup_context *setup,
6381d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                          unsigned num,
6393427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul                          struct pipe_constant_buffer *buffers)
640946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
6411d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   unsigned i;
6421d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca
6431d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) buffers);
644402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
6451d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   assert(num <= Elements(setup->constants));
646931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
6471d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   for (i = 0; i < num; ++i) {
6483427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul      util_copy_constant_buffer(&setup->constants[i].current, &buffers[i]);
6493427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul   }
6503427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul   for (; i < Elements(setup->constants); i++) {
6513427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul      util_copy_constant_buffer(&setup->constants[i].current, NULL);
6521d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   }
6533427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul   setup->dirty |= LP_SETUP_NEW_CONSTANTS;
654946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
655946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
656946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
657d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
6583160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_alpha_ref_value( struct lp_setup_context *setup,
659d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                              float alpha_ref_value )
660946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
661a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s %f\n", __FUNCTION__, alpha_ref_value);
662946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
66385999695829823e459e11822b4846ed1db5c055dJosé Fonseca   if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) {
66485999695829823e459e11822b4846ed1db5c055dJosé Fonseca      setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value;
6652e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca      setup->dirty |= LP_SETUP_NEW_FS;
666d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
667d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
668946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
669d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
670eee51147979208feffdf37c588ebbce4df6b40d6Brian Paullp_setup_set_stencil_ref_values( struct lp_setup_context *setup,
671eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul                                 const ubyte refs[2] )
672eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul{
673eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul   LP_DBG(DEBUG_SETUP, "%s %d %d\n", __FUNCTION__, refs[0], refs[1]);
674eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul
675521c61ff017ab15b829abbe9a98b179136a36009Brian Paul   if (setup->fs.current.jit_context.stencil_ref_front != refs[0] ||
676521c61ff017ab15b829abbe9a98b179136a36009Brian Paul       setup->fs.current.jit_context.stencil_ref_back != refs[1]) {
677521c61ff017ab15b829abbe9a98b179136a36009Brian Paul      setup->fs.current.jit_context.stencil_ref_front = refs[0];
678521c61ff017ab15b829abbe9a98b179136a36009Brian Paul      setup->fs.current.jit_context.stencil_ref_back = refs[1];
679eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul      setup->dirty |= LP_SETUP_NEW_FS;
680eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul   }
681eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul}
682eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul
683eee51147979208feffdf37c588ebbce4df6b40d6Brian Paulvoid
6843160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_blend_color( struct lp_setup_context *setup,
685d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                          const struct pipe_blend_color *blend_color )
686d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
687a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
688946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
689f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   assert(blend_color);
690946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
691f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) {
692f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color);
693f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      setup->dirty |= LP_SETUP_NEW_BLEND_COLOR;
694d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
695d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
696946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
697946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
6984461442849bfdb817334b38567136f7f9dabdf59Brian Paulvoid
69997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusinlp_setup_set_scissors( struct lp_setup_context *setup,
70097b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin                       const struct pipe_scissor_state *scissors )
7014461442849bfdb817334b38567136f7f9dabdf59Brian Paul{
70297b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   unsigned i;
7034461442849bfdb817334b38567136f7f9dabdf59Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
704946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
70597b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   assert(scissors);
706946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
70797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   for (i = 0; i < PIPE_MAX_VIEWPORTS; ++i) {
70897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].x0 = scissors[i].minx;
70997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].x1 = scissors[i].maxx-1;
71097b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].y0 = scissors[i].miny;
71197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].y1 = scissors[i].maxy-1;
71297b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   }
71329bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->dirty |= LP_SETUP_NEW_SCISSOR;
714946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
715946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
716946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
7175ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid
7183160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_flatshade_first( struct lp_setup_context *setup,
7195ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell                              boolean flatshade_first )
720946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
7215ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   setup->flatshade_first = flatshade_first;
72217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca}
72317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
72477b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlievoid
72577b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlielp_setup_set_rasterizer_discard( struct lp_setup_context *setup,
72677b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie                                 boolean rasterizer_discard )
72777b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie{
7285b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie   if (setup->rasterizer_discard != rasterizer_discard) {
7295b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie      setup->rasterizer_discard = rasterizer_discard;
7305b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie      set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ );
7315b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie   }
73277b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie}
73317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
7345ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid
7353160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_vertex_info( struct lp_setup_context *setup,
7365ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell                          struct vertex_info *vertex_info )
73717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{
7385ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   /* XXX: just silently holding onto the pointer:
7395ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell    */
7405ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   setup->vertex_info = vertex_info;
741946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
742946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
743946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
744946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
7450319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * Called during state validation when LP_NEW_VIEWPORT is set.
7460319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure */
7470319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClurevoid
7480319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClurelp_setup_set_viewports(struct lp_setup_context *setup,
7490319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure                       unsigned num_viewports,
7500319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure                       const struct pipe_viewport_state *viewports)
7510319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure{
752e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure   struct llvmpipe_context *lp = llvmpipe_context(setup->pipe);
7530319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   unsigned i;
7540319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7550319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
7560319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7570319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   assert(num_viewports <= PIPE_MAX_VIEWPORTS);
7580319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   assert(viewports);
7590319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7600319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   /*
7610319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure    * For use in lp_state_fs.c, propagate the viewport values for all viewports.
7620319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure    */
7630319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   for (i = 0; i < num_viewports; i++) {
7640319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      float min_depth;
7650319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      float max_depth;
7660319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
767e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure      if (lp->rasterizer->clip_halfz == 0) {
768e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure         float half_depth = viewports[i].scale[2];
769e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure         min_depth = viewports[i].translate[2] - half_depth;
770e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure         max_depth = min_depth + half_depth * 2.0f;
771e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure      } else {
772e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure         min_depth = viewports[i].translate[2];
773e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure         max_depth = min_depth + viewports[i].scale[2];
774e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure      }
7750319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7760319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      if (setup->viewports[i].min_depth != min_depth ||
7770319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->viewports[i].max_depth != max_depth) {
7780319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->viewports[i].min_depth = min_depth;
7790319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->viewports[i].max_depth = max_depth;
7800319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->dirty |= LP_SETUP_NEW_VIEWPORTS;
7810319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      }
7820319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   }
7830319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure}
7840319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7850319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7860319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure/**
7871fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol * Called during state validation when LP_NEW_SAMPLER_VIEW is set.
788946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
789d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
79047bfbd452c93e6a8db013fb90d9f42210cf24889Keith Whitwelllp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
7911fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol                                    unsigned num,
7921fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol                                    struct pipe_sampler_view **views)
793946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
79417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   unsigned i;
795d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
796a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
797402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
798c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger   assert(num <= PIPE_MAX_SHADER_SAMPLER_VIEWS);
799d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
800c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger   for (i = 0; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; i++) {
8011fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol      struct pipe_sampler_view *view = i < num ? views[i] : NULL;
802d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
803fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      if (view) {
80420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger         struct pipe_resource *res = view->texture;
80520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger         struct llvmpipe_resource *lp_tex = llvmpipe_resource(res);
80685999695829823e459e11822b4846ed1db5c055dJosé Fonseca         struct lp_jit_texture *jit_tex;
80785999695829823e459e11822b4846ed1db5c055dJosé Fonseca         jit_tex = &setup->fs.current.jit_context.textures[i];
8086d50148742512606f2abd76a2dcef6c87a5c7471Roland Scheidegger
8092ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul         /* We're referencing the texture's internal data, so save a
8102ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          * reference to it.
8112ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          */
81220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger         pipe_resource_reference(&setup->fs.current_tex[i], res);
8132ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
814f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul         if (!lp_tex->dt) {
81526097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            /* regular texture - setup array of mipmap level offsets */
816f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul            int j;
81720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            unsigned first_level = 0;
81820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            unsigned last_level = 0;
81920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
82020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            if (llvmpipe_resource_is_texture(res)) {
82120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               first_level = view->u.tex.first_level;
82220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               last_level = view->u.tex.last_level;
82320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               assert(first_level <= last_level);
82420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               assert(last_level <= res->last_level);
8257e1521f191afe30fcf02a25b68fbf89278f014d3Roland Scheidegger               jit_tex->base = lp_tex->tex_data;
82620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            }
82720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            else {
828aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger              jit_tex->base = lp_tex->data;
82920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            }
83020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
831aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger            if (LP_PERF & PERF_TEX_MEM) {
832aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger               /* use dummy tile memory */
83326097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->base = lp_dummy_tile;
83426097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->width = TILE_SIZE/8;
83526097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->height = TILE_SIZE/8;
83626097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->depth = 1;
83726097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->first_level = 0;
83826097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->last_level = 0;
839b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul               jit_tex->mip_offsets[0] = 0;
840b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul               jit_tex->row_stride[0] = 0;
841b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul               jit_tex->img_stride[0] = 0;
84226097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            }
84326097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            else {
84420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->width = res->width0;
84520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->height = res->height0;
84620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->depth = res->depth0;
84720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->first_level = first_level;
84820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->last_level = last_level;
84920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
85020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               if (llvmpipe_resource_is_texture(res)) {
85120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  for (j = first_level; j <= last_level; j++) {
852aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger                     jit_tex->mip_offsets[j] = lp_tex->mip_offsets[j];
85320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     jit_tex->row_stride[j] = lp_tex->row_stride[j];
85420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     jit_tex->img_stride[j] = lp_tex->img_stride[j];
85520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  }
85620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
857e6c66f4fb060cf2566d2b5e091b76a098566344dRoland Scheidegger                  if (view->target == PIPE_TEXTURE_1D_ARRAY ||
858e6c66f4fb060cf2566d2b5e091b76a098566344dRoland Scheidegger                      view->target == PIPE_TEXTURE_2D_ARRAY ||
859e6c66f4fb060cf2566d2b5e091b76a098566344dRoland Scheidegger                      view->target == PIPE_TEXTURE_CUBE ||
860e6c66f4fb060cf2566d2b5e091b76a098566344dRoland Scheidegger                      view->target == PIPE_TEXTURE_CUBE_ARRAY) {
86187978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                     /*
86287978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * For array textures, we don't have first_layer, instead
86387978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * adjust last_layer (stored as depth) plus the mip level offsets
86487978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * (as we have mip-first layout can't just adjust base ptr).
86587978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * XXX For mip levels, could do something similar.
86687978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      */
86720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     jit_tex->depth = view->u.tex.last_layer - view->u.tex.first_layer + 1;
86887978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                     for (j = first_level; j <= last_level; j++) {
86987978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                        jit_tex->mip_offsets[j] += view->u.tex.first_layer *
87087978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                                                   lp_tex->img_stride[j];
87187978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                     }
872e6c66f4fb060cf2566d2b5e091b76a098566344dRoland Scheidegger                     if (view->target == PIPE_TEXTURE_CUBE ||
873e6c66f4fb060cf2566d2b5e091b76a098566344dRoland Scheidegger                         view->target == PIPE_TEXTURE_CUBE_ARRAY) {
874ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger                        assert(jit_tex->depth % 6 == 0);
875ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger                     }
87620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     assert(view->u.tex.first_layer <= view->u.tex.last_layer);
87720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     assert(view->u.tex.last_layer < res->array_size);
87820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  }
87920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               }
88020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               else {
88187978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                  /*
88287978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                   * For buffers, we don't have first_element, instead adjust
88387978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                   * last_element (stored as width) plus the base pointer.
88487978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                   */
88520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  unsigned view_blocksize = util_format_get_blocksize(view->format);
88620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  /* probably don't really need to fill that out */
88720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->mip_offsets[0] = 0;
88820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->row_stride[0] = 0;
8893d29e75a5f59639c3b9dfed26cd41ab13c0d60fcRoland Scheidegger                  jit_tex->img_stride[0] = 0;
89020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
89120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  /* everything specified in number of elements here. */
89220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->width = view->u.buf.last_element - view->u.buf.first_element + 1;
89320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->base = (uint8_t *)jit_tex->base + view->u.buf.first_element *
89420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                                  view_blocksize;
89520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  /* XXX Unsure if we need to sanitize parameters? */
89620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  assert(view->u.buf.first_element <= view->u.buf.last_element);
89720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  assert(view->u.buf.last_element * view_blocksize < res->width0);
8982b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul               }
899f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul            }
900b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca         }
901b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca         else {
902f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul            /* display target texture/surface */
903b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca            /*
904b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca             * XXX: Where should this be unmapped?
905b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca             */
90620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            struct llvmpipe_screen *screen = llvmpipe_screen(res->screen);
90794ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell            struct sw_winsys *winsys = screen->winsys;
90826097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            jit_tex->base = winsys->displaytarget_map(winsys, lp_tex->dt,
90926097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger                                                         PIPE_TRANSFER_READ);
910f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul            jit_tex->row_stride[0] = lp_tex->row_stride[0];
911f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul            jit_tex->img_stride[0] = lp_tex->img_stride[0];
91226097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            jit_tex->mip_offsets[0] = 0;
91320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->width = res->width0;
91420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->height = res->height0;
91520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->depth = res->depth0;
91620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->first_level = jit_tex->last_level = 0;
91726097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            assert(jit_tex->base);
918b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca         }
919d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      }
92017aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
921d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
9222e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca   setup->dirty |= LP_SETUP_NEW_FS;
923946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
924946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
925946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
926946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
927fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca * Called during state validation when LP_NEW_SAMPLER is set.
928fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca */
929fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonsecavoid
930fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonsecalp_setup_set_fragment_sampler_state(struct lp_setup_context *setup,
931fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca                                    unsigned num,
932b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul                                    struct pipe_sampler_state **samplers)
933fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca{
934fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   unsigned i;
935fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
936fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
937fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
938fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   assert(num <= PIPE_MAX_SAMPLERS);
939fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
940fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
941fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      const struct pipe_sampler_state *sampler = i < num ? samplers[i] : NULL;
942fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
943fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      if (sampler) {
944c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         struct lp_jit_sampler *jit_sam;
945c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam = &setup->fs.current.jit_context.samplers[i];
946fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
947c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam->min_lod = sampler->min_lod;
948c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam->max_lod = sampler->max_lod;
949c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam->lod_bias = sampler->lod_bias;
950c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         COPY_4V(jit_sam->border_color, sampler->border_color.f);
951fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      }
952fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   }
953fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
954fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   setup->dirty |= LP_SETUP_NEW_FS;
955fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca}
956fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
957fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
958fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca/**
959d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Is the given texture referenced by any scene?
960d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Note: we have to check all scenes including any scenes currently
961d59fe448967addb3025d7df90888ff950e03a343Brian Paul * being rendered and the current scene being built.
962946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
963cd9d9e2436a0815f6ed3a61d2cdf8fad53278506Brian Paulunsigned
964287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwelllp_setup_is_resource_referenced( const struct lp_setup_context *setup,
965287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                const struct pipe_resource *texture )
966946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
967d59fe448967addb3025d7df90888ff950e03a343Brian Paul   unsigned i;
968946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
96912872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul   /* check the render targets */
97012872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul   for (i = 0; i < setup->fb.nr_cbufs; i++) {
971d6fa71fbb0d365cefdabfea9de62cfece71f7486Brian Paul      if (setup->fb.cbufs[i] && setup->fb.cbufs[i]->texture == texture)
97225485f4b69447514ab8b595aced90c75606a99bdMarek Olšák         return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE;
97312872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul   }
974018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul   if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) {
97525485f4b69447514ab8b595aced90c75606a99bdMarek Olšák      return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE;
976946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
977946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
978018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul   /* check textures referenced by the scene */
979018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul   for (i = 0; i < Elements(setup->scenes); i++) {
980287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      if (lp_scene_is_resource_referenced(setup->scenes[i], texture)) {
98125485f4b69447514ab8b595aced90c75606a99bdMarek Olšák         return LP_REFERENCED_FOR_READ;
982018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul      }
983946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
984946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
98525485f4b69447514ab8b595aced90c75606a99bdMarek Olšák   return LP_UNREFERENCED;
986946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
987946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
988946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
989946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
990a27b12171d84c6e731af08f48a657c377f8549baBrian Paul * Called by vbuf code when we're about to draw something.
9910319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure *
9920319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * This function stores all dirty state in the current scene's display list
9930319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * memory, via lp_scene_alloc().  We can not pass pointers of mutable state to
9940319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * the JIT functions, as the JIT functions will be called later on, most likely
9950319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * on a different thread.
9960319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure *
9970319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * When processing dirty state it is imperative that we don't refer to any
9980319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * pointers previously allocated with lp_scene_alloc() in this function (or any
9990319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * function) as they may belong to a scene freed since then.
1000946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
10016419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean
10026419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelltry_update_scene_state( struct lp_setup_context *setup )
1003946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
1004586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger   static const float fake_const_buf[4];
10059f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   boolean new_scene = (setup->fs.stored == NULL);
10069f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   struct lp_scene *scene = setup->scene;
10071d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   unsigned i;
1008bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul
10099f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(scene);
1010946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10110319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   if (setup->dirty & LP_SETUP_NEW_VIEWPORTS) {
10120319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      /*
10130319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       * Record new depth range state for changes due to viewport updates.
10140319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       *
10150319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       * TODO: Collapse the existing viewport and depth range information
10160319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       *       into one structure, for access by JIT.
10170319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       */
10180319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      struct lp_jit_viewport *stored;
10190319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10200319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      stored = (struct lp_jit_viewport *)
10210319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure         lp_scene_alloc(scene, sizeof setup->viewports);
10220319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10230319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      if (!stored) {
10240319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure         assert(!new_scene);
10250319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure         return FALSE;
10260319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      }
10270319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10280319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      memcpy(stored, setup->viewports, sizeof setup->viewports);
10290319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10300319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      setup->fs.current.jit_context.viewports = stored;
10310319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      setup->dirty |= LP_SETUP_NEW_FS;
10320319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   }
10330319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
1034f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) {
1035f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      uint8_t *stored;
1036fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      float* fstored;
1037f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      unsigned i, j;
1038fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      unsigned size;
1039fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
1040fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      /* Alloc u8_blend_color (16 x i8) and f_blend_color (4 or 8 x f32) */
1041fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      size  = 4 * 16 * sizeof(uint8_t);
1042fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      size += (LP_MAX_VECTOR_LENGTH / 4) * sizeof(float);
10432f65f61beac3a45fdf27bf25d7b13cd1fa2bbb8cRoland Scheidegger      stored = lp_scene_alloc_aligned(scene, size, LP_MIN_VECTOR_ALIGN);
104480eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
10459f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      if (!stored) {
10469f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         assert(!new_scene);
10476419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         return FALSE;
10489f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      }
10496419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1050fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      /* Store floating point colour */
1051fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      fstored = (float*)(stored + 4*16);
1052fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      for (i = 0; i < (LP_MAX_VECTOR_LENGTH / 4); ++i) {
1053fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         fstored[i] = setup->blend_color.current.color[i % 4];
1054fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      }
1055fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
10566419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      /* smear each blend color component across 16 ubyte elements */
10576419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      for (i = 0; i < 4; ++i) {
10586419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]);
10596419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         for (j = 0; j < 16; ++j)
10606419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            stored[i*16 + j] = c;
1061477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul      }
1062f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca
10636419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      setup->blend_color.stored = stored;
1064fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      setup->fs.current.jit_context.u8_blend_color = stored;
1065fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      setup->fs.current.jit_context.f_blend_color = fstored;
1066f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      setup->dirty |= LP_SETUP_NEW_FS;
1067946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
1068946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10691d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   if (setup->dirty & LP_SETUP_NEW_CONSTANTS) {
10701d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      for (i = 0; i < Elements(setup->constants); ++i) {
10713427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         struct pipe_resource *buffer = setup->constants[i].current.buffer;
10723427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         const unsigned current_size = setup->constants[i].current.buffer_size;
10733427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         const ubyte *current_data = NULL;
107493b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin         int num_constants;
1075946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10761d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         if (buffer) {
10773427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            /* resource buffer */
10783427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            current_data = (ubyte *) llvmpipe_resource_data(buffer);
10793427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         }
10803427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         else if (setup->constants[i].current.user_buffer) {
10813427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            /* user-space buffer */
10823427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            current_data = (ubyte *) setup->constants[i].current.user_buffer;
10833427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         }
10843427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul
10853427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         if (current_data) {
10863427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            current_data += setup->constants[i].current.buffer_offset;
1087946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10881d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            /* TODO: copy only the actually used constants? */
1089946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10901d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            if (setup->constants[i].stored_size != current_size ||
10911d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               !setup->constants[i].stored_data ||
10921d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               memcmp(setup->constants[i].stored_data,
10931d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_data,
10941d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_size) != 0) {
10951d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               void *stored;
1096946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10971d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               stored = lp_scene_alloc(scene, current_size);
10981d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               if (!stored) {
10991d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                  assert(!new_scene);
11001d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                  return FALSE;
11011d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               }
11026419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
11031d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               memcpy(stored,
11041d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_data,
11051d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_size);
11061d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               setup->constants[i].stored_size = current_size;
11071d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               setup->constants[i].stored_data = stored;
11081d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            }
1109586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger            setup->fs.current.jit_context.constants[i] =
1110586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger               setup->constants[i].stored_data;
11111d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         }
11121d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         else {
11131d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            setup->constants[i].stored_size = 0;
11141d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            setup->constants[i].stored_data = NULL;
1115586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger            setup->fs.current.jit_context.constants[i] = fake_const_buf;
1116946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca         }
1117946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
111893b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin         num_constants =
111993b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin            setup->constants[i].stored_size / (sizeof(float) * 4);
112093b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin         setup->fs.current.jit_context.num_constants[i] = num_constants;
11211d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         setup->dirty |= LP_SETUP_NEW_FS;
11221d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      }
11232e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca   }
11242e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca
11252e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca
11266419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   if (setup->dirty & LP_SETUP_NEW_FS) {
11276419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      if (!setup->fs.stored ||
11286419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell          memcmp(setup->fs.stored,
11296419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                 &setup->fs.current,
11306419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                 sizeof setup->fs.current) != 0)
11316419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      {
11326419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         struct lp_rast_state *stored;
11336419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1134663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell         /* The fs state that's been stored in the scene is different from
1135e2f46344560f8f1193b311ad41883011e67eea00Brian Paul          * the new, current state.  So allocate a new lp_rast_state object
1136e2f46344560f8f1193b311ad41883011e67eea00Brian Paul          * and append it to the bin's setup data buffer.
1137e2f46344560f8f1193b311ad41883011e67eea00Brian Paul          */
11386419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         stored = (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored);
11399f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         if (!stored) {
11409f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell            assert(!new_scene);
11416419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            return FALSE;
11429f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         }
11432ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
11446419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         memcpy(stored,
11456419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                &setup->fs.current,
11466419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                sizeof setup->fs.current);
11476419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         setup->fs.stored = stored;
11486419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
11492ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul         /* The scene now references the textures in the rasterization
11502ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          * state record.  Note that now.
11512ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          */
11522ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul         for (i = 0; i < Elements(setup->fs.current_tex); i++) {
11536419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            if (setup->fs.current_tex[i]) {
11546419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell               if (!lp_scene_add_resource_reference(scene,
11559f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                                    setup->fs.current_tex[i],
11569f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                                    new_scene)) {
11579f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                  assert(!new_scene);
11586419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                  return FALSE;
11599f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell               }
11606419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            }
1161d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell         }
1162d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell      }
1163d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell   }
1164d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell
116529bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   if (setup->dirty & LP_SETUP_NEW_SCISSOR) {
116697b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      unsigned i;
116797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      for (i = 0; i < PIPE_MAX_VIEWPORTS; ++i) {
116897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin         setup->draw_regions[i] = setup->framebuffer;
116997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin         if (setup->scissor_test) {
117097b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin            u_rect_possible_intersection(&setup->scissors[i],
117197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin                                         &setup->draw_regions[i]);
117297b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin         }
117329bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell      }
117429bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   }
1175bfcf1ba1c4879102eb05460528b02a23d81eac99Roland Scheidegger
11762e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca   setup->dirty = 0;
11772e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca
117885999695829823e459e11822b4846ed1db5c055dJosé Fonseca   assert(setup->fs.stored);
11796419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   return TRUE;
11806419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}
11816419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1182ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellboolean
11839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_setup_update_state( struct lp_setup_context *setup,
11849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                       boolean update_scene )
11856419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{
11866419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   /* Some of the 'draw' pipeline stages may have changed some driver state.
11876419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * Make sure we've processed those state changes before anything else.
11886419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    *
11896419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * XXX this is the only place where llvmpipe_context is used in the
11906419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * setup code.  This may get refactored/changed...
11916419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    */
11926419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   {
11936419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      struct llvmpipe_context *lp = llvmpipe_context(setup->pipe);
11946419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      if (lp->dirty) {
11956419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         llvmpipe_update_derived(lp);
11966419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      }
11976419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1198efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      if (lp->setup->dirty) {
1199efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         llvmpipe_update_setup(lp);
1200efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      }
1201efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1202efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      assert(setup->setup.variant);
1203efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
12046419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      /* Will probably need to move this somewhere else, just need
12056419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell       * to know about vertex shader point size attribute.
12066419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell       */
12076419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      setup->psize = lp->psize_slot;
120897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->viewport_index_slot = lp->viewport_index_slot;
1209d8146f240e628e70d4c07f7e805a179f70c36e23Roland Scheidegger      setup->layer_slot = lp->layer_slot;
1210d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin      setup->face_slot = lp->face_slot;
12116419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
12126419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      assert(lp->dirty == 0);
12135b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
12145b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      assert(lp->setup_variant.key.size ==
12155b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	     setup->setup.variant->key.size);
12165b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
12175b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      assert(memcmp(&lp->setup_variant.key,
12185b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell		    &setup->setup.variant->key,
12195b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell		    setup->setup.variant->key.size) == 0);
12206419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   }
12216419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
122268a4f6324712d7eae327ee438a41c432ec72f11dKeith Whitwell   if (update_scene && setup->state != SETUP_ACTIVE) {
1223ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!set_scene_state( setup, SETUP_ACTIVE, __FUNCTION__ ))
1224ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1225ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   }
12269f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
12279f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   /* Only call into update_scene_state() if we already have a
12286419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * scene:
12296419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    */
12309f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   if (update_scene && setup->scene) {
12319f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      assert(setup->state == SETUP_ACTIVE);
1232ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1233ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (try_update_scene_state(setup))
1234ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return TRUE;
1235ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1236ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      /* Update failed, try to restart the scene.
1237ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       *
1238ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       * Cannot call lp_setup_flush_and_restart() directly here
1239ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       * because of potential recursion.
1240ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       */
1241ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__))
1242ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1243ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1244ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!set_scene_state(setup, SETUP_ACTIVE, __FUNCTION__))
1245ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1246ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1247ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!setup->scene)
1248ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1249ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1250ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return try_update_scene_state(setup);
12516419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   }
1252ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1253ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
1254946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1255946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1256608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca
1257946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1258b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell/* Only caller is lp_setup_vbuf_destroy()
1259b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell */
1260253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid
12613160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_destroy( struct lp_setup_context *setup )
1262946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
12632ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul   uint i;
12642ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
12659f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_setup_reset( setup );
1266946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
12675f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul   util_unreference_framebuffer_state(&setup->fb);
12685f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul
12692ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul   for (i = 0; i < Elements(setup->fs.current_tex); i++) {
1270287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&setup->fs.current_tex[i], NULL);
12712ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul   }
12722ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
12731d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   for (i = 0; i < Elements(setup->constants); i++) {
12743427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul      pipe_resource_reference(&setup->constants[i].current.buffer, NULL);
12751d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   }
1276946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1277663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   /* free the scenes in the 'empty' queue */
12789f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   for (i = 0; i < Elements(setup->scenes); i++) {
12799f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      struct lp_scene *scene = setup->scenes[i];
12809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
12819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      if (scene->fence)
12829f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         lp_fence_wait(scene->fence);
12839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
1284663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell      lp_scene_destroy(scene);
1285946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
1286946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1287cdd4f04f80de91d6d4e5b904ec66386d6546f977José Fonseca   lp_fence_reference(&setup->last_fence, NULL);
1288cdd4f04f80de91d6d4e5b904ec66386d6546f977José Fonseca
128989498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell   FREE( setup );
1290946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1291946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1292946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1293946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
12945ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * Create a new primitive tiling engine.  Plug it into the backend of
12955ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * the draw module.  Currently also creates a rasterizer to use with
12965ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * it.
1297946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
12983160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastruct lp_setup_context *
12995fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwelllp_setup_create( struct pipe_context *pipe,
13005ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell                 struct draw_context *draw )
1301946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
130239be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca   struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen);
1303c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   struct lp_setup_context *setup;
130439be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca   unsigned i;
1305946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1306c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   setup = CALLOC_STRUCT(lp_setup_context);
1307c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   if (!setup) {
1308c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      goto no_setup;
1309c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   }
1310a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell
13115ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   lp_setup_init_vbuf(setup);
13126419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
13136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   /* Used only in update_state():
13146419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    */
13156419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   setup->pipe = pipe;
13165ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
1317946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
131839be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca   setup->num_threads = screen->num_threads;
13195ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   setup->vbuf = draw_vbuf_stage(draw, &setup->base);
1320c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   if (!setup->vbuf) {
1321c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      goto no_vbuf;
1322c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   }
13235ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
13245ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   draw_set_rasterize_stage(draw, setup->vbuf);
13255ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   draw_set_render(draw, &setup->base);
13265ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
1327663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   /* create some empty scenes */
1328663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   for (i = 0; i < MAX_SCENES; i++) {
13299f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      setup->scenes[i] = lp_scene_create( pipe );
1330c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      if (!setup->scenes[i]) {
1331c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca         goto no_scenes;
1332c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      }
133380eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell   }
1334946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1335163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->triangle = first_triangle;
1336163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->line     = first_line;
1337163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->point    = first_point;
1338163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell
1339301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca   setup->dirty = ~0;
134008811032c2dd8f38d2ef65d7fd8794112e029b63Keith Whitwell
1341946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   return setup;
1342931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1343c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_scenes:
1344c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   for (i = 0; i < MAX_SCENES; i++) {
1345c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      if (setup->scenes[i]) {
1346c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca         lp_scene_destroy(setup->scenes[i]);
1347c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      }
1348c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   }
13495ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
1350c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   setup->vbuf->destroy(setup->vbuf);
1351c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_vbuf:
1352931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   FREE(setup);
1353c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_setup:
1354931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   return NULL;
1355946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1356946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
135786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
135886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/**
135986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put a BeginQuery command into all bins.
136086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */
136186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid
136286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_begin_query(struct lp_setup_context *setup,
136386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li                     struct llvmpipe_query *pq)
136486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{
136542dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul
136642dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul   set_scene_state(setup, SETUP_ACTIVE, "begin_query");
1367dc5dc4fd943e1da5207e0489c355e9a7ba1dff87Roland Scheidegger
136808203428800554215657f1ebf19d74328103800eRoland Scheidegger   if (!(pq->type == PIPE_QUERY_OCCLUSION_COUNTER ||
136908203428800554215657f1ebf19d74328103800eRoland Scheidegger         pq->type == PIPE_QUERY_OCCLUSION_PREDICATE ||
137008203428800554215657f1ebf19d74328103800eRoland Scheidegger         pq->type == PIPE_QUERY_PIPELINE_STATISTICS))
137108203428800554215657f1ebf19d74328103800eRoland Scheidegger      return;
137216f0d70ffe6d42d22b9e6b927b297e75a199aa78James Benton
137308203428800554215657f1ebf19d74328103800eRoland Scheidegger   /* init the query to its beginning state */
13742e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   assert(setup->active_binned_queries < LP_MAX_ACTIVE_BINNED_QUERIES);
13752e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   /* exceeding list size so just ignore the query */
13762e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   if (setup->active_binned_queries >= LP_MAX_ACTIVE_BINNED_QUERIES) {
13772e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      return;
13782e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   }
13792e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   assert(setup->active_queries[setup->active_binned_queries] == NULL);
13802e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   setup->active_queries[setup->active_binned_queries] = pq;
13812e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   setup->active_binned_queries++;
13828cce283038bf51a03de6734523c3e9ea8c8a6f33Brian Paul
138308203428800554215657f1ebf19d74328103800eRoland Scheidegger   assert(setup->scene);
138418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (setup->scene) {
13856419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      if (!lp_scene_bin_everywhere(setup->scene,
13869f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                   LP_RAST_OP_BEGIN_QUERY,
13876419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                                   lp_rast_arg_query(pq))) {
13889f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
1389ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         if (!lp_setup_flush_and_restart(setup))
1390ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell            return;
13916419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
13926419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         if (!lp_scene_bin_everywhere(setup->scene,
13939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                      LP_RAST_OP_BEGIN_QUERY,
13946419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                                      lp_rast_arg_query(pq))) {
13956419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            return;
13966419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         }
13976419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      }
139859b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger      setup->scene->had_queries |= TRUE;
139918452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   }
140086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li}
140186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
140286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
140386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/**
140486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put an EndQuery command into all bins.
140586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */
140686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid
140786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq)
140886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{
140942dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul   set_scene_state(setup, SETUP_ACTIVE, "end_query");
141042dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul
141108203428800554215657f1ebf19d74328103800eRoland Scheidegger   assert(setup->scene);
141218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (setup->scene) {
141318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      /* pq->fence should be the fence of the *last* scene which
141418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell       * contributed to the query result.
141518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell       */
141618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      lp_fence_reference(&pq->fence, setup->scene->fence);
141718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
141808203428800554215657f1ebf19d74328103800eRoland Scheidegger      if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER ||
141908203428800554215657f1ebf19d74328103800eRoland Scheidegger          pq->type == PIPE_QUERY_OCCLUSION_PREDICATE ||
142008203428800554215657f1ebf19d74328103800eRoland Scheidegger          pq->type == PIPE_QUERY_PIPELINE_STATISTICS ||
142108203428800554215657f1ebf19d74328103800eRoland Scheidegger          pq->type == PIPE_QUERY_TIMESTAMP) {
14227d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger         if (pq->type == PIPE_QUERY_TIMESTAMP &&
14237d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger               !(setup->scene->tiles_x | setup->scene->tiles_y)) {
14247d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger            /*
14257d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger             * If there's a zero width/height framebuffer, there's no bins and
14267d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger             * hence no rast task is ever run. So fill in something here instead.
14277d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger             */
14287d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger            pq->end[0] = os_time_get_nano();
14297d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger         }
14307d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger
143108203428800554215657f1ebf19d74328103800eRoland Scheidegger         if (!lp_scene_bin_everywhere(setup->scene,
143208203428800554215657f1ebf19d74328103800eRoland Scheidegger                                      LP_RAST_OP_END_QUERY,
143308203428800554215657f1ebf19d74328103800eRoland Scheidegger                                      lp_rast_arg_query(pq))) {
143408203428800554215657f1ebf19d74328103800eRoland Scheidegger            if (!lp_setup_flush_and_restart(setup))
143508203428800554215657f1ebf19d74328103800eRoland Scheidegger               goto fail;
143608203428800554215657f1ebf19d74328103800eRoland Scheidegger
143708203428800554215657f1ebf19d74328103800eRoland Scheidegger            if (!lp_scene_bin_everywhere(setup->scene,
143808203428800554215657f1ebf19d74328103800eRoland Scheidegger                                         LP_RAST_OP_END_QUERY,
143908203428800554215657f1ebf19d74328103800eRoland Scheidegger                                         lp_rast_arg_query(pq))) {
144008203428800554215657f1ebf19d74328103800eRoland Scheidegger               goto fail;
144108203428800554215657f1ebf19d74328103800eRoland Scheidegger            }
144208203428800554215657f1ebf19d74328103800eRoland Scheidegger         }
144359b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger         setup->scene->had_queries |= TRUE;
14446419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      }
144518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   }
144618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   else {
144718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      lp_fence_reference(&pq->fence, setup->last_fence);
144818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   }
144908203428800554215657f1ebf19d74328103800eRoland Scheidegger
145008203428800554215657f1ebf19d74328103800eRoland Scheideggerfail:
145108203428800554215657f1ebf19d74328103800eRoland Scheidegger   /* Need to do this now not earlier since it still needs to be marked as
145208203428800554215657f1ebf19d74328103800eRoland Scheidegger    * active when binning it would cause a flush.
145308203428800554215657f1ebf19d74328103800eRoland Scheidegger    */
14542e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER ||
14552e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      pq->type == PIPE_QUERY_OCCLUSION_PREDICATE ||
14562e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      pq->type == PIPE_QUERY_PIPELINE_STATISTICS) {
14572e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      unsigned i;
14582e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger
14592e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      /* remove from active binned query list */
14602e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      for (i = 0; i < setup->active_binned_queries; i++) {
14612e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger         if (setup->active_queries[i] == pq)
14622e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger            break;
14632e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      }
14642e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      assert(i < setup->active_binned_queries);
14652e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      if (i == setup->active_binned_queries)
14662e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger         return;
14672e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      setup->active_binned_queries--;
14682e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      setup->active_queries[i] = setup->active_queries[setup->active_binned_queries];
14692e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      setup->active_queries[setup->active_binned_queries] = NULL;
14702e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   }
147186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li}
147218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
147318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
1474ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellboolean
14756419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_flush_and_restart(struct lp_setup_context *setup)
14766419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{
14776419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   if (0) debug_printf("%s\n", __FUNCTION__);
14786419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
14796419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
1480ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1481ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__))
1482ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
1483ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1484ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!lp_setup_update_state(setup, TRUE))
1485ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
1486ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1487ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
14886419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}
14899f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
14909f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
1491