lp_setup.c revision 18fb9ff6d8f58a08e559070cf29f26ed0caa567f
1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/**************************************************************************
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * All Rights Reserved.
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Permission is hereby granted, free of charge, to any person obtaining a
721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * copy of this software and associated documentation files (the
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * "Software"), to deal in the Software without restriction, including
921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * without limitation the rights to use, copy, modify, merge, publish,
1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * distribute, sub license, and/or sell copies of the Software, and to
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * permit persons to whom the Software is furnished to do so, subject to
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * the following conditions:
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * The above copyright notice and this permission notice (including the
15731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick * next paragraph) shall be included in all copies or substantial portions
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * of the Software.
173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen *
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch **************************************************************************/
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen/**
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen * Tiling engine.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen * Builds per-tile display lists and executes them on calls to
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen * lp_setup_flush().
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen */
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <limits.h>
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "pipe/p_defines.h"
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "util/u_framebuffer.h"
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "util/u_inlines.h"
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "util/u_memory.h"
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "util/u_pack_color.h"
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_context.h"
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_scene.h"
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_scene_queue.h"
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_texture.h"
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_debug.h"
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_fence.h"
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_query.h"
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_rast.h"
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_setup_context.h"
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_screen.h"
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "lp_state.h"
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "state_tracker/sw_winsys.h"
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "draw/draw_context.h"
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "draw/draw_vbuf.h"
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void set_scene_state( struct lp_setup_context *, enum setup_state );
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct lp_scene *
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_get_current_scene(struct lp_setup_context *setup)
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (!setup->scene) {
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      /* wait for a free/empty scene
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       */
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->scene = lp_scene_dequeue(setup->empty_scenes, TRUE);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      assert(lp_scene_is_empty(setup->scene));
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      lp_scene_begin_binning(setup->scene,
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             &setup->fb );
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   return setup->scene;
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Check if the size of the current scene has exceeded the limit.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * If so, flush/render it.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochsetup_check_scene_size_and_flush(struct lp_setup_context *setup)
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->scene) {
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      struct lp_scene *scene = lp_setup_get_current_scene(setup);
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      unsigned size = lp_scene_get_size(scene);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (size > LP_MAX_SCENE_SIZE) {
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         /*printf("LLVMPIPE: scene size = %u, flushing.\n", size);*/
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         set_scene_state( setup, SETUP_FLUSHED );
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         /*assert(lp_scene_get_size(scene) == 0);*/
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfirst_triangle( struct lp_setup_context *setup,
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const float (*v0)[4],
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const float (*v1)[4],
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const float (*v2)[4])
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   set_scene_state( setup, SETUP_ACTIVE );
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   lp_setup_choose_triangle( setup );
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->triangle( setup, v0, v1, v2 );
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfirst_line( struct lp_setup_context *setup,
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch	    const float (*v0)[4],
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch	    const float (*v1)[4])
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   set_scene_state( setup, SETUP_ACTIVE );
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   lp_setup_choose_line( setup );
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->line( setup, v0, v1 );
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfirst_point( struct lp_setup_context *setup,
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch	     const float (*v0)[4])
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   set_scene_state( setup, SETUP_ACTIVE );
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   lp_setup_choose_point( setup );
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->point( setup, v0 );
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void reset_context( struct lp_setup_context *setup )
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* Reset derived state */
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->constants.stored_size = 0;
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->constants.stored_data = NULL;
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->fs.stored = NULL;
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->dirty = ~0;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* no current bin */
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->scene = NULL;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* Reset some state:
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    */
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->clear.flags = 0;
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* Have an explicit "start-binning" call and get rid of this
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    * pointer twiddling?
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    */
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->line = first_line;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->point = first_point;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->triangle = first_triangle;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/** Rasterize all scene's bins */
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_rasterize_scene( struct lp_setup_context *setup )
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   struct lp_scene *scene = lp_setup_get_current_scene(setup);
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   lp_scene_rasterize(scene, setup->rast);
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   reset_context( setup );
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__);
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbegin_binning( struct lp_setup_context *setup )
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   struct lp_scene *scene = lp_setup_get_current_scene(setup);
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s color: %s depth: %s\n", __FUNCTION__,
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          (setup->clear.flags & PIPE_CLEAR_COLOR) ? "clear": "load",
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) ? "clear": "load");
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->fb.nr_cbufs) {
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (setup->clear.flags & PIPE_CLEAR_COLOR) {
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         lp_scene_bin_everywhere( scene,
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch				  lp_rast_clear_color,
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch				  setup->clear.color );
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         scene->has_color_clear = TRUE;
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->fb.zsbuf) {
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) {
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         lp_scene_bin_everywhere( scene,
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch				  lp_rast_clear_zstencil,
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch				  setup->clear.zstencil );
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         scene->has_depth_clear = TRUE;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s done\n", __FUNCTION__);
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/* This basically bins and then flushes any outstanding full-screen
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * clears.
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * TODO: fast path for fullscreen clears and no triangles.
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochexecute_clears( struct lp_setup_context *setup )
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   begin_binning( setup );
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   lp_setup_rasterize_scene( setup );
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstatic void
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickset_scene_state( struct lp_setup_context *setup,
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                 enum setup_state new_state )
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick{
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   unsigned old_state = setup->state;
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (old_state == new_state)
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s old %d new %d\n", __FUNCTION__, old_state, new_state);
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   switch (new_state) {
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   case SETUP_ACTIVE:
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      begin_binning( setup );
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   case SETUP_CLEARED:
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (old_state == SETUP_ACTIVE) {
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         assert(0);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         return;
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   case SETUP_FLUSHED:
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (old_state == SETUP_CLEARED)
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         execute_clears( setup );
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      else
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         lp_setup_rasterize_scene( setup );
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   default:
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      assert(0 && "invalid setup state mode");
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->state = new_state;
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * \param flags  bitmask of PIPE_FLUSH_x flags
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_flush( struct lp_setup_context *setup,
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                unsigned flags )
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->scene) {
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      struct lp_scene *scene = lp_setup_get_current_scene(setup);
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      union lp_rast_cmd_arg dummy = {0};
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (flags & (PIPE_FLUSH_SWAPBUFFERS |
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   PIPE_FLUSH_FRAME)) {
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         /* Store colors in the linear color buffer(s).
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          * If we don't do this here, we'll end up converting the tiled
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          * data to linear in the texture_unmap() function, which will
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          * not be a parallel/threaded operation as here.
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          */
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         lp_scene_bin_everywhere(scene, lp_rast_store_color, dummy);
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   set_scene_state( setup, SETUP_FLUSHED );
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_bind_framebuffer( struct lp_setup_context *setup,
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           const struct pipe_framebuffer_state *fb )
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* Flush any old scene.
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    */
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   set_scene_state( setup, SETUP_FLUSHED );
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* Set new state.  This will be picked up later when we next need a
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    * scene.
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    */
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   util_copy_framebuffer_state(&setup->fb, fb);
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_clear( struct lp_setup_context *setup,
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const float *color,
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                double depth,
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                unsigned stencil,
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                unsigned flags )
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   struct lp_scene *scene = lp_setup_get_current_scene(setup);
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   unsigned i;
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (flags & PIPE_CLEAR_COLOR) {
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      for (i = 0; i < 4; ++i)
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         setup->clear.color.clear_color[i] = float_to_ubyte(color[i]);
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->clear.zstencil.clear_zstencil =
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         util_pack_z_stencil(setup->fb.zsbuf->format,
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             depth,
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             stencil);
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->state == SETUP_ACTIVE) {
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      /* Add the clear to existing scene.  In the unusual case where
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       * both color and depth-stencil are being cleared when there's
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       * already been some rendering, we could discard the currently
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       * binned scene and start again, but I don't see that as being
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       * a common usage.
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       */
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (flags & PIPE_CLEAR_COLOR) {
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         lp_scene_bin_everywhere( scene,
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  lp_rast_clear_color,
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  setup->clear.color );
336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         scene->has_color_clear = TRUE;
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) {
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         lp_scene_bin_everywhere( scene,
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  lp_rast_clear_zstencil,
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  setup->clear.zstencil );
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         scene->has_depth_clear = TRUE;
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   else {
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      /* Put ourselves into the 'pre-clear' state, specifically to try
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       * and accumulate multiple clears to color and depth_stencil
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       * buffers which the app or state-tracker might issue
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       * separately.
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       */
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      set_scene_state( setup, SETUP_CLEARED );
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->clear.flags |= flags;
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Emit a fence.
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct pipe_fence_handle *
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_fence( struct lp_setup_context *setup )
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->num_threads == 0) {
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return NULL;
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   else {
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      struct lp_scene *scene = lp_setup_get_current_scene(setup);
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const unsigned rank = lp_scene_get_num_bins( scene ); /* xxx */
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      struct lp_fence *fence = lp_fence_create(rank);
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      LP_DBG(DEBUG_SETUP, "%s rank %u\n", __FUNCTION__, rank);
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      set_scene_state( setup, SETUP_ACTIVE );
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      /* insert the fence into all command bins */
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      lp_scene_bin_everywhere( scene,
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               lp_rast_fence,
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               lp_rast_arg_fence(fence) );
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return (struct pipe_fence_handle *) fence;
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_triangle_state( struct lp_setup_context *setup,
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             unsigned cull_mode,
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             boolean ccw_is_frontface,
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             boolean scissor,
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             boolean gl_rasterization_rules)
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->ccw_is_frontface = ccw_is_frontface;
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->cullmode = cull_mode;
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->triangle = first_triangle;
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->scissor_test = scissor;
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->pixel_offset = gl_rasterization_rules ? 0.5f : 0.0f;
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_fs_inputs( struct lp_setup_context *setup,
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        const struct lp_shader_input *input,
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                        unsigned nr )
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s %p %u\n", __FUNCTION__, (void *) input, nr);
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   memcpy( setup->fs.input, input, nr * sizeof input[0] );
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->fs.nr_inputs = nr;
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_fs_variant( struct lp_setup_context *setup,
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         struct lp_fragment_shader_variant *variant)
420513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch{
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__,
422513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          variant);
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* FIXME: reference count */
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->fs.current.variant = variant;
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->dirty |= LP_SETUP_NEW_FS;
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_fs_constants(struct lp_setup_context *setup,
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          struct pipe_resource *buffer)
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) buffer);
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   pipe_resource_reference(&setup->constants.current, buffer);
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->dirty |= LP_SETUP_NEW_CONSTANTS;
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_alpha_ref_value( struct lp_setup_context *setup,
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              float alpha_ref_value )
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s %f\n", __FUNCTION__, alpha_ref_value);
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) {
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value;
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->dirty |= LP_SETUP_NEW_FS;
450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick   }
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_stencil_ref_values( struct lp_setup_context *setup,
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 const ubyte refs[2] )
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s %d %d\n", __FUNCTION__, refs[0], refs[1]);
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->fs.current.jit_context.stencil_ref_front != refs[0] ||
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch       setup->fs.current.jit_context.stencil_ref_back != refs[1]) {
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->fs.current.jit_context.stencil_ref_front = refs[0];
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->fs.current.jit_context.stencil_ref_back = refs[1];
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->dirty |= LP_SETUP_NEW_FS;
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_blend_color( struct lp_setup_context *setup,
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          const struct pipe_blend_color *blend_color )
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   assert(blend_color);
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) {
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color);
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->dirty |= LP_SETUP_NEW_BLEND_COLOR;
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_scissor( struct lp_setup_context *setup,
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      const struct pipe_scissor_state *scissor )
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   assert(scissor);
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (memcmp(&setup->scissor.current, scissor, sizeof(*scissor)) != 0) {
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->scissor.current = *scissor; /* struct copy */
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->dirty |= LP_SETUP_NEW_SCISSOR;
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_flatshade_first( struct lp_setup_context *setup,
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              boolean flatshade_first )
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->flatshade_first = flatshade_first;
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_vertex_info( struct lp_setup_context *setup,
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          struct vertex_info *vertex_info )
508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* XXX: just silently holding onto the pointer:
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    */
511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->vertex_info = vertex_info;
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Called during state validation when LP_NEW_SAMPLER_VIEW is set.
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    unsigned num,
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    struct pipe_sampler_view **views)
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
523ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   unsigned i;
524ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
525ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
526ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   assert(num <= PIPE_MAX_SAMPLERS);
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
530ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      struct pipe_sampler_view *view = i < num ? views[i] : NULL;
531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if(view) {
533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         struct pipe_resource *tex = view->texture;
534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         struct llvmpipe_resource *lp_tex = llvmpipe_resource(tex);
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         struct lp_jit_texture *jit_tex;
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         jit_tex = &setup->fs.current.jit_context.textures[i];
537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         jit_tex->width = tex->width0;
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         jit_tex->height = tex->height0;
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         jit_tex->depth = tex->depth0;
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         jit_tex->last_level = tex->last_level;
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         /* We're referencing the texture's internal data, so save a
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          * reference to it.
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          */
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         pipe_resource_reference(&setup->fs.current_tex[i], tex);
546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         if (!lp_tex->dt) {
548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            /* regular texture - setup array of mipmap level pointers */
549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            int j;
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            for (j = 0; j <= tex->last_level; j++) {
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               jit_tex->data[j] =
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  llvmpipe_get_texture_image_all(lp_tex, j, LP_TEX_USAGE_READ,
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                                 LP_TEX_LAYOUT_LINEAR);
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               jit_tex->row_stride[j] = lp_tex->row_stride[j];
555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               jit_tex->img_stride[j] = lp_tex->img_stride[j];
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            }
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         }
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         else {
559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            /* display target texture/surface */
560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            /*
561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch             * XXX: Where should this be unmapped?
562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch             */
563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            struct llvmpipe_screen *screen = llvmpipe_screen(tex->screen);
565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            struct sw_winsys *winsys = screen->winsys;
566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            jit_tex->data[0] = winsys->displaytarget_map(winsys, lp_tex->dt,
567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch							 PIPE_TRANSFER_READ);
568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            jit_tex->row_stride[0] = lp_tex->row_stride[0];
569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            jit_tex->img_stride[0] = lp_tex->img_stride[0];
570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            assert(jit_tex->data[0]);
571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         }
572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->dirty |= LP_SETUP_NEW_FS;
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Is the given texture referenced by any scene?
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Note: we have to check all scenes including any scenes currently
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * being rendered and the current scene being built.
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochunsigned
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_is_resource_referenced( const struct lp_setup_context *setup,
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                const struct pipe_resource *texture )
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   unsigned i;
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* check the render targets */
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   for (i = 0; i < setup->fb.nr_cbufs; i++) {
592ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      if (setup->fb.cbufs[i]->texture == texture)
593ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen         return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
594ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   }
595ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) {
596ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      return PIPE_REFERENCED_FOR_READ | PIPE_REFERENCED_FOR_WRITE;
597ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen   }
598ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* check textures referenced by the scene */
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   for (i = 0; i < Elements(setup->scenes); i++) {
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (lp_scene_is_resource_referenced(setup->scenes[i], texture)) {
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         return PIPE_REFERENCED_FOR_READ;
603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   return PIPE_UNREFERENCED;
607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Called by vbuf code when we're about to draw something.
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_update_state( struct lp_setup_context *setup )
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   struct lp_scene *scene;
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__);
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup_check_scene_size_and_flush(setup);
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   scene = lp_setup_get_current_scene(setup);
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   assert(setup->fs.current.variant);
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* Some of the 'draw' pipeline stages may have changed some driver state.
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    * Make sure we've processed those state changes before anything else.
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    *
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    * XXX this is the only place where llvmpipe_context is used in the
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    * setup code.  This may get refactored/changed...
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    */
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   {
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      struct llvmpipe_context *lp = llvmpipe_context(scene->pipe);
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (lp->dirty) {
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         llvmpipe_update_derived(lp);
636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      assert(lp->dirty == 0);
638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) {
641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      uint8_t *stored;
642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      unsigned i, j;
643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      stored = lp_scene_alloc_aligned(scene, 4 * 16, 16);
645c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (stored) {
647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         /* smear each blend color component across 16 ubyte elements */
648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         for (i = 0; i < 4; ++i) {
649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]);
650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            for (j = 0; j < 16; ++j)
651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               stored[i*16 + j] = c;
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         }
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         setup->blend_color.stored = stored;
655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         setup->fs.current.jit_context.blend_color = setup->blend_color.stored;
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->dirty |= LP_SETUP_NEW_FS;
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->dirty & LP_SETUP_NEW_SCISSOR) {
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      float *stored;
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      stored = lp_scene_alloc_aligned(scene, 4 * sizeof(int32_t), 16);
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (stored) {
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         stored[0] = (float) setup->scissor.current.minx;
669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         stored[1] = (float) setup->scissor.current.miny;
670c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         stored[2] = (float) setup->scissor.current.maxx;
671c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         stored[3] = (float) setup->scissor.current.maxy;
672c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
673c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         setup->scissor.stored = stored;
674c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         setup->fs.current.jit_context.scissor_xmin = stored[0];
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         setup->fs.current.jit_context.scissor_ymin = stored[1];
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         setup->fs.current.jit_context.scissor_xmax = stored[2];
678c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         setup->fs.current.jit_context.scissor_ymax = stored[3];
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->dirty |= LP_SETUP_NEW_FS;
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if(setup->dirty & LP_SETUP_NEW_CONSTANTS) {
685c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      struct pipe_resource *buffer = setup->constants.current;
686c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
687c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if(buffer) {
688c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         unsigned current_size = buffer->width0;
689c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         const void *current_data = llvmpipe_resource_data(buffer);
690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
691c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         /* TODO: copy only the actually used constants? */
692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         if(setup->constants.stored_size != current_size ||
694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            !setup->constants.stored_data ||
695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            memcmp(setup->constants.stored_data,
696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   current_data,
697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   current_size) != 0) {
698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            void *stored;
699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            stored = lp_scene_alloc(scene, current_size);
701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            if(stored) {
702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               memcpy(stored,
703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      current_data,
704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      current_size);
705c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               setup->constants.stored_size = current_size;
706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               setup->constants.stored_data = stored;
707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            }
708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         }
709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      else {
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         setup->constants.stored_size = 0;
712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         setup->constants.stored_data = NULL;
713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->fs.current.jit_context.constants = setup->constants.stored_data;
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->dirty |= LP_SETUP_NEW_FS;
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
719c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
720c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if(setup->dirty & LP_SETUP_NEW_FS) {
721c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if(!setup->fs.stored ||
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         memcmp(setup->fs.stored,
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                &setup->fs.current,
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                sizeof setup->fs.current) != 0) {
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         /* The fs state that's been stored in the scene is different from
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          * the new, current state.  So allocate a new lp_rast_state object
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          * and append it to the bin's setup data buffer.
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          */
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         uint i;
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         struct lp_rast_state *stored =
731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored);
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         if(stored) {
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            memcpy(stored,
734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   &setup->fs.current,
735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   sizeof setup->fs.current);
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            setup->fs.stored = stored;
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            /* put the state-set command into all bins */
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            lp_scene_bin_state_command( scene,
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch					lp_rast_set_state,
741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch					lp_rast_arg_state(setup->fs.stored) );
742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         }
743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         /* The scene now references the textures in the rasterization
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          * state record.  Note that now.
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          */
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         for (i = 0; i < Elements(setup->fs.current_tex); i++) {
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            if (setup->fs.current_tex[i])
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch               lp_scene_add_resource_reference(scene, setup->fs.current_tex[i]);
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         }
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->dirty = 0;
755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   assert(setup->fs.stored);
757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
761c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/* Only caller is lp_setup_vbuf_destroy()
762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_destroy( struct lp_setup_context *setup )
765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   uint i;
767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   reset_context( setup );
769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   util_unreference_framebuffer_state(&setup->fb);
771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   for (i = 0; i < Elements(setup->fs.current_tex); i++) {
773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      pipe_resource_reference(&setup->fs.current_tex[i], NULL);
774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   pipe_resource_reference(&setup->constants.current, NULL);
777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* free the scenes in the 'empty' queue */
779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   while (1) {
780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      struct lp_scene *scene = lp_scene_dequeue(setup->empty_scenes, FALSE);
781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (!scene)
782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch         break;
783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      lp_scene_destroy(scene);
784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   lp_scene_queue_destroy(setup->empty_scenes);
787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   lp_rast_destroy( setup->rast );
789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   FREE( setup );
791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Create a new primitive tiling engine.  Plug it into the backend of
796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * the draw module.  Currently also creates a rasterizer to use with
797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * it.
798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct lp_setup_context *
800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_create( struct pipe_context *pipe,
801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 struct draw_context *draw )
802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen);
804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   struct lp_setup_context *setup = CALLOC_STRUCT(lp_setup_context);
805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   unsigned i;
806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (!setup)
808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return NULL;
809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   lp_setup_init_vbuf(setup);
811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
812c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->empty_scenes = lp_scene_queue_create();
813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (!setup->empty_scenes)
814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      goto fail;
815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* XXX: move this to the screen and share between contexts:
817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    */
818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->num_threads = screen->num_threads;
819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->rast = lp_rast_create(screen->num_threads);
820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (!setup->rast)
821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      goto fail;
822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->vbuf = draw_vbuf_stage(draw, &setup->base);
824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (!setup->vbuf)
825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      goto fail;
826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   draw_set_rasterize_stage(draw, setup->vbuf);
828c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   draw_set_render(draw, &setup->base);
829c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
830c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* create some empty scenes */
831c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   for (i = 0; i < MAX_SCENES; i++) {
832c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      setup->scenes[i] = lp_scene_create( pipe, setup->empty_scenes );
833c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
834c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      lp_scene_enqueue(setup->empty_scenes, setup->scenes[i]);
835c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   }
836c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
837c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->triangle = first_triangle;
838c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->line     = first_line;
839c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->point    = first_point;
840c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
841c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   setup->dirty = ~0;
842c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
843c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   return setup;
844c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
845c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochfail:
846c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->rast)
847c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      lp_rast_destroy( setup->rast );
848c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
849c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->vbuf)
850c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      ;
851c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
852c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   if (setup->empty_scenes)
853c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      lp_scene_queue_destroy(setup->empty_scenes);
854c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
855c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   FREE(setup);
856c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   return NULL;
857c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
858c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
859c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
860c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
861c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Put a BeginQuery command into all bins.
862c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
863c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
864c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_begin_query(struct lp_setup_context *setup,
865c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     struct llvmpipe_query *pq)
866c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
867c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   struct lp_scene * scene = lp_setup_get_current_scene(setup);
868c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   union lp_rast_cmd_arg cmd_arg;
869c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
870c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   /* init the query to its beginning state */
871c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   pq->done = FALSE;
872c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   pq->tile_count = 0;
873c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   pq->num_tiles = scene->tiles_x * scene->tiles_y;
874c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   assert(pq->num_tiles > 0);
875c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
876c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   memset(pq->count, 0, sizeof(pq->count));  /* reset all counters */
877c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
878c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   cmd_arg.query_obj = pq;
879c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   lp_scene_bin_everywhere(scene, lp_rast_begin_query, cmd_arg);
880c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   pq->binned = TRUE;
881c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
882c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
883c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
884c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/**
885c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch * Put an EndQuery command into all bins.
886c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch */
887c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid
888c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochlp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq)
889c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch{
890c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   struct lp_scene * scene = lp_setup_get_current_scene(setup);
891c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   union lp_rast_cmd_arg cmd_arg;
892c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
893c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   cmd_arg.query_obj = pq;
894c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   lp_scene_bin_everywhere(scene, lp_rast_end_query, cmd_arg);
895c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
896c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch