lp_setup.c revision ea05cfaacac29d15c9c3d939e12546eba95f05d0
1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**************************************************************************
2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc.
4946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * All Rights Reserved.
5946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
6946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * copy of this software and associated documentation files (the
8946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * "Software"), to deal in the Software without restriction, including
9946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * the following conditions:
13946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
14946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * The above copyright notice and this permission notice (including the
15946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * next paragraph) shall be included in all copies or substantial portions
16946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * of the Software.
17946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
18946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
26946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca **************************************************************************/
27946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
28946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
29931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Tiling engine.
30946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
31931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Builds per-tile display lists and executes them on calls to
32931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * lp_setup_flush().
33946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
34946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
3586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li#include <limits.h>
3686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
37d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "pipe/p_defines.h"
381fc5a318a64b10567ed6990eb04b2dc3ecb2b347Brian Paul#include "util/u_framebuffer.h"
39a1af8eec66c5f7ec421e8011b41c1a7c36319f9fJosé Fonseca#include "util/u_inlines.h"
40946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h"
41253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell#include "util/u_pack_color.h"
42c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca#include "draw/draw_pipe.h"
437d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger#include "os/os_time.h"
449fae289fcd098027952c6b586292214ec586a2ecBrian Paul#include "lp_context.h"
452b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul#include "lp_memory.h"
46663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#include "lp_scene.h"
47d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_texture.h"
485ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_debug.h"
495ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_fence.h"
5086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li#include "lp_query.h"
515ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_rast.h"
52d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_setup_context.h"
53b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca#include "lp_screen.h"
549fae289fcd098027952c6b586292214ec586a2ecBrian Paul#include "lp_state.h"
5523e951d0da5802fec70996e46ad6f0abc411594cKeith Whitwell#include "state_tracker/sw_winsys.h"
56946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
575ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_context.h"
585ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_vbuf.h"
5980eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
60677a055fa0cf7b6476c716be187513c41060d417José Fonseca
61ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean set_scene_state( struct lp_setup_context *, enum setup_state,
629f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                             const char *reason);
639f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic boolean try_update_scene_state( struct lp_setup_context *setup );
64946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
65946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
669f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic void
679f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_setup_get_empty_scene(struct lp_setup_context *setup)
6822b07b8be4c2939b00e10f17fa91e68682808594Brian Paul{
69db9a1052d1b2014419134c93aa4e05c9d1579378José Fonseca   assert(setup->scene == NULL);
70db9a1052d1b2014419134c93aa4e05c9d1579378José Fonseca
719f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->scene_idx++;
729f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->scene_idx %= Elements(setup->scenes);
739f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
749f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->scene = setup->scenes[setup->scene_idx];
759f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
769f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   if (setup->scene->fence) {
779f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      if (LP_DEBUG & DEBUG_SETUP)
789f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         debug_printf("%s: wait for scene %d\n",
799f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                      __FUNCTION__, setup->scene->fence->id);
809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      lp_fence_wait(setup->scene->fence);
823bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul   }
839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
842d368b982af5e6566c7da7fd2bc8b190af28188bJosé Fonseca   lp_scene_begin_binning(setup->scene, &setup->fb, setup->rasterizer_discard);
852d368b982af5e6566c7da7fd2bc8b190af28188bJosé Fonseca
8622b07b8be4c2939b00e10f17fa91e68682808594Brian Paul}
87946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
88946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
894d2b0eb19e432f83845a55d552b5d1d61f040459José Fonsecastatic void
903160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_triangle( struct lp_setup_context *setup,
91253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v0)[4],
92253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v1)[4],
93253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v2)[4])
944d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca{
959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
96253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_triangle( setup );
97253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->triangle( setup, v0, v1, v2 );
98253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
994d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
100253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
1013160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_line( struct lp_setup_context *setup,
102253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	    const float (*v0)[4],
103253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	    const float (*v1)[4])
104253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
1059f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
106253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_line( setup );
107253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->line( setup, v0, v1 );
1084d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca}
1094d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
110253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
1113160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_point( struct lp_setup_context *setup,
112253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	     const float (*v0)[4])
113253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
1149f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
115253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_point( setup );
116253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->point( setup, v0 );
117253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
1184d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
119efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulvoid lp_setup_reset( struct lp_setup_context *setup )
120931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
1211d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   unsigned i;
1221d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca
123a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
1244d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca
125301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca   /* Reset derived state */
1261d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   for (i = 0; i < Elements(setup->constants); ++i) {
1271d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      setup->constants[i].stored_size = 0;
1281d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      setup->constants[i].stored_data = NULL;
1291d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   }
130301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca   setup->fs.stored = NULL;
131f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   setup->dirty = ~0;
132946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1333bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul   /* no current bin */
134663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   setup->scene = NULL;
135946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1360718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Reset some state:
1370718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
138c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell   memset(&setup->clear, 0, sizeof setup->clear);
139946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
140253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   /* Have an explicit "start-binning" call and get rid of this
141253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell    * pointer twiddling?
142946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca    */
143253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->line = first_line;
144253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->point = first_point;
145253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->triangle = first_triangle;
146946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
147946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
148946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
149663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell/** Rasterize all scene's bins */
150931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
151b73c9ba9195ac436960b90649db35bb11d23f9d0Brian Paullp_setup_rasterize_scene( struct lp_setup_context *setup )
152946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
1539f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   struct lp_scene *scene = setup->scene;
154edac740095fb2514b512034b334947f72648cd51Roland Scheidegger   struct llvmpipe_screen *screen = llvmpipe_screen(scene->pipe->screen);
155946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1562e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   scene->num_active_queries = setup->active_binned_queries;
1572e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   memcpy(scene->active_queries, setup->active_queries,
1582e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger          scene->num_active_queries * sizeof(scene->active_queries[0]));
15908203428800554215657f1ebf19d74328103800eRoland Scheidegger
1609f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_scene_end_binning(scene);
1619f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
16218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   lp_fence_reference(&setup->last_fence, scene->fence);
16318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
16418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (setup->last_fence)
16518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      setup->last_fence->issued = TRUE;
16618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
167edac740095fb2514b512034b334947f72648cd51Roland Scheidegger   pipe_mutex_lock(screen->rast_mutex);
1689f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_rast_queue_scene(screen->rast, scene);
1699f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_rast_finish(screen->rast);
170edac740095fb2514b512034b334947f72648cd51Roland Scheidegger   pipe_mutex_unlock(screen->rast_mutex);
171946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1729f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_scene_end_rasterization(setup->scene);
1739f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_setup_reset( setup );
174946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
175a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__);
17680eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell}
17780eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
178931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
179931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
180ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean
1813160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecabegin_binning( struct lp_setup_context *setup )
18280eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell{
1839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   struct lp_scene *scene = setup->scene;
1841e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger   boolean need_zsload = FALSE;
1859f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   boolean ok;
18618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
187040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   assert(scene);
188040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   assert(scene->fence == NULL);
189040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell
190040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   /* Always create a fence:
19118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell    */
192040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell   scene->fence = lp_fence_create(MAX2(1, setup->num_threads));
193ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!scene->fence)
194ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
195040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith 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
205a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   LP_DBG(DEBUG_SETUP, "%s color clear bufs: %x depth: %s\n", __FUNCTION__,
206a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger          setup->clear.flags >> 2,
2071e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger          need_zsload ? "clear": "load");
208402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
209a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (setup->clear.flags & PIPE_CLEAR_COLOR) {
210a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      unsigned cbuf;
211a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      for (cbuf = 0; cbuf < setup->fb.nr_cbufs; cbuf++) {
212a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         assert(PIPE_CLEAR_COLOR0 == 1 << 2);
213a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         if (setup->clear.flags & (1 << (2 + cbuf))) {
214a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            union lp_rast_cmd_arg clearrb_arg;
215a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            struct lp_rast_clear_rb *cc_scene =
216a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               (struct lp_rast_clear_rb *)
217a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                  lp_scene_alloc(scene, sizeof(struct lp_rast_clear_rb));
218a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
219a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            if (!cc_scene) {
220a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               return FALSE;
221a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            }
222a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
223a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            cc_scene->cbuf = cbuf;
224a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            cc_scene->color_val = setup->clear.color_val[cbuf];
225a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            clearrb_arg.clear_rb = cc_scene;
226a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
227a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            if (!lp_scene_bin_everywhere(scene,
228a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                         LP_RAST_OP_CLEAR_COLOR,
229a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                         clearrb_arg))
230a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               return FALSE;
231a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         }
2320639765b2850739af1678f10fc0c5706d5827776Brian Paul      }
233931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
234931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
2357f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell   if (setup->fb.zsbuf) {
2360639765b2850739af1678f10fc0c5706d5827776Brian Paul      if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) {
2376419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         ok = lp_scene_bin_everywhere( scene,
2389f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                       LP_RAST_OP_CLEAR_ZSTENCIL,
2396419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                                       lp_rast_arg_clearzs(
2409f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                          setup->clear.zsvalue,
2419f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                          setup->clear.zsmask));
242ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         if (!ok)
243ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell            return FALSE;
2440639765b2850739af1678f10fc0c5706d5827776Brian Paul      }
245931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
2463094fc200920f9d5eb62136d3b25896229fb0dbfBrian Paul
2479f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->clear.flags = 0;
2489f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->clear.zsmask = 0;
2499f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   setup->clear.zsvalue = 0;
2509f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
25159b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger   scene->had_queries = !!setup->active_binned_queries;
25259b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger
253a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s done\n", __FUNCTION__);
254ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
255946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
256946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
257946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
258931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen
259931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears.
260931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell *
261931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles.
262b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca */
263ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean
2643160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaexecute_clears( struct lp_setup_context *setup )
265b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca{
266a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
267b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca
268ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return begin_binning( setup );
269b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca}
270b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca
2719f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellconst char *states[] = {
2729f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   "FLUSHED",
2739f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   "CLEARED",
2749f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   "ACTIVE "
2759f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell};
2769f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
277b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca
278ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean
2793160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaset_scene_state( struct lp_setup_context *setup,
2809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                 enum setup_state new_state,
2819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                 const char *reason)
282946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
283931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   unsigned old_state = setup->state;
28480eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
285931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (old_state == new_state)
286ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return TRUE;
2879f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
28810d0a835bc3d8eb89637381be41ffd463f363b75Keith Whitwell   if (LP_DEBUG & DEBUG_SCENE) {
2899f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      debug_printf("%s old %s new %s%s%s\n",
2909f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   __FUNCTION__,
2919f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   states[old_state],
2929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   states[new_state],
2939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   (new_state == SETUP_FLUSHED) ? ": " : "",
2949f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                   (new_state == SETUP_FLUSHED) ? reason : "");
295f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
296f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      if (new_state == SETUP_FLUSHED && setup->scene)
29710d0a835bc3d8eb89637381be41ffd463f363b75Keith Whitwell         lp_debug_draw_bins_by_cmd_length(setup->scene);
2989f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   }
299a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca
3009f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   /* wait for a free/empty scene
3019f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell    */
3029f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   if (old_state == SETUP_FLUSHED)
3039f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      lp_setup_get_empty_scene(setup);
304931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
3059f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   switch (new_state) {
306931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_CLEARED:
307a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca      break;
308a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca
309a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca   case SETUP_ACTIVE:
310ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!begin_binning( setup ))
311ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         goto fail;
312931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
313a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca
314931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_FLUSHED:
3150718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (old_state == SETUP_CLEARED)
316ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         if (!execute_clears( setup ))
317ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell            goto fail;
3189f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
3199f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      lp_setup_rasterize_scene( setup );
320a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca      assert(setup->scene == NULL);
321931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
3220639765b2850739af1678f10fc0c5706d5827776Brian Paul
3230639765b2850739af1678f10fc0c5706d5827776Brian Paul   default:
3240639765b2850739af1678f10fc0c5706d5827776Brian Paul      assert(0 && "invalid setup state mode");
325ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      goto fail;
326946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
327946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
328931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->state = new_state;
329ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
330ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
331ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellfail:
332ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (setup->scene) {
333ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      lp_scene_end_rasterization(setup->scene);
334ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      setup->scene = NULL;
335ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   }
336ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
337ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   setup->state = SETUP_FLUSHED;
338ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   lp_setup_reset( setup );
339ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return FALSE;
340946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
341946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
342946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
343946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid
3443160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_flush( struct lp_setup_context *setup,
345b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell                struct pipe_fence_handle **fence,
346b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell                const char *reason)
347946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
3489f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   set_scene_state( setup, SETUP_FLUSHED, reason );
3493bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell
35018452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (fence) {
35118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      lp_fence_reference((struct lp_fence **)fence, setup->last_fence);
3520639765b2850739af1678f10fc0c5706d5827776Brian Paul   }
353946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
354946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
355946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
356931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
3573160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_bind_framebuffer( struct lp_setup_context *setup,
3589fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul                           const struct pipe_framebuffer_state *fb )
359946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
360a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
361946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
3625fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell   /* Flush any old scene.
3635fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell    */
3649f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ );
365677a055fa0cf7b6476c716be187513c41060d417José Fonseca
3668be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca   /*
3678be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca    * Ensure the old scene is not reused.
3688be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca    */
3698be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca   assert(!setup->scene);
3708be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca
3715fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell   /* Set new state.  This will be picked up later when we next need a
3725fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell    * scene.
3735fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell    */
3747f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell   util_copy_framebuffer_state(&setup->fb, fb);
37529bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.x0 = 0;
37629bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.y0 = 0;
37729bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.x1 = fb->width-1;
37829bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->framebuffer.y1 = fb->height-1;
37929bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->dirty |= LP_SETUP_NEW_SCISSOR;
380946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
381946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
382946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
383a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger/*
384a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * Try to clear one color buffer of the attached fb, either by binning a clear
385a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * command or queuing up the clear for later (when binning is started).
386a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger */
3876419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean
388a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerlp_setup_try_clear_color_buffer(struct lp_setup_context *setup,
389a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                const union pipe_color_union *color,
390a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                unsigned cbuf)
39117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{
392a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   union lp_rast_cmd_arg clearrb_arg;
393a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   union util_color uc;
394a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   enum pipe_format format = setup->fb.cbufs[cbuf]->format;
39517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
396a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
39717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
398a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (util_format_is_pure_integer(format)) {
399a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      /*
400a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * We expect int/uint clear values here, though some APIs
401a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * might disagree (but in any case util_pack_color()
402a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * couldn't handle it)...
403a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       */
404a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (util_format_is_pure_sint(format)) {
405a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         util_format_write_4i(format, color->i, 0, &uc, 0, 0, 0, 1, 1);
406a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
407a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      else {
408a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         assert(util_format_is_pure_uint(format));
409a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         util_format_write_4ui(format, color->ui, 0, &uc, 0, 0, 0, 1, 1);
410a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
411a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
412a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   else {
413a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      util_pack_color(color->f, format, &uc);
41417aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
41517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
416a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (setup->state == SETUP_ACTIVE) {
417a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      struct lp_scene *scene = setup->scene;
4189f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
419a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      /* Add the clear to existing scene.  In the unusual case where
420a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * both color and depth-stencil are being cleared when there's
421a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * already been some rendering, we could discard the currently
422a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * binned scene and start again, but I don't see that as being
423a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * a common usage.
424a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       */
425a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      struct lp_rast_clear_rb *cc_scene =
426a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         (struct lp_rast_clear_rb *)
427a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            lp_scene_alloc_aligned(scene, sizeof(struct lp_rast_clear_rb), 8);
428c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell
429a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!cc_scene) {
430a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         return FALSE;
431a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
4329fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca
433a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      cc_scene->cbuf = cbuf;
434a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      cc_scene->color_val = uc;
435a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      clearrb_arg.clear_rb = cc_scene;
4369fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca
437a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!lp_scene_bin_everywhere(scene,
438a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   LP_RAST_OP_CLEAR_COLOR,
439a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   clearrb_arg))
440a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         return FALSE;
44117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
442a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   else {
443a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      /* Put ourselves into the 'pre-clear' state, specifically to try
444a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * and accumulate multiple clears to color and depth_stencil
445a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * buffers which the app or state-tracker might issue
446a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       * separately.
447a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger       */
448a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      set_scene_state( setup, SETUP_CLEARED, __FUNCTION__ );
449a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
450a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      assert(PIPE_CLEAR_COLOR0 == (1 << 2));
451a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.flags |= 1 << (cbuf + 2);
452a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.color_val[cbuf] = uc;
453a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
454a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
455a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   return TRUE;
456a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger}
457a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
458a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerstatic boolean
459a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerlp_setup_try_clear_zs(struct lp_setup_context *setup,
460a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                      double depth,
461a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                      unsigned stencil,
462a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                      unsigned flags)
463a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger{
464a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint64_t zsmask = 0;
465a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint64_t zsvalue = 0;
466a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint32_t zmask32;
467a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   uint8_t smask8;
468a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
469a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
470a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
471a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   zmask32 = (flags & PIPE_CLEAR_DEPTH) ? ~0 : 0;
472a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   smask8 = (flags & PIPE_CLEAR_STENCIL) ? ~0 : 0;
473a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
474a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   zsvalue = util_pack64_z_stencil(setup->fb.zsbuf->format,
475a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   depth,
476a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   stencil);
477a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
478a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   zsmask = util_pack64_mask_z_stencil(setup->fb.zsbuf->format,
479a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                       zmask32,
480a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                       smask8);
481a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
482a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   zsvalue &= zsmask;
48317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
484931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (setup->state == SETUP_ACTIVE) {
4859f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      struct lp_scene *scene = setup->scene;
4869f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
487663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell      /* Add the clear to existing scene.  In the unusual case where
4889a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * both color and depth-stencil are being cleared when there's
4899a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * already been some rendering, we could discard the currently
4909a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * binned scene and start again, but I don't see that as being
4919a6567f1ed88727545f747e8670b713f17627c94Brian Paul       * a common usage.
492253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       */
493a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!lp_scene_bin_everywhere(scene,
494a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   LP_RAST_OP_CLEAR_ZSTENCIL,
495a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                                   lp_rast_arg_clearzs(zsvalue, zsmask)))
496a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         return FALSE;
497946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
498946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   else {
499253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell      /* Put ourselves into the 'pre-clear' state, specifically to try
500253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * and accumulate multiple clears to color and depth_stencil
501253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * buffers which the app or state-tracker might issue
502253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * separately.
50317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca       */
5049f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      set_scene_state( setup, SETUP_CLEARED, __FUNCTION__ );
5050718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
506931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      setup->clear.flags |= flags;
507c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell
508a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.zsmask |= zsmask;
509a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      setup->clear.zsvalue =
510a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         (setup->clear.zsvalue & ~zsmask) | (zsvalue & zsmask);
51117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
512a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
5136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   return TRUE;
5146419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}
515946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
5166419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellvoid
5176419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_clear( struct lp_setup_context *setup,
518babab2876080af0fe65249dff559244aebd0b87eRoland Scheidegger                const union pipe_color_union *color,
5196419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                double depth,
5206419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                unsigned stencil,
5216419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                unsigned flags )
522946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
523a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   unsigned i;
524946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
525a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   /*
526a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * Note any of these (max 9) clears could fail (but at most there should
527a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * be just one failure!). This avoids doing the previous succeeded
528a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * clears again (we still clear tiles twice if a clear command succeeded
529a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    * partially for one buffer).
530a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger    */
531a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
532a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      unsigned flagszs = flags & PIPE_CLEAR_DEPTHSTENCIL;
533a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs)) {
534a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         lp_setup_flush(setup, NULL, __FUNCTION__);
535a9063cad0f0190ff88cd20fbad5aa87bf1a943f6Brian Paul
536a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs))
537a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            assert(0);
538a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
539a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
5403bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell
541a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   if (flags & PIPE_CLEAR_COLOR) {
542a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      assert(PIPE_CLEAR_COLOR0 == (1 << 2));
543a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      for (i = 0; i < setup->fb.nr_cbufs; i++) {
544a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         if ((flags & (1 << (2 + i))) && setup->fb.cbufs[i]) {
545a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            if (!lp_setup_try_clear_color_buffer(setup, color, i)) {
546a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               lp_setup_flush(setup, NULL, __FUNCTION__);
547a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger
548a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger               if (!lp_setup_try_clear_color_buffer(setup, color, i))
549a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                  assert(0);
550a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger            }
551a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger         }
552a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger      }
553a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger   }
554a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger}
555946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
556946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
557946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
558415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid
5593160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_triangle_state( struct lp_setup_context *setup,
560e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell                             unsigned cull_mode,
561fdfe06ad804ea13e6e436d66c1bcafe0bde2f545Brian Paul                             boolean ccw_is_frontface,
562a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca                             boolean scissor,
5632737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca                             boolean half_pixel_center,
5642737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca                             boolean bottom_edge_rule)
565415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{
566a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
567946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
568415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->ccw_is_frontface = ccw_is_frontface;
569415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->cullmode = cull_mode;
570415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->triangle = first_triangle;
5712737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   setup->pixel_offset = half_pixel_center ? 0.5f : 0.0f;
5722737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca   setup->bottom_edge_rule = bottom_edge_rule;
57329bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell
57429bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   if (setup->scissor_test != scissor) {
57529bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell      setup->dirty |= LP_SETUP_NEW_SCISSOR;
57629bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell      setup->scissor_test = scissor;
57729bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   }
578946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
579946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
5805286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tayvoid
5815286dd701640976ffc328e8e85fb3830746851a1Hui Qi Taylp_setup_set_line_state( struct lp_setup_context *setup,
5825286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay			 float line_width)
5835286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay{
5845286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
585946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
5865286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay   setup->line_width = line_width;
5875286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay}
588946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
58957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tayvoid
59057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taylp_setup_set_point_state( struct lp_setup_context *setup,
591a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger                          float point_size,
59229ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay                          boolean point_size_per_vertex,
593c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul                          uint sprite_coord_enable,
594c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul                          uint sprite_coord_origin)
59557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{
59657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
59757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
59857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay   setup->point_size = point_size;
599c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul   setup->sprite_coord_enable = sprite_coord_enable;
600c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul   setup->sprite_coord_origin = sprite_coord_origin;
60129ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay   setup->point_size_per_vertex = point_size_per_vertex;
60257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay}
60357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay
604931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
6055b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwelllp_setup_set_setup_variant( struct lp_setup_context *setup,
6065b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell			    const struct lp_setup_variant *variant)
607946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
6085b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
6095b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
6105b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell   setup->setup.variant = variant;
611931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
612946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
6130718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid
61418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecalp_setup_set_fs_variant( struct lp_setup_context *setup,
61518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca                         struct lp_fragment_shader_variant *variant)
616946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
617d9096926f84b33e122e3b2942ff66dc183894b50Brian Paul   LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__,
61818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca          variant);
619d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   /* FIXME: reference count */
620946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
62118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca   setup->fs.current.variant = variant;
6220e042bed49c51fef38b02b7cc05efa504f2f703dBrian Paul   setup->dirty |= LP_SETUP_NEW_FS;
623946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
624946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
625d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
6263160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_constants(struct lp_setup_context *setup,
6271d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                          unsigned num,
6283427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul                          struct pipe_constant_buffer *buffers)
629946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
6301d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   unsigned i;
6311d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca
6321d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) buffers);
633402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
6341d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   assert(num <= Elements(setup->constants));
635931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
6361d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   for (i = 0; i < num; ++i) {
6373427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul      util_copy_constant_buffer(&setup->constants[i].current, &buffers[i]);
6383427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul   }
6393427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul   for (; i < Elements(setup->constants); i++) {
6403427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul      util_copy_constant_buffer(&setup->constants[i].current, NULL);
6411d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   }
6423427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul   setup->dirty |= LP_SETUP_NEW_CONSTANTS;
643946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
644946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
645946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
646d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
6473160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_alpha_ref_value( struct lp_setup_context *setup,
648d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                              float alpha_ref_value )
649946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
650a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s %f\n", __FUNCTION__, alpha_ref_value);
651946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
65285999695829823e459e11822b4846ed1db5c055dJosé Fonseca   if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) {
65385999695829823e459e11822b4846ed1db5c055dJosé Fonseca      setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value;
6542e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca      setup->dirty |= LP_SETUP_NEW_FS;
655d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
656d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
657946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
658d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
659eee51147979208feffdf37c588ebbce4df6b40d6Brian Paullp_setup_set_stencil_ref_values( struct lp_setup_context *setup,
660eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul                                 const ubyte refs[2] )
661eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul{
662eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul   LP_DBG(DEBUG_SETUP, "%s %d %d\n", __FUNCTION__, refs[0], refs[1]);
663eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul
664521c61ff017ab15b829abbe9a98b179136a36009Brian Paul   if (setup->fs.current.jit_context.stencil_ref_front != refs[0] ||
665521c61ff017ab15b829abbe9a98b179136a36009Brian Paul       setup->fs.current.jit_context.stencil_ref_back != refs[1]) {
666521c61ff017ab15b829abbe9a98b179136a36009Brian Paul      setup->fs.current.jit_context.stencil_ref_front = refs[0];
667521c61ff017ab15b829abbe9a98b179136a36009Brian Paul      setup->fs.current.jit_context.stencil_ref_back = refs[1];
668eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul      setup->dirty |= LP_SETUP_NEW_FS;
669eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul   }
670eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul}
671eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul
672eee51147979208feffdf37c588ebbce4df6b40d6Brian Paulvoid
6733160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_blend_color( struct lp_setup_context *setup,
674d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                          const struct pipe_blend_color *blend_color )
675d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
676a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
677946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
678f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   assert(blend_color);
679946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
680f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) {
681f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color);
682f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      setup->dirty |= LP_SETUP_NEW_BLEND_COLOR;
683d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
684d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
685946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
686946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
6874461442849bfdb817334b38567136f7f9dabdf59Brian Paulvoid
68897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusinlp_setup_set_scissors( struct lp_setup_context *setup,
68997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin                       const struct pipe_scissor_state *scissors )
6904461442849bfdb817334b38567136f7f9dabdf59Brian Paul{
69197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   unsigned i;
6924461442849bfdb817334b38567136f7f9dabdf59Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
693946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
69497b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   assert(scissors);
695946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
69697b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   for (i = 0; i < PIPE_MAX_VIEWPORTS; ++i) {
69797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].x0 = scissors[i].minx;
69897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].x1 = scissors[i].maxx-1;
69997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].y0 = scissors[i].miny;
70097b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->scissors[i].y1 = scissors[i].maxy-1;
70197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin   }
70229bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   setup->dirty |= LP_SETUP_NEW_SCISSOR;
703946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
704946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
705946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
7065ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid
7073160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_flatshade_first( struct lp_setup_context *setup,
7085ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell                              boolean flatshade_first )
709946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
7105ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   setup->flatshade_first = flatshade_first;
71117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca}
71217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
71377b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlievoid
71477b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlielp_setup_set_rasterizer_discard( struct lp_setup_context *setup,
71577b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie                                 boolean rasterizer_discard )
71677b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie{
7175b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie   if (setup->rasterizer_discard != rasterizer_discard) {
7185b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie      setup->rasterizer_discard = rasterizer_discard;
7195b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie      set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ );
7205b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie   }
72177b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie}
72217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca
7235ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid
7243160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_vertex_info( struct lp_setup_context *setup,
7255ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell                          struct vertex_info *vertex_info )
72617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{
7275ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   /* XXX: just silently holding onto the pointer:
7285ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell    */
7295ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   setup->vertex_info = vertex_info;
730946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
731946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
732946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
733946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
7340319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * Called during state validation when LP_NEW_VIEWPORT is set.
7350319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure */
7360319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClurevoid
7370319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClurelp_setup_set_viewports(struct lp_setup_context *setup,
7380319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure                       unsigned num_viewports,
7390319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure                       const struct pipe_viewport_state *viewports)
7400319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure{
741e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure   struct llvmpipe_context *lp = llvmpipe_context(setup->pipe);
7420319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   unsigned i;
7430319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7440319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
7450319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7460319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   assert(num_viewports <= PIPE_MAX_VIEWPORTS);
7470319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   assert(viewports);
7480319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7490319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   /*
7500319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure    * For use in lp_state_fs.c, propagate the viewport values for all viewports.
7510319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure    */
7520319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   for (i = 0; i < num_viewports; i++) {
7530319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      float min_depth;
7540319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      float max_depth;
7550319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
756e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure      if (lp->rasterizer->clip_halfz == 0) {
757e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure         float half_depth = viewports[i].scale[2];
758e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure         min_depth = viewports[i].translate[2] - half_depth;
759e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure         max_depth = min_depth + half_depth * 2.0f;
760e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure      } else {
761e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure         min_depth = viewports[i].translate[2];
762e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure         max_depth = min_depth + viewports[i].scale[2];
763e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure      }
7640319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7650319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      if (setup->viewports[i].min_depth != min_depth ||
7660319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->viewports[i].max_depth != max_depth) {
7670319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->viewports[i].min_depth = min_depth;
7680319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->viewports[i].max_depth = max_depth;
7690319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure          setup->dirty |= LP_SETUP_NEW_VIEWPORTS;
7700319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      }
7710319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   }
7720319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure}
7730319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7740319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
7750319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure/**
7761fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol * Called during state validation when LP_NEW_SAMPLER_VIEW is set.
777946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
778d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
77947bfbd452c93e6a8db013fb90d9f42210cf24889Keith Whitwelllp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
7801fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol                                    unsigned num,
7811fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol                                    struct pipe_sampler_view **views)
782946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
78317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   unsigned i;
784d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
785a08d6302168341001003da32d42cfcff2311fa04Brian Paul   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
786402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
787c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger   assert(num <= PIPE_MAX_SHADER_SAMPLER_VIEWS);
788d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
789c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger   for (i = 0; i < PIPE_MAX_SHADER_SAMPLER_VIEWS; i++) {
7901fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol      struct pipe_sampler_view *view = i < num ? views[i] : NULL;
791d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
792fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      if (view) {
79320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger         struct pipe_resource *res = view->texture;
79420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger         struct llvmpipe_resource *lp_tex = llvmpipe_resource(res);
79585999695829823e459e11822b4846ed1db5c055dJosé Fonseca         struct lp_jit_texture *jit_tex;
79685999695829823e459e11822b4846ed1db5c055dJosé Fonseca         jit_tex = &setup->fs.current.jit_context.textures[i];
7976d50148742512606f2abd76a2dcef6c87a5c7471Roland Scheidegger
7982ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul         /* We're referencing the texture's internal data, so save a
7992ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          * reference to it.
8002ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          */
80120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger         pipe_resource_reference(&setup->fs.current_tex[i], res);
8022ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
803f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul         if (!lp_tex->dt) {
80426097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            /* regular texture - setup array of mipmap level offsets */
805f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul            int j;
80620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            unsigned first_level = 0;
80720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            unsigned last_level = 0;
80820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
80920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            if (llvmpipe_resource_is_texture(res)) {
81020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               first_level = view->u.tex.first_level;
81120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               last_level = view->u.tex.last_level;
81220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               assert(first_level <= last_level);
81320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               assert(last_level <= res->last_level);
8147e1521f191afe30fcf02a25b68fbf89278f014d3Roland Scheidegger               jit_tex->base = lp_tex->tex_data;
81520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            }
81620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            else {
817aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger              jit_tex->base = lp_tex->data;
81820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            }
81920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
820aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger            if (LP_PERF & PERF_TEX_MEM) {
821aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger               /* use dummy tile memory */
82226097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->base = lp_dummy_tile;
82326097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->width = TILE_SIZE/8;
82426097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->height = TILE_SIZE/8;
82526097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->depth = 1;
82626097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->first_level = 0;
82726097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger               jit_tex->last_level = 0;
828b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul               jit_tex->mip_offsets[0] = 0;
829b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul               jit_tex->row_stride[0] = 0;
830b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul               jit_tex->img_stride[0] = 0;
83126097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            }
83226097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            else {
83320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->width = res->width0;
83420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->height = res->height0;
83520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->depth = res->depth0;
83620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->first_level = first_level;
83720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               jit_tex->last_level = last_level;
83820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
83920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               if (llvmpipe_resource_is_texture(res)) {
84020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  for (j = first_level; j <= last_level; j++) {
841aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger                     jit_tex->mip_offsets[j] = lp_tex->mip_offsets[j];
84220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     jit_tex->row_stride[j] = lp_tex->row_stride[j];
84320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     jit_tex->img_stride[j] = lp_tex->img_stride[j];
84420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  }
84520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
84620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  if (res->target == PIPE_TEXTURE_1D_ARRAY ||
847ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger                      res->target == PIPE_TEXTURE_2D_ARRAY ||
848ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger                      res->target == PIPE_TEXTURE_CUBE_ARRAY) {
84987978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                     /*
85087978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * For array textures, we don't have first_layer, instead
85187978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * adjust last_layer (stored as depth) plus the mip level offsets
85287978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * (as we have mip-first layout can't just adjust base ptr).
85387978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      * XXX For mip levels, could do something similar.
85487978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                      */
85520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     jit_tex->depth = view->u.tex.last_layer - view->u.tex.first_layer + 1;
85687978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                     for (j = first_level; j <= last_level; j++) {
85787978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                        jit_tex->mip_offsets[j] += view->u.tex.first_layer *
85887978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                                                   lp_tex->img_stride[j];
85987978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                     }
860ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger                     if (res->target == PIPE_TEXTURE_CUBE_ARRAY) {
861ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger                        assert(jit_tex->depth % 6 == 0);
862ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger                     }
86320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     assert(view->u.tex.first_layer <= view->u.tex.last_layer);
86420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                     assert(view->u.tex.last_layer < res->array_size);
86520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  }
86620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               }
86720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger               else {
86887978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                  /*
86987978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                   * For buffers, we don't have first_element, instead adjust
87087978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                   * last_element (stored as width) plus the base pointer.
87187978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger                   */
87220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  unsigned view_blocksize = util_format_get_blocksize(view->format);
87320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  /* probably don't really need to fill that out */
87420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->mip_offsets[0] = 0;
87520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->row_stride[0] = 0;
87620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->row_stride[0] = 0;
87720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger
87820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  /* everything specified in number of elements here. */
87920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->width = view->u.buf.last_element - view->u.buf.first_element + 1;
88020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  jit_tex->base = (uint8_t *)jit_tex->base + view->u.buf.first_element *
88120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                                  view_blocksize;
88220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  /* XXX Unsure if we need to sanitize parameters? */
88320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  assert(view->u.buf.first_element <= view->u.buf.last_element);
88420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger                  assert(view->u.buf.last_element * view_blocksize < res->width0);
8852b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul               }
886f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul            }
887b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca         }
888b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca         else {
889f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul            /* display target texture/surface */
890b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca            /*
891b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca             * XXX: Where should this be unmapped?
892b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca             */
89320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            struct llvmpipe_screen *screen = llvmpipe_screen(res->screen);
89494ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell            struct sw_winsys *winsys = screen->winsys;
89526097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            jit_tex->base = winsys->displaytarget_map(winsys, lp_tex->dt,
89626097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger                                                         PIPE_TRANSFER_READ);
897f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul            jit_tex->row_stride[0] = lp_tex->row_stride[0];
898f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul            jit_tex->img_stride[0] = lp_tex->img_stride[0];
89926097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            jit_tex->mip_offsets[0] = 0;
90020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->width = res->width0;
90120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->height = res->height0;
90220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->depth = res->depth0;
90320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger            jit_tex->first_level = jit_tex->last_level = 0;
90426097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger            assert(jit_tex->base);
905b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca         }
906d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      }
90717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca   }
908d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
9092e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca   setup->dirty |= LP_SETUP_NEW_FS;
910946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
911946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
912946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
913946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
914fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca * Called during state validation when LP_NEW_SAMPLER is set.
915fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca */
916fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonsecavoid
917fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonsecalp_setup_set_fragment_sampler_state(struct lp_setup_context *setup,
918fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca                                    unsigned num,
919b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul                                    struct pipe_sampler_state **samplers)
920fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca{
921fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   unsigned i;
922fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
923fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
924fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
925fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   assert(num <= PIPE_MAX_SAMPLERS);
926fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
927fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
928fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      const struct pipe_sampler_state *sampler = i < num ? samplers[i] : NULL;
929fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
930fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      if (sampler) {
931c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         struct lp_jit_sampler *jit_sam;
932c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam = &setup->fs.current.jit_context.samplers[i];
933fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
934c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam->min_lod = sampler->min_lod;
935c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam->max_lod = sampler->max_lod;
936c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         jit_sam->lod_bias = sampler->lod_bias;
937c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger         COPY_4V(jit_sam->border_color, sampler->border_color.f);
938fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca      }
939fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   }
940fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
941fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca   setup->dirty |= LP_SETUP_NEW_FS;
942fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca}
943fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
944fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca
945fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca/**
946d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Is the given texture referenced by any scene?
947d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Note: we have to check all scenes including any scenes currently
948d59fe448967addb3025d7df90888ff950e03a343Brian Paul * being rendered and the current scene being built.
949946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
950cd9d9e2436a0815f6ed3a61d2cdf8fad53278506Brian Paulunsigned
951287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwelllp_setup_is_resource_referenced( const struct lp_setup_context *setup,
952287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                                const struct pipe_resource *texture )
953946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
954d59fe448967addb3025d7df90888ff950e03a343Brian Paul   unsigned i;
955946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
95612872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul   /* check the render targets */
95712872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul   for (i = 0; i < setup->fb.nr_cbufs; i++) {
958d6fa71fbb0d365cefdabfea9de62cfece71f7486Brian Paul      if (setup->fb.cbufs[i] && setup->fb.cbufs[i]->texture == texture)
95925485f4b69447514ab8b595aced90c75606a99bdMarek Olšák         return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE;
96012872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul   }
961018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul   if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) {
96225485f4b69447514ab8b595aced90c75606a99bdMarek Olšák      return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE;
963946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
964946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
965018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul   /* check textures referenced by the scene */
966018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul   for (i = 0; i < Elements(setup->scenes); i++) {
967287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      if (lp_scene_is_resource_referenced(setup->scenes[i], texture)) {
96825485f4b69447514ab8b595aced90c75606a99bdMarek Olšák         return LP_REFERENCED_FOR_READ;
969018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul      }
970946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
971946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
97225485f4b69447514ab8b595aced90c75606a99bdMarek Olšák   return LP_UNREFERENCED;
973946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
974946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
975946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
976946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
977a27b12171d84c6e731af08f48a657c377f8549baBrian Paul * Called by vbuf code when we're about to draw something.
9780319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure *
9790319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * This function stores all dirty state in the current scene's display list
9800319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * memory, via lp_scene_alloc().  We can not pass pointers of mutable state to
9810319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * the JIT functions, as the JIT functions will be called later on, most likely
9820319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * on a different thread.
9830319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure *
9840319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * When processing dirty state it is imperative that we don't refer to any
9850319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * pointers previously allocated with lp_scene_alloc() in this function (or any
9860319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * function) as they may belong to a scene freed since then.
987946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
9886419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean
9896419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelltry_update_scene_state( struct lp_setup_context *setup )
990946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
9919f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   boolean new_scene = (setup->fs.stored == NULL);
9929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   struct lp_scene *scene = setup->scene;
9931d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   unsigned i;
994bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul
9959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   assert(scene);
996946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
9970319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   if (setup->dirty & LP_SETUP_NEW_VIEWPORTS) {
9980319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      /*
9990319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       * Record new depth range state for changes due to viewport updates.
10000319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       *
10010319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       * TODO: Collapse the existing viewport and depth range information
10020319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       *       into one structure, for access by JIT.
10030319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure       */
10040319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      struct lp_jit_viewport *stored;
10050319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10060319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      stored = (struct lp_jit_viewport *)
10070319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure         lp_scene_alloc(scene, sizeof setup->viewports);
10080319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10090319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      if (!stored) {
10100319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure         assert(!new_scene);
10110319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure         return FALSE;
10120319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      }
10130319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10140319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      memcpy(stored, setup->viewports, sizeof setup->viewports);
10150319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
10160319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      setup->fs.current.jit_context.viewports = stored;
10170319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure      setup->dirty |= LP_SETUP_NEW_FS;
10180319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure   }
10190319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure
1020f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca   if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) {
1021f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      uint8_t *stored;
1022fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      float* fstored;
1023f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      unsigned i, j;
1024fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      unsigned size;
1025fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
1026fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      /* Alloc u8_blend_color (16 x i8) and f_blend_color (4 or 8 x f32) */
1027fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      size  = 4 * 16 * sizeof(uint8_t);
1028fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      size += (LP_MAX_VECTOR_LENGTH / 4) * sizeof(float);
10292f65f61beac3a45fdf27bf25d7b13cd1fa2bbb8cRoland Scheidegger      stored = lp_scene_alloc_aligned(scene, size, LP_MIN_VECTOR_ALIGN);
103080eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell
10319f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      if (!stored) {
10329f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         assert(!new_scene);
10336419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         return FALSE;
10349f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      }
10356419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1036fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      /* Store floating point colour */
1037fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      fstored = (float*)(stored + 4*16);
1038fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      for (i = 0; i < (LP_MAX_VECTOR_LENGTH / 4); ++i) {
1039fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton         fstored[i] = setup->blend_color.current.color[i % 4];
1040fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      }
1041fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton
10426419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      /* smear each blend color component across 16 ubyte elements */
10436419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      for (i = 0; i < 4; ++i) {
10446419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]);
10456419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         for (j = 0; j < 16; ++j)
10466419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            stored[i*16 + j] = c;
1047477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul      }
1048f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca
10496419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      setup->blend_color.stored = stored;
1050fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      setup->fs.current.jit_context.u8_blend_color = stored;
1051fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton      setup->fs.current.jit_context.f_blend_color = fstored;
1052f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca      setup->dirty |= LP_SETUP_NEW_FS;
1053946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
1054946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10551d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   if (setup->dirty & LP_SETUP_NEW_CONSTANTS) {
10561d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      for (i = 0; i < Elements(setup->constants); ++i) {
10573427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         struct pipe_resource *buffer = setup->constants[i].current.buffer;
10583427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         const unsigned current_size = setup->constants[i].current.buffer_size;
10593427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         const ubyte *current_data = NULL;
106093b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin         int num_constants;
1061946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10621d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         if (buffer) {
10633427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            /* resource buffer */
10643427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            current_data = (ubyte *) llvmpipe_resource_data(buffer);
10653427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         }
10663427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         else if (setup->constants[i].current.user_buffer) {
10673427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            /* user-space buffer */
10683427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            current_data = (ubyte *) setup->constants[i].current.user_buffer;
10693427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         }
10703427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul
10713427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul         if (current_data) {
10723427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul            current_data += setup->constants[i].current.buffer_offset;
1073946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10741d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            /* TODO: copy only the actually used constants? */
1075946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10761d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            if (setup->constants[i].stored_size != current_size ||
10771d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               !setup->constants[i].stored_data ||
10781d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               memcmp(setup->constants[i].stored_data,
10791d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_data,
10801d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_size) != 0) {
10811d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               void *stored;
1082946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
10831d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               stored = lp_scene_alloc(scene, current_size);
10841d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               if (!stored) {
10851d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                  assert(!new_scene);
10861d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                  return FALSE;
10871d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               }
10886419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
10891d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               memcpy(stored,
10901d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_data,
10911d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca                      current_size);
10921d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               setup->constants[i].stored_size = current_size;
10931d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca               setup->constants[i].stored_data = stored;
10941d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            }
10951d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         }
10961d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         else {
10971d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            setup->constants[i].stored_size = 0;
10981d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca            setup->constants[i].stored_data = NULL;
1099946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca         }
1100946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
110193b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin         setup->fs.current.jit_context.constants[i] =
110293b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin            setup->constants[i].stored_data;
110393b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin         num_constants =
110493b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin            setup->constants[i].stored_size / (sizeof(float) * 4);
110593b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin         setup->fs.current.jit_context.num_constants[i] = num_constants;
11061d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca         setup->dirty |= LP_SETUP_NEW_FS;
11071d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca      }
11082e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca   }
11092e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca
11102e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca
11116419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   if (setup->dirty & LP_SETUP_NEW_FS) {
11126419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      if (!setup->fs.stored ||
11136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell          memcmp(setup->fs.stored,
11146419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                 &setup->fs.current,
11156419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                 sizeof setup->fs.current) != 0)
11166419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      {
11176419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         struct lp_rast_state *stored;
11186419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1119663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell         /* The fs state that's been stored in the scene is different from
1120e2f46344560f8f1193b311ad41883011e67eea00Brian Paul          * the new, current state.  So allocate a new lp_rast_state object
1121e2f46344560f8f1193b311ad41883011e67eea00Brian Paul          * and append it to the bin's setup data buffer.
1122e2f46344560f8f1193b311ad41883011e67eea00Brian Paul          */
11236419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         stored = (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored);
11249f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         if (!stored) {
11259f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell            assert(!new_scene);
11266419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            return FALSE;
11279f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         }
11282ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
11296419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         memcpy(stored,
11306419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                &setup->fs.current,
11316419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                sizeof setup->fs.current);
11326419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         setup->fs.stored = stored;
11336419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
11342ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul         /* The scene now references the textures in the rasterization
11352ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          * state record.  Note that now.
11362ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul          */
11372ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul         for (i = 0; i < Elements(setup->fs.current_tex); i++) {
11386419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            if (setup->fs.current_tex[i]) {
11396419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell               if (!lp_scene_add_resource_reference(scene,
11409f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                                    setup->fs.current_tex[i],
11419f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                                    new_scene)) {
11429f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                  assert(!new_scene);
11436419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                  return FALSE;
11449f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell               }
11456419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            }
1146d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell         }
1147d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell      }
1148d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell   }
1149d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell
115029bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   if (setup->dirty & LP_SETUP_NEW_SCISSOR) {
115197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      unsigned i;
115297b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      for (i = 0; i < PIPE_MAX_VIEWPORTS; ++i) {
115397b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin         setup->draw_regions[i] = setup->framebuffer;
115497b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin         if (setup->scissor_test) {
115597b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin            u_rect_possible_intersection(&setup->scissors[i],
115697b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin                                         &setup->draw_regions[i]);
115797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin         }
115829bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell      }
115929bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell   }
1160bfcf1ba1c4879102eb05460528b02a23d81eac99Roland Scheidegger
11612e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca   setup->dirty = 0;
11622e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca
116385999695829823e459e11822b4846ed1db5c055dJosé Fonseca   assert(setup->fs.stored);
11646419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   return TRUE;
11656419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}
11666419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1167ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellboolean
11689f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_setup_update_state( struct lp_setup_context *setup,
11699f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                       boolean update_scene )
11706419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{
11716419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   /* Some of the 'draw' pipeline stages may have changed some driver state.
11726419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * Make sure we've processed those state changes before anything else.
11736419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    *
11746419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * XXX this is the only place where llvmpipe_context is used in the
11756419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * setup code.  This may get refactored/changed...
11766419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    */
11776419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   {
11786419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      struct llvmpipe_context *lp = llvmpipe_context(setup->pipe);
11796419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      if (lp->dirty) {
11806419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         llvmpipe_update_derived(lp);
11816419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      }
11826419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
1183efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      if (lp->setup->dirty) {
1184efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         llvmpipe_update_setup(lp);
1185efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      }
1186efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
1187efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      assert(setup->setup.variant);
1188efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul
11896419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      /* Will probably need to move this somewhere else, just need
11906419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell       * to know about vertex shader point size attribute.
11916419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell       */
11926419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      setup->psize = lp->psize_slot;
119397b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin      setup->viewport_index_slot = lp->viewport_index_slot;
1194d8146f240e628e70d4c07f7e805a179f70c36e23Roland Scheidegger      setup->layer_slot = lp->layer_slot;
1195d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin      setup->face_slot = lp->face_slot;
11966419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
11976419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      assert(lp->dirty == 0);
11985b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
11995b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      assert(lp->setup_variant.key.size ==
12005b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell	     setup->setup.variant->key.size);
12015b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell
12025b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell      assert(memcmp(&lp->setup_variant.key,
12035b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell		    &setup->setup.variant->key,
12045b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell		    setup->setup.variant->key.size) == 0);
12056419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   }
12066419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
120768a4f6324712d7eae327ee438a41c432ec72f11dKeith Whitwell   if (update_scene && setup->state != SETUP_ACTIVE) {
1208ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!set_scene_state( setup, SETUP_ACTIVE, __FUNCTION__ ))
1209ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1210ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   }
12119f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
12129f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   /* Only call into update_scene_state() if we already have a
12136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    * scene:
12146419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    */
12159f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   if (update_scene && setup->scene) {
12169f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      assert(setup->state == SETUP_ACTIVE);
1217ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1218ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (try_update_scene_state(setup))
1219ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return TRUE;
1220ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1221ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      /* Update failed, try to restart the scene.
1222ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       *
1223ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       * Cannot call lp_setup_flush_and_restart() directly here
1224ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       * because of potential recursion.
1225ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell       */
1226ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__))
1227ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1228ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1229ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!set_scene_state(setup, SETUP_ACTIVE, __FUNCTION__))
1230ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1231ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1232ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      if (!setup->scene)
1233ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         return FALSE;
1234ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1235ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return try_update_scene_state(setup);
12366419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   }
1237ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1238ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
1239946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1240946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1241608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca
1242946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1243b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell/* Only caller is lp_setup_vbuf_destroy()
1244b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell */
1245253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid
12463160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_destroy( struct lp_setup_context *setup )
1247946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
12482ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul   uint i;
12492ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
12509f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   lp_setup_reset( setup );
1251946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
12525f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul   util_unreference_framebuffer_state(&setup->fb);
12535f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul
12542ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul   for (i = 0; i < Elements(setup->fs.current_tex); i++) {
1255287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&setup->fs.current_tex[i], NULL);
12562ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul   }
12572ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul
12581d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   for (i = 0; i < Elements(setup->constants); i++) {
12593427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul      pipe_resource_reference(&setup->constants[i].current.buffer, NULL);
12601d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca   }
1261946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1262663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   /* free the scenes in the 'empty' queue */
12639f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell   for (i = 0; i < Elements(setup->scenes); i++) {
12649f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      struct lp_scene *scene = setup->scenes[i];
12659f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
12669f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      if (scene->fence)
12679f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell         lp_fence_wait(scene->fence);
12689f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
1269663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell      lp_scene_destroy(scene);
1270946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
1271946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1272cdd4f04f80de91d6d4e5b904ec66386d6546f977José Fonseca   lp_fence_reference(&setup->last_fence, NULL);
1273cdd4f04f80de91d6d4e5b904ec66386d6546f977José Fonseca
127489498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell   FREE( setup );
1275946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1276946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1277946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1278946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
12795ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * Create a new primitive tiling engine.  Plug it into the backend of
12805ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * the draw module.  Currently also creates a rasterizer to use with
12815ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * it.
1282946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
12833160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastruct lp_setup_context *
12845fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwelllp_setup_create( struct pipe_context *pipe,
12855ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell                 struct draw_context *draw )
1286946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
128739be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca   struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen);
1288c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   struct lp_setup_context *setup;
128939be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca   unsigned i;
1290946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1291c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   setup = CALLOC_STRUCT(lp_setup_context);
1292c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   if (!setup) {
1293c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      goto no_setup;
1294c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   }
1295a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell
12965ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   lp_setup_init_vbuf(setup);
12976419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
12986419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   /* Used only in update_state():
12996419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell    */
13006419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   setup->pipe = pipe;
13015ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
1302946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
130339be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca   setup->num_threads = screen->num_threads;
13045ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   setup->vbuf = draw_vbuf_stage(draw, &setup->base);
1305c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   if (!setup->vbuf) {
1306c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      goto no_vbuf;
1307c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   }
13085ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
13095ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   draw_set_rasterize_stage(draw, setup->vbuf);
13105ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell   draw_set_render(draw, &setup->base);
13115ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
1312663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   /* create some empty scenes */
1313663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell   for (i = 0; i < MAX_SCENES; i++) {
13149f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell      setup->scenes[i] = lp_scene_create( pipe );
1315c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      if (!setup->scenes[i]) {
1316c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca         goto no_scenes;
1317c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      }
131880eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell   }
1319946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
1320163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->triangle = first_triangle;
1321163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->line     = first_line;
1322163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->point    = first_point;
1323163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell
1324301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca   setup->dirty = ~0;
132508811032c2dd8f38d2ef65d7fd8794112e029b63Keith Whitwell
1326946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   return setup;
1327931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1328c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_scenes:
1329c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   for (i = 0; i < MAX_SCENES; i++) {
1330c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      if (setup->scenes[i]) {
1331c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca         lp_scene_destroy(setup->scenes[i]);
1332c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca      }
1333c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   }
13345ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell
1335c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca   setup->vbuf->destroy(setup->vbuf);
1336c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_vbuf:
1337931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   FREE(setup);
1338c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_setup:
1339931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   return NULL;
1340946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
1341946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
134286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
134386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/**
134486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put a BeginQuery command into all bins.
134586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */
134686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid
134786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_begin_query(struct lp_setup_context *setup,
134886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li                     struct llvmpipe_query *pq)
134986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{
135042dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul
135142dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul   set_scene_state(setup, SETUP_ACTIVE, "begin_query");
1352dc5dc4fd943e1da5207e0489c355e9a7ba1dff87Roland Scheidegger
135308203428800554215657f1ebf19d74328103800eRoland Scheidegger   if (!(pq->type == PIPE_QUERY_OCCLUSION_COUNTER ||
135408203428800554215657f1ebf19d74328103800eRoland Scheidegger         pq->type == PIPE_QUERY_OCCLUSION_PREDICATE ||
135508203428800554215657f1ebf19d74328103800eRoland Scheidegger         pq->type == PIPE_QUERY_PIPELINE_STATISTICS))
135608203428800554215657f1ebf19d74328103800eRoland Scheidegger      return;
135716f0d70ffe6d42d22b9e6b927b297e75a199aa78James Benton
135808203428800554215657f1ebf19d74328103800eRoland Scheidegger   /* init the query to its beginning state */
13592e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   assert(setup->active_binned_queries < LP_MAX_ACTIVE_BINNED_QUERIES);
13602e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   /* exceeding list size so just ignore the query */
13612e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   if (setup->active_binned_queries >= LP_MAX_ACTIVE_BINNED_QUERIES) {
13622e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      return;
13632e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   }
13642e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   assert(setup->active_queries[setup->active_binned_queries] == NULL);
13652e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   setup->active_queries[setup->active_binned_queries] = pq;
13662e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   setup->active_binned_queries++;
13678cce283038bf51a03de6734523c3e9ea8c8a6f33Brian Paul
136808203428800554215657f1ebf19d74328103800eRoland Scheidegger   assert(setup->scene);
136918452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (setup->scene) {
13706419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      if (!lp_scene_bin_everywhere(setup->scene,
13719f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                   LP_RAST_OP_BEGIN_QUERY,
13726419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                                   lp_rast_arg_query(pq))) {
13739f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
1374ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell         if (!lp_setup_flush_and_restart(setup))
1375ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell            return;
13766419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
13776419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         if (!lp_scene_bin_everywhere(setup->scene,
13789f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell                                      LP_RAST_OP_BEGIN_QUERY,
13796419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell                                      lp_rast_arg_query(pq))) {
13806419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell            return;
13816419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell         }
13826419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      }
138359b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger      setup->scene->had_queries |= TRUE;
138418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   }
138586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li}
138686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
138786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li
138886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/**
138986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put an EndQuery command into all bins.
139086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */
139186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid
139286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq)
139386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{
139442dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul   set_scene_state(setup, SETUP_ACTIVE, "end_query");
139542dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul
139608203428800554215657f1ebf19d74328103800eRoland Scheidegger   assert(setup->scene);
139718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   if (setup->scene) {
139818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      /* pq->fence should be the fence of the *last* scene which
139918452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell       * contributed to the query result.
140018452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell       */
140118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      lp_fence_reference(&pq->fence, setup->scene->fence);
140218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
140308203428800554215657f1ebf19d74328103800eRoland Scheidegger      if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER ||
140408203428800554215657f1ebf19d74328103800eRoland Scheidegger          pq->type == PIPE_QUERY_OCCLUSION_PREDICATE ||
140508203428800554215657f1ebf19d74328103800eRoland Scheidegger          pq->type == PIPE_QUERY_PIPELINE_STATISTICS ||
140608203428800554215657f1ebf19d74328103800eRoland Scheidegger          pq->type == PIPE_QUERY_TIMESTAMP) {
14077d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger         if (pq->type == PIPE_QUERY_TIMESTAMP &&
14087d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger               !(setup->scene->tiles_x | setup->scene->tiles_y)) {
14097d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger            /*
14107d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger             * If there's a zero width/height framebuffer, there's no bins and
14117d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger             * hence no rast task is ever run. So fill in something here instead.
14127d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger             */
14137d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger            pq->end[0] = os_time_get_nano();
14147d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger         }
14157d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger
141608203428800554215657f1ebf19d74328103800eRoland Scheidegger         if (!lp_scene_bin_everywhere(setup->scene,
141708203428800554215657f1ebf19d74328103800eRoland Scheidegger                                      LP_RAST_OP_END_QUERY,
141808203428800554215657f1ebf19d74328103800eRoland Scheidegger                                      lp_rast_arg_query(pq))) {
141908203428800554215657f1ebf19d74328103800eRoland Scheidegger            if (!lp_setup_flush_and_restart(setup))
142008203428800554215657f1ebf19d74328103800eRoland Scheidegger               goto fail;
142108203428800554215657f1ebf19d74328103800eRoland Scheidegger
142208203428800554215657f1ebf19d74328103800eRoland Scheidegger            if (!lp_scene_bin_everywhere(setup->scene,
142308203428800554215657f1ebf19d74328103800eRoland Scheidegger                                         LP_RAST_OP_END_QUERY,
142408203428800554215657f1ebf19d74328103800eRoland Scheidegger                                         lp_rast_arg_query(pq))) {
142508203428800554215657f1ebf19d74328103800eRoland Scheidegger               goto fail;
142608203428800554215657f1ebf19d74328103800eRoland Scheidegger            }
142708203428800554215657f1ebf19d74328103800eRoland Scheidegger         }
142859b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger         setup->scene->had_queries |= TRUE;
14296419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell      }
143018452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   }
143118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   else {
143218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell      lp_fence_reference(&pq->fence, setup->last_fence);
143318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell   }
143408203428800554215657f1ebf19d74328103800eRoland Scheidegger
143508203428800554215657f1ebf19d74328103800eRoland Scheideggerfail:
143608203428800554215657f1ebf19d74328103800eRoland Scheidegger   /* Need to do this now not earlier since it still needs to be marked as
143708203428800554215657f1ebf19d74328103800eRoland Scheidegger    * active when binning it would cause a flush.
143808203428800554215657f1ebf19d74328103800eRoland Scheidegger    */
14392e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER ||
14402e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      pq->type == PIPE_QUERY_OCCLUSION_PREDICATE ||
14412e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      pq->type == PIPE_QUERY_PIPELINE_STATISTICS) {
14422e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      unsigned i;
14432e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger
14442e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      /* remove from active binned query list */
14452e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      for (i = 0; i < setup->active_binned_queries; i++) {
14462e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger         if (setup->active_queries[i] == pq)
14472e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger            break;
14482e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      }
14492e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      assert(i < setup->active_binned_queries);
14502e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      if (i == setup->active_binned_queries)
14512e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger         return;
14522e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      setup->active_binned_queries--;
14532e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      setup->active_queries[i] = setup->active_queries[setup->active_binned_queries];
14542e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger      setup->active_queries[setup->active_binned_queries] = NULL;
14552e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger   }
145686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li}
145718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
145818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell
1459ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellboolean
14606419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_flush_and_restart(struct lp_setup_context *setup)
14616419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{
14626419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   if (0) debug_printf("%s\n", __FUNCTION__);
14636419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell
14646419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell   assert(setup->state == SETUP_ACTIVE);
1465ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1466ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__))
1467ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
1468ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1469ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   if (!lp_setup_update_state(setup, TRUE))
1470ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell      return FALSE;
1471ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell
1472ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell   return TRUE;
14736419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}
14749f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
14759f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell
1476