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