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