1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/************************************************************************** 2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc. 4946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * All Rights Reserved. 5946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 6946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 7946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * copy of this software and associated documentation files (the 8946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * "Software"), to deal in the Software without restriction, including 9946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 10946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 11946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * permit persons to whom the Software is furnished to do so, subject to 12946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * the following conditions: 13946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 14946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * The above copyright notice and this permission notice (including the 15946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * next paragraph) shall be included in all copies or substantial portions 16946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * of the Software. 17946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 18946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 26946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca **************************************************************************/ 27946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 28946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 29931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Tiling engine. 30946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 31931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Builds per-tile display lists and executes them on calls to 32931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * lp_setup_flush(). 33946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 34946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li#include <limits.h> 3686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 37d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "pipe/p_defines.h" 381fc5a318a64b10567ed6990eb04b2dc3ecb2b347Brian Paul#include "util/u_framebuffer.h" 39a1af8eec66c5f7ec421e8011b41c1a7c36319f9fJosé Fonseca#include "util/u_inlines.h" 40946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h" 41253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell#include "util/u_pack_color.h" 42b0a647f284b24ca4e0ee1f70c4839d8ec3d1a4e6Roland Scheidegger#include "util/u_viewport.h" 43c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca#include "draw/draw_pipe.h" 447d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger#include "os/os_time.h" 459fae289fcd098027952c6b586292214ec586a2ecBrian Paul#include "lp_context.h" 462b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul#include "lp_memory.h" 47663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#include "lp_scene.h" 48d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_texture.h" 495ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_debug.h" 505ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_fence.h" 5186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li#include "lp_query.h" 525ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "lp_rast.h" 53d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_setup_context.h" 54b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca#include "lp_screen.h" 559fae289fcd098027952c6b586292214ec586a2ecBrian Paul#include "lp_state.h" 5623e951d0da5802fec70996e46ad6f0abc411594cKeith Whitwell#include "state_tracker/sw_winsys.h" 57946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 585ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_context.h" 595ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell#include "draw/draw_vbuf.h" 6080eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 61677a055fa0cf7b6476c716be187513c41060d417José Fonseca 62ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean set_scene_state( struct lp_setup_context *, enum setup_state, 639f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell const char *reason); 649f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic boolean try_update_scene_state( struct lp_setup_context *setup ); 65946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 66946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 679f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstatic void 689f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_setup_get_empty_scene(struct lp_setup_context *setup) 6922b07b8be4c2939b00e10f17fa91e68682808594Brian Paul{ 70db9a1052d1b2014419134c93aa4e05c9d1579378José Fonseca assert(setup->scene == NULL); 71db9a1052d1b2014419134c93aa4e05c9d1579378José Fonseca 729f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->scene_idx++; 731d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul setup->scene_idx %= ARRAY_SIZE(setup->scenes); 749f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 759f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->scene = setup->scenes[setup->scene_idx]; 769f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 779f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (setup->scene->fence) { 789f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (LP_DEBUG & DEBUG_SETUP) 799f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell debug_printf("%s: wait for scene %d\n", 809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell __FUNCTION__, setup->scene->fence->id); 819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 829f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_fence_wait(setup->scene->fence); 833bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul } 849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 852d368b982af5e6566c7da7fd2bc8b190af28188bJosé Fonseca lp_scene_begin_binning(setup->scene, &setup->fb, setup->rasterizer_discard); 862d368b982af5e6566c7da7fd2bc8b190af28188bJosé Fonseca 8722b07b8be4c2939b00e10f17fa91e68682808594Brian Paul} 88946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 89946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 904d2b0eb19e432f83845a55d552b5d1d61f040459José Fonsecastatic void 913160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_triangle( struct lp_setup_context *setup, 92253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 93253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4], 94253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v2)[4]) 954d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca{ 969f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(setup->state == SETUP_ACTIVE); 97253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_triangle( setup ); 98253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 99253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 1004d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 101253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 1023160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_line( struct lp_setup_context *setup, 103253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 104253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4]) 105253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 1069f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(setup->state == SETUP_ACTIVE); 107253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_line( setup ); 108253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line( setup, v0, v1 ); 1094d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca} 1104d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 111253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 1123160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecafirst_point( struct lp_setup_context *setup, 113253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4]) 114253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 1159f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(setup->state == SETUP_ACTIVE); 116253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_point( setup ); 117253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point( setup, v0 ); 118253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 1194d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 120efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paulvoid lp_setup_reset( struct lp_setup_context *setup ) 121931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 1221d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca unsigned i; 1231d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca 124a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 1254d2b0eb19e432f83845a55d552b5d1d61f040459José Fonseca 126301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca /* Reset derived state */ 1271d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul for (i = 0; i < ARRAY_SIZE(setup->constants); ++i) { 1281d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca setup->constants[i].stored_size = 0; 1291d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca setup->constants[i].stored_data = NULL; 1301d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca } 131301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca setup->fs.stored = NULL; 132f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty = ~0; 133946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1343bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul /* no current bin */ 135663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell setup->scene = NULL; 136946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1370718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Reset some state: 1380718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 139c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell memset(&setup->clear, 0, sizeof setup->clear); 140946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 141253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Have an explicit "start-binning" call and get rid of this 142253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * pointer twiddling? 143946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 144253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line = first_line; 145253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point = first_point; 146253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle = first_triangle; 147946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 148946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 149946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 150663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell/** Rasterize all scene's bins */ 151931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 152b73c9ba9195ac436960b90649db35bb11d23f9d0Brian Paullp_setup_rasterize_scene( struct lp_setup_context *setup ) 153946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 1549f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scene; 155edac740095fb2514b512034b334947f72648cd51Roland Scheidegger struct llvmpipe_screen *screen = llvmpipe_screen(scene->pipe->screen); 156946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1572e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger scene->num_active_queries = setup->active_binned_queries; 1582e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger memcpy(scene->active_queries, setup->active_queries, 1592e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger scene->num_active_queries * sizeof(scene->active_queries[0])); 16008203428800554215657f1ebf19d74328103800eRoland Scheidegger 1619f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_scene_end_binning(scene); 1629f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 16318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_reference(&setup->last_fence, scene->fence); 16418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 16518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (setup->last_fence) 16618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell setup->last_fence->issued = TRUE; 16718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 168edac740095fb2514b512034b334947f72648cd51Roland Scheidegger pipe_mutex_lock(screen->rast_mutex); 1696f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger 1706f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger /* FIXME: We enqueue the scene then wait on the rasterizer to finish. 1716f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger * This means we never actually run any vertex stuff in parallel to 1726f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger * rasterization (not in the same context at least) which is what the 1736f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger * multiple scenes per setup is about - when we get a new empty scene 1746f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger * any old one is already empty again because we waited here for 1756f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger * raster tasks to be finished. Ideally, we shouldn't need to wait here 1766f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger * and rely on fences elsewhere when waiting is necessary. 1776f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger * Certainly, lp_scene_end_rasterization() would need to be deferred too 1786f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger * and there's probably other bits why this doesn't actually work. 1796f2cf5f3d0764e096b6b099ef9dc7bc92047c3cbRoland Scheidegger */ 1809f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_rast_queue_scene(screen->rast, scene); 1819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_rast_finish(screen->rast); 182edac740095fb2514b512034b334947f72648cd51Roland Scheidegger pipe_mutex_unlock(screen->rast_mutex); 183946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_scene_end_rasterization(setup->scene); 1859f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_setup_reset( setup ); 186946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 187a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__); 18880eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell} 18980eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 190931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 191931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 192ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean 1933160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecabegin_binning( struct lp_setup_context *setup ) 19480eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell{ 1959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scene; 1961e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger boolean need_zsload = FALSE; 1979f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell boolean ok; 19818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 199040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell assert(scene); 200040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell assert(scene->fence == NULL); 201040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell 202040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell /* Always create a fence: 20318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell */ 204040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell scene->fence = lp_fence_create(MAX2(1, setup->num_threads)); 205ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!scene->fence) 206ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 207040e59851ae4c26ce0509d42d2ee71e007b3b3d1Keith Whitwell 2089f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell ok = try_update_scene_state(setup); 209ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!ok) 210ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 21118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 2121e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger if (setup->fb.zsbuf && 2131e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger ((setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) && 2141e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger util_format_is_depth_and_stencil(setup->fb.zsbuf->format)) 2151e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger need_zsload = TRUE; 21622b07b8be4c2939b00e10f17fa91e68682808594Brian Paul 217a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger LP_DBG(DEBUG_SETUP, "%s color clear bufs: %x depth: %s\n", __FUNCTION__, 218a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger setup->clear.flags >> 2, 2191e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger need_zsload ? "clear": "load"); 220402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 221a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (setup->clear.flags & PIPE_CLEAR_COLOR) { 222a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger unsigned cbuf; 223a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger for (cbuf = 0; cbuf < setup->fb.nr_cbufs; cbuf++) { 224a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger assert(PIPE_CLEAR_COLOR0 == 1 << 2); 225a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (setup->clear.flags & (1 << (2 + cbuf))) { 226a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger union lp_rast_cmd_arg clearrb_arg; 227a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger struct lp_rast_clear_rb *cc_scene = 228a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger (struct lp_rast_clear_rb *) 229a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger lp_scene_alloc(scene, sizeof(struct lp_rast_clear_rb)); 230a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 231a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (!cc_scene) { 232a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger return FALSE; 233a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 234a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 235a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger cc_scene->cbuf = cbuf; 236a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger cc_scene->color_val = setup->clear.color_val[cbuf]; 237a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger clearrb_arg.clear_rb = cc_scene; 238a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 239a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (!lp_scene_bin_everywhere(scene, 240a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger LP_RAST_OP_CLEAR_COLOR, 241a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger clearrb_arg)) 242a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger return FALSE; 243a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 2440639765b2850739af1678f10fc0c5706d5827776Brian Paul } 245931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 246931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 2477f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell if (setup->fb.zsbuf) { 2480639765b2850739af1678f10fc0c5706d5827776Brian Paul if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) { 2496419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell ok = lp_scene_bin_everywhere( scene, 2509f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_CLEAR_ZSTENCIL, 2516419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell lp_rast_arg_clearzs( 2529f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->clear.zsvalue, 2539f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->clear.zsmask)); 254ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!ok) 255ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 2560639765b2850739af1678f10fc0c5706d5827776Brian Paul } 257931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 2583094fc200920f9d5eb62136d3b25896229fb0dbfBrian Paul 2599f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->clear.flags = 0; 2609f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->clear.zsmask = 0; 2619f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->clear.zsvalue = 0; 2629f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 26359b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger scene->had_queries = !!setup->active_binned_queries; 26459b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger 265a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s done\n", __FUNCTION__); 266ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 267946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 268946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 269946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 270931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen 271931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears. 272931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * 273931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles. 274b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca */ 275ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean 2763160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaexecute_clears( struct lp_setup_context *setup ) 277b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca{ 278a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 279b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 280ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return begin_binning( setup ); 281b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca} 282b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 2839f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellconst char *states[] = { 2849f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell "FLUSHED", 2859f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell "CLEARED", 2869f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell "ACTIVE " 2879f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell}; 2889f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 289b9f2f01315646c3af92e64152f51a593b65a5ac7José Fonseca 290ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellstatic boolean 2913160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecaset_scene_state( struct lp_setup_context *setup, 2929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell enum setup_state new_state, 2939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell const char *reason) 294946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 295931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned old_state = setup->state; 29680eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 297931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == new_state) 298ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 2999f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 30010d0a835bc3d8eb89637381be41ffd463f363b75Keith Whitwell if (LP_DEBUG & DEBUG_SCENE) { 3019f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell debug_printf("%s old %s new %s%s%s\n", 3029f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell __FUNCTION__, 3039f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell states[old_state], 3049f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell states[new_state], 3059f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell (new_state == SETUP_FLUSHED) ? ": " : "", 3069f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell (new_state == SETUP_FLUSHED) ? reason : ""); 307f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell 308f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell if (new_state == SETUP_FLUSHED && setup->scene) 30910d0a835bc3d8eb89637381be41ffd463f363b75Keith Whitwell lp_debug_draw_bins_by_cmd_length(setup->scene); 3109f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 311a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca 3129f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell /* wait for a free/empty scene 3139f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell */ 3149f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (old_state == SETUP_FLUSHED) 3159f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_setup_get_empty_scene(setup); 316931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 3179f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell switch (new_state) { 318931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_CLEARED: 319a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca break; 320a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca 321a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca case SETUP_ACTIVE: 322ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!begin_binning( setup )) 323ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell goto fail; 324931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 325a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca 326931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_FLUSHED: 3270718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (old_state == SETUP_CLEARED) 328ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!execute_clears( setup )) 329ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell goto fail; 3309f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 3319f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_setup_rasterize_scene( setup ); 332a2311400fe9385c39a278eb624dc60a0a635c838José Fonseca assert(setup->scene == NULL); 333931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 3340639765b2850739af1678f10fc0c5706d5827776Brian Paul 3350639765b2850739af1678f10fc0c5706d5827776Brian Paul default: 3360639765b2850739af1678f10fc0c5706d5827776Brian Paul assert(0 && "invalid setup state mode"); 337ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell goto fail; 338946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 339946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 340931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->state = new_state; 341ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 342ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 343ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellfail: 344ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (setup->scene) { 345ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell lp_scene_end_rasterization(setup->scene); 346ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell setup->scene = NULL; 347ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell } 348ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 349ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell setup->state = SETUP_FLUSHED; 350ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell lp_setup_reset( setup ); 351ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 352946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 353946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 354946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 355946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid 3563160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_flush( struct lp_setup_context *setup, 357b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell struct pipe_fence_handle **fence, 358b6e03eafe3311142445ca42c1574d3f6998eecc3Keith Whitwell const char *reason) 359946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 3609f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell set_scene_state( setup, SETUP_FLUSHED, reason ); 3613bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell 36218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (fence) { 36318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_reference((struct lp_fence **)fence, setup->last_fence); 3640639765b2850739af1678f10fc0c5706d5827776Brian Paul } 365946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 366946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 367946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 368931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 3693160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_bind_framebuffer( struct lp_setup_context *setup, 3709fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul const struct pipe_framebuffer_state *fb ) 371946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 372a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 373946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 3745fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /* Flush any old scene. 3755fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 3769f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ ); 377677a055fa0cf7b6476c716be187513c41060d417José Fonseca 3788be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca /* 3798be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca * Ensure the old scene is not reused. 3808be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca */ 3818be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca assert(!setup->scene); 3828be645d53a0d5d0ca50e4e9597043225e2231b6dJosé Fonseca 3835fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell /* Set new state. This will be picked up later when we next need a 3845fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell * scene. 3855fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell */ 3867f2ba80025e4b534db72427a206e6a542fc2f520Keith Whitwell util_copy_framebuffer_state(&setup->fb, fb); 38729bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->framebuffer.x0 = 0; 38829bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->framebuffer.y0 = 0; 38929bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->framebuffer.x1 = fb->width-1; 39029bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->framebuffer.y1 = fb->height-1; 39129bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->dirty |= LP_SETUP_NEW_SCISSOR; 392946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 393946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 394946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 395a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger/* 396a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * Try to clear one color buffer of the attached fb, either by binning a clear 397a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * command or queuing up the clear for later (when binning is started). 398a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger */ 3996419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean 400a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerlp_setup_try_clear_color_buffer(struct lp_setup_context *setup, 401a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger const union pipe_color_union *color, 402a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger unsigned cbuf) 40317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{ 404a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger union lp_rast_cmd_arg clearrb_arg; 405a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger union util_color uc; 406a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger enum pipe_format format = setup->fb.cbufs[cbuf]->format; 40717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 408a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state); 40917aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 410a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (util_format_is_pure_integer(format)) { 411a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger /* 412a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * We expect int/uint clear values here, though some APIs 413a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * might disagree (but in any case util_pack_color() 414a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * couldn't handle it)... 415a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger */ 416a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (util_format_is_pure_sint(format)) { 417a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger util_format_write_4i(format, color->i, 0, &uc, 0, 0, 0, 1, 1); 418a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 419a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger else { 420a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger assert(util_format_is_pure_uint(format)); 421a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger util_format_write_4ui(format, color->ui, 0, &uc, 0, 0, 0, 1, 1); 422a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 423a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 424a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger else { 425a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger util_pack_color(color->f, format, &uc); 42617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 42717aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 428a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (setup->state == SETUP_ACTIVE) { 429a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger struct lp_scene *scene = setup->scene; 4309f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 431a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger /* Add the clear to existing scene. In the unusual case where 432a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * both color and depth-stencil are being cleared when there's 433a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * already been some rendering, we could discard the currently 434a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * binned scene and start again, but I don't see that as being 435a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * a common usage. 436a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger */ 437a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger struct lp_rast_clear_rb *cc_scene = 438a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger (struct lp_rast_clear_rb *) 439a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger lp_scene_alloc_aligned(scene, sizeof(struct lp_rast_clear_rb), 8); 440c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell 441a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (!cc_scene) { 442a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger return FALSE; 443a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 4449fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca 445a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger cc_scene->cbuf = cbuf; 446a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger cc_scene->color_val = uc; 447a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger clearrb_arg.clear_rb = cc_scene; 4489fe510ef35a783a244d0d54baa50f959a6b781dcJosé Fonseca 449a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (!lp_scene_bin_everywhere(scene, 450a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger LP_RAST_OP_CLEAR_COLOR, 451a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger clearrb_arg)) 452a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger return FALSE; 45317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 454a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger else { 455a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger /* Put ourselves into the 'pre-clear' state, specifically to try 456a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * and accumulate multiple clears to color and depth_stencil 457a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * buffers which the app or state-tracker might issue 458a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * separately. 459a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger */ 460a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger set_scene_state( setup, SETUP_CLEARED, __FUNCTION__ ); 461a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 462a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger assert(PIPE_CLEAR_COLOR0 == (1 << 2)); 463a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger setup->clear.flags |= 1 << (cbuf + 2); 464a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger setup->clear.color_val[cbuf] = uc; 465a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 466a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 467a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger return TRUE; 468a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger} 469a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 470a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerstatic boolean 471a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheideggerlp_setup_try_clear_zs(struct lp_setup_context *setup, 472a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger double depth, 473a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger unsigned stencil, 474a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger unsigned flags) 475a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger{ 476a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger uint64_t zsmask = 0; 477a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger uint64_t zsvalue = 0; 478a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger uint32_t zmask32; 479a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger uint8_t smask8; 480b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger enum pipe_format format = setup->fb.zsbuf->format; 481a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 482a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state); 483a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 484a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger zmask32 = (flags & PIPE_CLEAR_DEPTH) ? ~0 : 0; 485a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger smask8 = (flags & PIPE_CLEAR_STENCIL) ? ~0 : 0; 486a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 487b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger zsvalue = util_pack64_z_stencil(format, depth, stencil); 488a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 489b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger zsmask = util_pack64_mask_z_stencil(format, zmask32, smask8); 490a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 491a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger zsvalue &= zsmask; 49217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 493b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger if (format == PIPE_FORMAT_Z24X8_UNORM || 494b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger format == PIPE_FORMAT_X8Z24_UNORM) { 495b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger /* 496b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger * Make full mask if there's "X" bits so we can do full 497b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger * clear (without rmw). 498b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger */ 499b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger uint32_t zsmask_full = 0; 500b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger zsmask_full = util_pack_mask_z_stencil(format, ~0, ~0); 501b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger zsmask |= ~zsmask_full; 502b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger } 503b21973acaa67fb7945a12fc266e20281d7eb5375Roland Scheidegger 504931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (setup->state == SETUP_ACTIVE) { 5059f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scene; 5069f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 507663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* Add the clear to existing scene. In the unusual case where 5089a6567f1ed88727545f747e8670b713f17627c94Brian Paul * both color and depth-stencil are being cleared when there's 5099a6567f1ed88727545f747e8670b713f17627c94Brian Paul * already been some rendering, we could discard the currently 5109a6567f1ed88727545f747e8670b713f17627c94Brian Paul * binned scene and start again, but I don't see that as being 5119a6567f1ed88727545f747e8670b713f17627c94Brian Paul * a common usage. 512253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 513a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (!lp_scene_bin_everywhere(scene, 514a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger LP_RAST_OP_CLEAR_ZSTENCIL, 515a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger lp_rast_arg_clearzs(zsvalue, zsmask))) 516a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger return FALSE; 517946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 518946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 519253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Put ourselves into the 'pre-clear' state, specifically to try 520253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * and accumulate multiple clears to color and depth_stencil 521253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * buffers which the app or state-tracker might issue 522253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * separately. 52317aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca */ 5249f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell set_scene_state( setup, SETUP_CLEARED, __FUNCTION__ ); 5250718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 526931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->clear.flags |= flags; 527c512ba88a7e33f14b86feb9c0aaf1ebed5f50629Keith Whitwell 528a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger setup->clear.zsmask |= zsmask; 529a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger setup->clear.zsvalue = 530a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger (setup->clear.zsvalue & ~zsmask) | (zsvalue & zsmask); 53117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 532a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 5336419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return TRUE; 5346419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell} 535946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5366419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellvoid 5376419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_clear( struct lp_setup_context *setup, 538babab2876080af0fe65249dff559244aebd0b87eRoland Scheidegger const union pipe_color_union *color, 5396419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell double depth, 5406419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell unsigned stencil, 5416419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell unsigned flags ) 542946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 543a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger unsigned i; 544946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 545a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger /* 546a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * Note any of these (max 9) clears could fail (but at most there should 547a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * be just one failure!). This avoids doing the previous succeeded 548a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * clears again (we still clear tiles twice if a clear command succeeded 549a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger * partially for one buffer). 550a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger */ 551a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 552a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger unsigned flagszs = flags & PIPE_CLEAR_DEPTHSTENCIL; 553a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs)) { 554a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger lp_setup_flush(setup, NULL, __FUNCTION__); 555a9063cad0f0190ff88cd20fbad5aa87bf1a943f6Brian Paul 556a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs)) 557a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger assert(0); 558a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 559a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 5603bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell 561a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (flags & PIPE_CLEAR_COLOR) { 562a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger assert(PIPE_CLEAR_COLOR0 == (1 << 2)); 563a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger for (i = 0; i < setup->fb.nr_cbufs; i++) { 564a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if ((flags & (1 << (2 + i))) && setup->fb.cbufs[i]) { 565a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (!lp_setup_try_clear_color_buffer(setup, color, i)) { 566a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger lp_setup_flush(setup, NULL, __FUNCTION__); 567a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger 568a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger if (!lp_setup_try_clear_color_buffer(setup, color, i)) 569a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger assert(0); 570a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 571a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 572a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 573a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger } 574a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger} 575946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 576946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 577946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 578415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid 5793160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_triangle_state( struct lp_setup_context *setup, 580e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell unsigned cull_mode, 581fdfe06ad804ea13e6e436d66c1bcafe0bde2f545Brian Paul boolean ccw_is_frontface, 582a80e33f40731f07e8a39896bfdcd1b1504aedc1fJosé Fonseca boolean scissor, 5832737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca boolean half_pixel_center, 5842737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca boolean bottom_edge_rule) 585415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{ 586a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 587946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 588415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->ccw_is_frontface = ccw_is_frontface; 589415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->cullmode = cull_mode; 590415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->triangle = first_triangle; 5912737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca setup->pixel_offset = half_pixel_center ? 0.5f : 0.0f; 5922737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca setup->bottom_edge_rule = bottom_edge_rule; 59329bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell 59429bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell if (setup->scissor_test != scissor) { 59529bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->dirty |= LP_SETUP_NEW_SCISSOR; 59629bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->scissor_test = scissor; 59729bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell } 598946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 599946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6005286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tayvoid 6015286dd701640976ffc328e8e85fb3830746851a1Hui Qi Taylp_setup_set_line_state( struct lp_setup_context *setup, 6025286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay float line_width) 6035286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay{ 6045286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 605946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6065286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay setup->line_width = line_width; 6075286dd701640976ffc328e8e85fb3830746851a1Hui Qi Tay} 608946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 60957d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tayvoid 61057d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Taylp_setup_set_point_state( struct lp_setup_context *setup, 611a7a03d84fc1a7a1721b4a0338258b3b8687743e8Roland Scheidegger float point_size, 61229ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay boolean point_size_per_vertex, 613c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul uint sprite_coord_enable, 614c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul uint sprite_coord_origin) 61557d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay{ 61657d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 61757d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 61857d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay setup->point_size = point_size; 619c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul setup->sprite_coord_enable = sprite_coord_enable; 620c3982c6bcdeb88f7fb1b20f8bd300db31cd7288dBrian Paul setup->sprite_coord_origin = sprite_coord_origin; 62129ec116e8f21c65250f1083830b82ff59859496dHui Qi Tay setup->point_size_per_vertex = point_size_per_vertex; 62257d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay} 62357d84d9ca4a645ca326b66ff3b82bee0db18ac97Hui Qi Tay 624931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 6255b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwelllp_setup_set_setup_variant( struct lp_setup_context *setup, 6265b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell const struct lp_setup_variant *variant) 627946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 6285b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 6295b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell 6305b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell setup->setup.variant = variant; 631931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 632946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 6330718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid 63418fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonsecalp_setup_set_fs_variant( struct lp_setup_context *setup, 63518fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca struct lp_fragment_shader_variant *variant) 636946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 637d9096926f84b33e122e3b2942ff66dc183894b50Brian Paul LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, 63818fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca variant); 639d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: reference count */ 640946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 64118fb9ff6d8f58a08e559070cf29f26ed0caa567fJosé Fonseca setup->fs.current.variant = variant; 6420e042bed49c51fef38b02b7cc05efa504f2f703dBrian Paul setup->dirty |= LP_SETUP_NEW_FS; 643946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 644946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 645d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 6463160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_fs_constants(struct lp_setup_context *setup, 6471d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca unsigned num, 6483427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul struct pipe_constant_buffer *buffers) 649946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 6501d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca unsigned i; 6511d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca 6521d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) buffers); 653402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 6541d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul assert(num <= ARRAY_SIZE(setup->constants)); 655931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 6561d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca for (i = 0; i < num; ++i) { 6573427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul util_copy_constant_buffer(&setup->constants[i].current, &buffers[i]); 6583427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul } 6591d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul for (; i < ARRAY_SIZE(setup->constants); i++) { 6603427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul util_copy_constant_buffer(&setup->constants[i].current, NULL); 6611d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca } 6623427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul setup->dirty |= LP_SETUP_NEW_CONSTANTS; 663946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 664946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 665946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 666d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 6673160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_alpha_ref_value( struct lp_setup_context *setup, 668d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca float alpha_ref_value ) 669946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 670a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %f\n", __FUNCTION__, alpha_ref_value); 671946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 67285999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) { 67385999695829823e459e11822b4846ed1db5c055dJosé Fonseca setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value; 6742e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 675d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 676d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 677946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 678d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 679eee51147979208feffdf37c588ebbce4df6b40d6Brian Paullp_setup_set_stencil_ref_values( struct lp_setup_context *setup, 680eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul const ubyte refs[2] ) 681eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul{ 682eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul LP_DBG(DEBUG_SETUP, "%s %d %d\n", __FUNCTION__, refs[0], refs[1]); 683eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul 684521c61ff017ab15b829abbe9a98b179136a36009Brian Paul if (setup->fs.current.jit_context.stencil_ref_front != refs[0] || 685521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_back != refs[1]) { 686521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_front = refs[0]; 687521c61ff017ab15b829abbe9a98b179136a36009Brian Paul setup->fs.current.jit_context.stencil_ref_back = refs[1]; 688eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul setup->dirty |= LP_SETUP_NEW_FS; 689eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul } 690eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul} 691eee51147979208feffdf37c588ebbce4df6b40d6Brian Paul 692eee51147979208feffdf37c588ebbce4df6b40d6Brian Paulvoid 6933160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_blend_color( struct lp_setup_context *setup, 694d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca const struct pipe_blend_color *blend_color ) 695d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 696a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 697946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 698f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca assert(blend_color); 699946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 700f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) { 701f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color); 702f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty |= LP_SETUP_NEW_BLEND_COLOR; 703d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 704d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 705946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 706946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7074461442849bfdb817334b38567136f7f9dabdf59Brian Paulvoid 70897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusinlp_setup_set_scissors( struct lp_setup_context *setup, 70997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin const struct pipe_scissor_state *scissors ) 7104461442849bfdb817334b38567136f7f9dabdf59Brian Paul{ 71197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin unsigned i; 7124461442849bfdb817334b38567136f7f9dabdf59Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 713946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 71497b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin assert(scissors); 715946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 71697b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin for (i = 0; i < PIPE_MAX_VIEWPORTS; ++i) { 71797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin setup->scissors[i].x0 = scissors[i].minx; 71897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin setup->scissors[i].x1 = scissors[i].maxx-1; 71997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin setup->scissors[i].y0 = scissors[i].miny; 72097b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin setup->scissors[i].y1 = scissors[i].maxy-1; 72197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin } 72229bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell setup->dirty |= LP_SETUP_NEW_SCISSOR; 723946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 724946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 725946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 7265ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid 7273160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_flatshade_first( struct lp_setup_context *setup, 7285ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell boolean flatshade_first ) 729946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 7305ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->flatshade_first = flatshade_first; 73117aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca} 73217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 73377b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlievoid 73477b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlielp_setup_set_rasterizer_discard( struct lp_setup_context *setup, 73577b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie boolean rasterizer_discard ) 73677b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie{ 7375b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie if (setup->rasterizer_discard != rasterizer_discard) { 7385b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie setup->rasterizer_discard = rasterizer_discard; 7395b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ ); 7405b2a3443facc561f928fe054abd3542cdda51be9Dave Airlie } 74177b26564c3f0395bf3e744abbf6d0e7aa9d2c8daDave Airlie} 74217aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca 7435ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwellvoid 7443160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_set_vertex_info( struct lp_setup_context *setup, 7455ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell struct vertex_info *vertex_info ) 74617aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca{ 7475ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell /* XXX: just silently holding onto the pointer: 7485ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell */ 7495ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->vertex_info = vertex_info; 750946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 751946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 752946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 753946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 7540319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * Called during state validation when LP_NEW_VIEWPORT is set. 7550319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure */ 7560319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClurevoid 7570319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClurelp_setup_set_viewports(struct lp_setup_context *setup, 7580319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure unsigned num_viewports, 7590319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure const struct pipe_viewport_state *viewports) 7600319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure{ 761e84a1ab3c400f819408a7ebe01c2325cd59d94d3Matthew McClure struct llvmpipe_context *lp = llvmpipe_context(setup->pipe); 7620319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure unsigned i; 7630319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 7640319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 7650319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 7660319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure assert(num_viewports <= PIPE_MAX_VIEWPORTS); 7670319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure assert(viewports); 7680319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 7690319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure /* 7700319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * For use in lp_state_fs.c, propagate the viewport values for all viewports. 7710319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure */ 7720319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure for (i = 0; i < num_viewports; i++) { 7730319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure float min_depth; 7740319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure float max_depth; 775b0a647f284b24ca4e0ee1f70c4839d8ec3d1a4e6Roland Scheidegger util_viewport_zmin_zmax(&viewports[i], lp->rasterizer->clip_halfz, 776b0a647f284b24ca4e0ee1f70c4839d8ec3d1a4e6Roland Scheidegger &min_depth, &max_depth); 7770319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 7780319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure if (setup->viewports[i].min_depth != min_depth || 7790319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure setup->viewports[i].max_depth != max_depth) { 7800319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure setup->viewports[i].min_depth = min_depth; 7810319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure setup->viewports[i].max_depth = max_depth; 7820319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure setup->dirty |= LP_SETUP_NEW_VIEWPORTS; 7830319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure } 7840319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure } 7850319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure} 7860319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 7870319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 7880319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure/** 7891fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol * Called during state validation when LP_NEW_SAMPLER_VIEW is set. 790946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 791d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 79247bfbd452c93e6a8db013fb90d9f42210cf24889Keith Whitwelllp_setup_set_fragment_sampler_views(struct lp_setup_context *setup, 7931fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol unsigned num, 7941fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol struct pipe_sampler_view **views) 795946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 7962f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger unsigned i, max_tex_num; 797d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 798a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 799402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 800c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger assert(num <= PIPE_MAX_SHADER_SAMPLER_VIEWS); 801d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 8022f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger max_tex_num = MAX2(num, setup->fs.current_tex_num); 8032f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger 8042f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger for (i = 0; i < max_tex_num; i++) { 8051fb440beb9cccbe6f4bbd309792a89f6e1b4ee3fMichal Krol struct pipe_sampler_view *view = i < num ? views[i] : NULL; 806d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 807fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca if (view) { 80820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger struct pipe_resource *res = view->texture; 80920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger struct llvmpipe_resource *lp_tex = llvmpipe_resource(res); 81085999695829823e459e11822b4846ed1db5c055dJosé Fonseca struct lp_jit_texture *jit_tex; 81185999695829823e459e11822b4846ed1db5c055dJosé Fonseca jit_tex = &setup->fs.current.jit_context.textures[i]; 8126d50148742512606f2abd76a2dcef6c87a5c7471Roland Scheidegger 8132ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul /* We're referencing the texture's internal data, so save a 8142ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul * reference to it. 8152ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul */ 81620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger pipe_resource_reference(&setup->fs.current_tex[i], res); 8172ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 818f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul if (!lp_tex->dt) { 81926097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger /* regular texture - setup array of mipmap level offsets */ 820f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul int j; 82120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger unsigned first_level = 0; 82220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger unsigned last_level = 0; 82320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger 82420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger if (llvmpipe_resource_is_texture(res)) { 82520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger first_level = view->u.tex.first_level; 82620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger last_level = view->u.tex.last_level; 82720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger assert(first_level <= last_level); 82820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger assert(last_level <= res->last_level); 8297e1521f191afe30fcf02a25b68fbf89278f014d3Roland Scheidegger jit_tex->base = lp_tex->tex_data; 83020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger } 83120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger else { 832aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger jit_tex->base = lp_tex->data; 83320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger } 83420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger 835aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger if (LP_PERF & PERF_TEX_MEM) { 836aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger /* use dummy tile memory */ 83726097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger jit_tex->base = lp_dummy_tile; 83826097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger jit_tex->width = TILE_SIZE/8; 83926097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger jit_tex->height = TILE_SIZE/8; 84026097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger jit_tex->depth = 1; 84126097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger jit_tex->first_level = 0; 84226097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger jit_tex->last_level = 0; 843b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul jit_tex->mip_offsets[0] = 0; 844b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul jit_tex->row_stride[0] = 0; 845b21f8e364b997c31ad0b3f97b18c7d87a35642ebBrian Paul jit_tex->img_stride[0] = 0; 84626097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger } 84726097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger else { 84820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->width = res->width0; 84920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->height = res->height0; 85020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->depth = res->depth0; 85120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->first_level = first_level; 85220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->last_level = last_level; 85320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger 85420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger if (llvmpipe_resource_is_texture(res)) { 85520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger for (j = first_level; j <= last_level; j++) { 856aa1ab8173dfe73692cf65af401e7345ec78bb313Roland Scheidegger jit_tex->mip_offsets[j] = lp_tex->mip_offsets[j]; 85720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->row_stride[j] = lp_tex->row_stride[j]; 85820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->img_stride[j] = lp_tex->img_stride[j]; 85920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger } 86020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger 861fe707c0373cf73f9323014f7bc38f20120d4f096Roland Scheidegger if (res->target == PIPE_TEXTURE_1D_ARRAY || 862fe707c0373cf73f9323014f7bc38f20120d4f096Roland Scheidegger res->target == PIPE_TEXTURE_2D_ARRAY || 863fe707c0373cf73f9323014f7bc38f20120d4f096Roland Scheidegger res->target == PIPE_TEXTURE_CUBE || 864fe707c0373cf73f9323014f7bc38f20120d4f096Roland Scheidegger res->target == PIPE_TEXTURE_CUBE_ARRAY) { 86587978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger /* 86687978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger * For array textures, we don't have first_layer, instead 86787978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger * adjust last_layer (stored as depth) plus the mip level offsets 86887978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger * (as we have mip-first layout can't just adjust base ptr). 86987978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger * XXX For mip levels, could do something similar. 87087978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger */ 87120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->depth = view->u.tex.last_layer - view->u.tex.first_layer + 1; 87287978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger for (j = first_level; j <= last_level; j++) { 87387978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger jit_tex->mip_offsets[j] += view->u.tex.first_layer * 87487978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger lp_tex->img_stride[j]; 87587978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger } 876e6c66f4fb060cf2566d2b5e091b76a098566344dRoland Scheidegger if (view->target == PIPE_TEXTURE_CUBE || 877e6c66f4fb060cf2566d2b5e091b76a098566344dRoland Scheidegger view->target == PIPE_TEXTURE_CUBE_ARRAY) { 878ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger assert(jit_tex->depth % 6 == 0); 879ea05cfaacac29d15c9c3d939e12546eba95f05d0Roland Scheidegger } 88020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger assert(view->u.tex.first_layer <= view->u.tex.last_layer); 88120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger assert(view->u.tex.last_layer < res->array_size); 88220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger } 88320183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger } 88420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger else { 88587978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger /* 8867cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák * For buffers, we don't have "offset", instead adjust 8877cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák * the size (stored as width) plus the base pointer. 88887978518e996d02e055174d7152fff150fe3cd13Roland Scheidegger */ 88920183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger unsigned view_blocksize = util_format_get_blocksize(view->format); 89020183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger /* probably don't really need to fill that out */ 89120183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->mip_offsets[0] = 0; 89220183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->row_stride[0] = 0; 8933d29e75a5f59639c3b9dfed26cd41ab13c0d60fcRoland Scheidegger jit_tex->img_stride[0] = 0; 89420183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger 89520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger /* everything specified in number of elements here. */ 8967cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák jit_tex->width = view->u.buf.size / view_blocksize; 8977cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák jit_tex->base = (uint8_t *)jit_tex->base + view->u.buf.offset; 89820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger /* XXX Unsure if we need to sanitize parameters? */ 8997cd256ce7e4bad680bb77d033cf5dd662abab2ddMarek Olšák assert(view->u.buf.offset + view->u.buf.size <= res->width0); 9002b3e1ad731d2bd095a680d3120619972a7eb0242Brian Paul } 901f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul } 902b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca } 903b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca else { 904f027d5612901de8e6167e6288c4e24d91d964e7fBrian Paul /* display target texture/surface */ 905b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca /* 906b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca * XXX: Where should this be unmapped? 907b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca */ 90820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger struct llvmpipe_screen *screen = llvmpipe_screen(res->screen); 90994ce4eb3c27706d992226d847d123c46b14b1c4fKeith Whitwell struct sw_winsys *winsys = screen->winsys; 91026097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger jit_tex->base = winsys->displaytarget_map(winsys, lp_tex->dt, 91126097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger PIPE_TRANSFER_READ); 912f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul jit_tex->row_stride[0] = lp_tex->row_stride[0]; 913f4071e55dba8c0f45f3a7f59135b34e5b81fdab8Brian Paul jit_tex->img_stride[0] = lp_tex->img_stride[0]; 91426097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger jit_tex->mip_offsets[0] = 0; 91520183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->width = res->width0; 91620183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->height = res->height0; 91720183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->depth = res->depth0; 91820183177a5803317fe69f1f1a8dfae4d18b3702fRoland Scheidegger jit_tex->first_level = jit_tex->last_level = 0; 91926097c4855b97ee6e362c19df11d51fb7fd42192Roland Scheidegger assert(jit_tex->base); 920b44c444a0fd203004612cab86ac78ae3bef2794bJosé Fonseca } 921d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 9222f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger else { 9232f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger pipe_resource_reference(&setup->fs.current_tex[i], NULL); 9242f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger } 92517aec9304ca86feac7ca29e17dda73a10cdd08a5José Fonseca } 9262f9a325b6ac1609a9986b4bee161610730da7da5Roland Scheidegger setup->fs.current_tex_num = num; 927d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 9282e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 929946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 930946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 931946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 932946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 933fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca * Called during state validation when LP_NEW_SAMPLER is set. 934fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca */ 935fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonsecavoid 936fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonsecalp_setup_set_fragment_sampler_state(struct lp_setup_context *setup, 937fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca unsigned num, 938b3538d356316b282d6408f710f2df5f06bf315f5Brian Paul struct pipe_sampler_state **samplers) 939fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca{ 940fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca unsigned i; 941fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 942fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 943fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 944fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca assert(num <= PIPE_MAX_SAMPLERS); 945fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 946fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { 947fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca const struct pipe_sampler_state *sampler = i < num ? samplers[i] : NULL; 948fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 949fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca if (sampler) { 950c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger struct lp_jit_sampler *jit_sam; 951c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger jit_sam = &setup->fs.current.jit_context.samplers[i]; 952fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 953c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger jit_sam->min_lod = sampler->min_lod; 954c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger jit_sam->max_lod = sampler->max_lod; 955c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger jit_sam->lod_bias = sampler->lod_bias; 956c789b981b244333cfc903bcd1e2fefc010500013Roland Scheidegger COPY_4V(jit_sam->border_color, sampler->border_color.f); 957fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca } 958fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca } 959fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 960fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca setup->dirty |= LP_SETUP_NEW_FS; 961fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca} 962fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 963fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca 964fdcc168a16d59bf2b7fd291383f214834c2546f6José Fonseca/** 965d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Is the given texture referenced by any scene? 966d59fe448967addb3025d7df90888ff950e03a343Brian Paul * Note: we have to check all scenes including any scenes currently 967d59fe448967addb3025d7df90888ff950e03a343Brian Paul * being rendered and the current scene being built. 968946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 969cd9d9e2436a0815f6ed3a61d2cdf8fad53278506Brian Paulunsigned 970287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwelllp_setup_is_resource_referenced( const struct lp_setup_context *setup, 971287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell const struct pipe_resource *texture ) 972946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 973d59fe448967addb3025d7df90888ff950e03a343Brian Paul unsigned i; 974946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 97512872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul /* check the render targets */ 97612872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul for (i = 0; i < setup->fb.nr_cbufs; i++) { 977d6fa71fbb0d365cefdabfea9de62cfece71f7486Brian Paul if (setup->fb.cbufs[i] && setup->fb.cbufs[i]->texture == texture) 97825485f4b69447514ab8b595aced90c75606a99bdMarek Olšák return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE; 97912872774461a84f0a7c272aff5aac5e30a78a7c2Brian Paul } 980018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) { 98125485f4b69447514ab8b595aced90c75606a99bdMarek Olšák return LP_REFERENCED_FOR_READ | LP_REFERENCED_FOR_WRITE; 982946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 983946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 984018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul /* check textures referenced by the scene */ 9851d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul for (i = 0; i < ARRAY_SIZE(setup->scenes); i++) { 986287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell if (lp_scene_is_resource_referenced(setup->scenes[i], texture)) { 98725485f4b69447514ab8b595aced90c75606a99bdMarek Olšák return LP_REFERENCED_FOR_READ; 988018b78ad649e88cc6d8b6b10aef1502075508515Brian Paul } 989946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 990946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 99125485f4b69447514ab8b595aced90c75606a99bdMarek Olšák return LP_UNREFERENCED; 992946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 993946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 994946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 995946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 996a27b12171d84c6e731af08f48a657c377f8549baBrian Paul * Called by vbuf code when we're about to draw something. 9970319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * 9980319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * This function stores all dirty state in the current scene's display list 9990319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * memory, via lp_scene_alloc(). We can not pass pointers of mutable state to 10000319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * the JIT functions, as the JIT functions will be called later on, most likely 10010319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * on a different thread. 10020319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * 10030319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * When processing dirty state it is imperative that we don't refer to any 10040319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * pointers previously allocated with lp_scene_alloc() in this function (or any 10050319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * function) as they may belong to a scene freed since then. 1006946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 10076419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic boolean 10086419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelltry_update_scene_state( struct lp_setup_context *setup ) 1009946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 1010586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger static const float fake_const_buf[4]; 10119f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell boolean new_scene = (setup->fs.stored == NULL); 10129f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scene; 10131d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca unsigned i; 1014bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul 10159f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(scene); 1016946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 10170319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure if (setup->dirty & LP_SETUP_NEW_VIEWPORTS) { 10180319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure /* 10190319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * Record new depth range state for changes due to viewport updates. 10200319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * 10210319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * TODO: Collapse the existing viewport and depth range information 10220319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure * into one structure, for access by JIT. 10230319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure */ 10240319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure struct lp_jit_viewport *stored; 10250319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 10260319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure stored = (struct lp_jit_viewport *) 10270319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure lp_scene_alloc(scene, sizeof setup->viewports); 10280319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 10290319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure if (!stored) { 10300319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure assert(!new_scene); 10310319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure return FALSE; 10320319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure } 10330319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 10340319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure memcpy(stored, setup->viewports, sizeof setup->viewports); 10350319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 10360319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure setup->fs.current.jit_context.viewports = stored; 10370319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure setup->dirty |= LP_SETUP_NEW_FS; 10380319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure } 10390319ea9ff6a9cc2eba4879fbe09c6fac137d6ce1Matthew McClure 1040f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) { 1041f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca uint8_t *stored; 1042fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton float* fstored; 1043f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca unsigned i, j; 1044fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton unsigned size; 1045fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton 1046fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton /* Alloc u8_blend_color (16 x i8) and f_blend_color (4 or 8 x f32) */ 1047fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton size = 4 * 16 * sizeof(uint8_t); 1048fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton size += (LP_MAX_VECTOR_LENGTH / 4) * sizeof(float); 10492f65f61beac3a45fdf27bf25d7b13cd1fa2bbb8cRoland Scheidegger stored = lp_scene_alloc_aligned(scene, size, LP_MIN_VECTOR_ALIGN); 105080eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell 10519f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (!stored) { 10529f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(!new_scene); 10536419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 10549f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 10556419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 1056fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton /* Store floating point colour */ 1057fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton fstored = (float*)(stored + 4*16); 1058fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton for (i = 0; i < (LP_MAX_VECTOR_LENGTH / 4); ++i) { 1059fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton fstored[i] = setup->blend_color.current.color[i % 4]; 1060fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton } 1061fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton 10626419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell /* smear each blend color component across 16 ubyte elements */ 10636419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell for (i = 0; i < 4; ++i) { 10646419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]); 10656419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell for (j = 0; j < 16; ++j) 10666419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell stored[i*16 + j] = c; 1067477b0d838b7ac3f9d0534df28f6af9e17c403a71Brian Paul } 1068f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca 10696419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->blend_color.stored = stored; 1070fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton setup->fs.current.jit_context.u8_blend_color = stored; 1071fa1b481c09b14e01eca1b3db8e0854033f6dee3dJames Benton setup->fs.current.jit_context.f_blend_color = fstored; 1072f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty |= LP_SETUP_NEW_FS; 1073946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 1074946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 10751d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca if (setup->dirty & LP_SETUP_NEW_CONSTANTS) { 10761d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul for (i = 0; i < ARRAY_SIZE(setup->constants); ++i) { 10773427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul struct pipe_resource *buffer = setup->constants[i].current.buffer; 1078afeb92220690c8f27cdc56c30e109ca175d51d83José Fonseca const unsigned current_size = MIN2(setup->constants[i].current.buffer_size, 1079afeb92220690c8f27cdc56c30e109ca175d51d83José Fonseca LP_MAX_TGSI_CONST_BUFFER_SIZE); 10803427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul const ubyte *current_data = NULL; 108193b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin int num_constants; 1082946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1083afeb92220690c8f27cdc56c30e109ca175d51d83José Fonseca STATIC_ASSERT(DATA_BLOCK_SIZE >= LP_MAX_TGSI_CONST_BUFFER_SIZE); 1084afeb92220690c8f27cdc56c30e109ca175d51d83José Fonseca 10851d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca if (buffer) { 10863427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul /* resource buffer */ 10873427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul current_data = (ubyte *) llvmpipe_resource_data(buffer); 10883427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul } 10893427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul else if (setup->constants[i].current.user_buffer) { 10903427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul /* user-space buffer */ 10913427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul current_data = (ubyte *) setup->constants[i].current.user_buffer; 10923427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul } 10933427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul 10943427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul if (current_data) { 10953427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul current_data += setup->constants[i].current.buffer_offset; 1096946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 10971d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca /* TODO: copy only the actually used constants? */ 1098946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 10991d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca if (setup->constants[i].stored_size != current_size || 11001d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca !setup->constants[i].stored_data || 11011d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca memcmp(setup->constants[i].stored_data, 11021d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca current_data, 11031d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca current_size) != 0) { 11041d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca void *stored; 1105946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 11061d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca stored = lp_scene_alloc(scene, current_size); 11071d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca if (!stored) { 11081d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca assert(!new_scene); 11091d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca return FALSE; 11101d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca } 11116419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 11121d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca memcpy(stored, 11131d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca current_data, 11141d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca current_size); 11151d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca setup->constants[i].stored_size = current_size; 11161d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca setup->constants[i].stored_data = stored; 11171d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca } 1118586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger setup->fs.current.jit_context.constants[i] = 1119586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger setup->constants[i].stored_data; 11201d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca } 11211d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca else { 11221d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca setup->constants[i].stored_size = 0; 11231d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca setup->constants[i].stored_data = NULL; 1124586536a4e1c34725b3b38c3425db569fac0c91e9Roland Scheidegger setup->fs.current.jit_context.constants[i] = fake_const_buf; 1125946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 1126946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 112793b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin num_constants = 112893b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin setup->constants[i].stored_size / (sizeof(float) * 4); 112993b953d139112bea1c9c64a3de462cbb52c544fdZack Rusin setup->fs.current.jit_context.num_constants[i] = num_constants; 11301d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 11311d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca } 11322e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 11332e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 11342e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 11356419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (setup->dirty & LP_SETUP_NEW_FS) { 11366419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!setup->fs.stored || 11376419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell memcmp(setup->fs.stored, 11386419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell &setup->fs.current, 11396419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell sizeof setup->fs.current) != 0) 11406419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell { 11416419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell struct lp_rast_state *stored; 11426419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 1143663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* The fs state that's been stored in the scene is different from 1144e2f46344560f8f1193b311ad41883011e67eea00Brian Paul * the new, current state. So allocate a new lp_rast_state object 1145e2f46344560f8f1193b311ad41883011e67eea00Brian Paul * and append it to the bin's setup data buffer. 1146e2f46344560f8f1193b311ad41883011e67eea00Brian Paul */ 11476419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell stored = (struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored); 11489f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (!stored) { 11499f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(!new_scene); 11506419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 11519f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 11522ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 11536419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell memcpy(stored, 11546419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell &setup->fs.current, 11556419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell sizeof setup->fs.current); 11566419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->fs.stored = stored; 11576419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 11582ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul /* The scene now references the textures in the rasterization 11592ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul * state record. Note that now. 11602ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul */ 11611d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul for (i = 0; i < ARRAY_SIZE(setup->fs.current_tex); i++) { 11626419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (setup->fs.current_tex[i]) { 11636419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_scene_add_resource_reference(scene, 11649f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->fs.current_tex[i], 11659f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell new_scene)) { 11669f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(!new_scene); 11676419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 11689f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } 11696419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 1170d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell } 1171d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell } 1172d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell } 1173d4bfd8a24a4c2b246b55888d4983ddcf665b6976Keith Whitwell 117429bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell if (setup->dirty & LP_SETUP_NEW_SCISSOR) { 117597b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin unsigned i; 117697b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin for (i = 0; i < PIPE_MAX_VIEWPORTS; ++i) { 117797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin setup->draw_regions[i] = setup->framebuffer; 117897b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin if (setup->scissor_test) { 117997b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin u_rect_possible_intersection(&setup->scissors[i], 118097b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin &setup->draw_regions[i]); 118197b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin } 118229bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell } 118329bcbf5e797a18430285c75abb8a9300c8defe1dKeith Whitwell } 1184bfcf1ba1c4879102eb05460528b02a23d81eac99Roland Scheidegger 11852e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty = 0; 11862e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 118785999695829823e459e11822b4846ed1db5c055dJosé Fonseca assert(setup->fs.stored); 11886419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return TRUE; 11896419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell} 11906419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 1191ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellboolean 11929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_setup_update_state( struct lp_setup_context *setup, 11939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell boolean update_scene ) 11946419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{ 11956419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell /* Some of the 'draw' pipeline stages may have changed some driver state. 11966419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * Make sure we've processed those state changes before anything else. 11976419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * 11986419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * XXX this is the only place where llvmpipe_context is used in the 11996419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * setup code. This may get refactored/changed... 12006419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 12016419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell { 12026419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell struct llvmpipe_context *lp = llvmpipe_context(setup->pipe); 12036419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (lp->dirty) { 12046419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell llvmpipe_update_derived(lp); 12056419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 12066419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 1207efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul if (lp->setup->dirty) { 1208efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul llvmpipe_update_setup(lp); 1209efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul } 1210efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul 1211efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul assert(setup->setup.variant); 1212efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul 12136419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell /* Will probably need to move this somewhere else, just need 12146419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * to know about vertex shader point size attribute. 12156419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 1216af7ba989fb5a39925a0a1261ed281fe7f48a16cfRoland Scheidegger setup->psize_slot = lp->psize_slot; 121797b8ae429ec64003e258764db12ea69d4e978f6dZack Rusin setup->viewport_index_slot = lp->viewport_index_slot; 1218d8146f240e628e70d4c07f7e805a179f70c36e23Roland Scheidegger setup->layer_slot = lp->layer_slot; 1219d6b3a193d4d525c5048ebf793e6a63fd98f92d64Zack Rusin setup->face_slot = lp->face_slot; 12206419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 12216419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell assert(lp->dirty == 0); 12225b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell 12235b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell assert(lp->setup_variant.key.size == 12245b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell setup->setup.variant->key.size); 12255b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell 12265b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell assert(memcmp(&lp->setup_variant.key, 12275b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell &setup->setup.variant->key, 12285b4c43d98556c5a4806757513bcb196a724518c5Keith Whitwell setup->setup.variant->key.size) == 0); 12296419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 12306419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 123168a4f6324712d7eae327ee438a41c432ec72f11dKeith Whitwell if (update_scene && setup->state != SETUP_ACTIVE) { 1232ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!set_scene_state( setup, SETUP_ACTIVE, __FUNCTION__ )) 1233ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 1234ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell } 12359f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 12369f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell /* Only call into update_scene_state() if we already have a 12376419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * scene: 12386419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 12399f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (update_scene && setup->scene) { 12409f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(setup->state == SETUP_ACTIVE); 1241ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1242ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (try_update_scene_state(setup)) 1243ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 1244ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1245ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell /* Update failed, try to restart the scene. 1246ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell * 1247ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell * Cannot call lp_setup_flush_and_restart() directly here 1248ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell * because of potential recursion. 1249ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell */ 1250ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__)) 1251ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 1252ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1253ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!set_scene_state(setup, SETUP_ACTIVE, __FUNCTION__)) 1254ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 1255ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1256ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!setup->scene) 1257ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 1258ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1259ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return try_update_scene_state(setup); 12606419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 1261ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1262ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 1263946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 1264946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1265608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 1266946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1267b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell/* Only caller is lp_setup_vbuf_destroy() 1268b08583da468ee186b43ea678f8d33fb7df3ab372Keith Whitwell */ 1269253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid 12703160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecalp_setup_destroy( struct lp_setup_context *setup ) 1271946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 12722ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul uint i; 12732ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 12749f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_setup_reset( setup ); 1275946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 12765f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul util_unreference_framebuffer_state(&setup->fb); 12775f53ecb97f23503324d62abdd21bda8ee80b0ab9Brian Paul 12781d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul for (i = 0; i < ARRAY_SIZE(setup->fs.current_tex); i++) { 1279287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell pipe_resource_reference(&setup->fs.current_tex[i], NULL); 12802ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul } 12812ad8692aad0f4ad49643d5f697a036afccdeb9f0Brian Paul 12821d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul for (i = 0; i < ARRAY_SIZE(setup->constants); i++) { 12833427466e6dbbb8db7c1ecda6b3859ca1cc5827a3Brian Paul pipe_resource_reference(&setup->constants[i].current.buffer, NULL); 12841d35f77228ad540a551a8e09e062b764a6e31f5eJosé Fonseca } 1285946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1286663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* free the scenes in the 'empty' queue */ 12871d242b688265a405dfd8077ea32ac4ea673b02a2Brian Paul for (i = 0; i < ARRAY_SIZE(setup->scenes); i++) { 12889f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct lp_scene *scene = setup->scenes[i]; 12899f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 12909f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (scene->fence) 12919f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell lp_fence_wait(scene->fence); 12929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 1293663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell lp_scene_destroy(scene); 1294946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 1295946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1296cdd4f04f80de91d6d4e5b904ec66386d6546f977José Fonseca lp_fence_reference(&setup->last_fence, NULL); 1297cdd4f04f80de91d6d4e5b904ec66386d6546f977José Fonseca 129889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell FREE( setup ); 1299946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 1300946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1301946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1302946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 13035ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * Create a new primitive tiling engine. Plug it into the backend of 13045ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * the draw module. Currently also creates a rasterizer to use with 13055ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell * it. 1306946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 13073160cbabccf1f7d8bdf344242507b9c3082f15c6José Fonsecastruct lp_setup_context * 13085fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwelllp_setup_create( struct pipe_context *pipe, 13095ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell struct draw_context *draw ) 1310946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 131139be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca struct llvmpipe_screen *screen = llvmpipe_screen(pipe->screen); 1312c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca struct lp_setup_context *setup; 131339be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca unsigned i; 1314946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1315c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca setup = CALLOC_STRUCT(lp_setup_context); 1316c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca if (!setup) { 1317c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca goto no_setup; 1318c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca } 1319a22f87c99462fd83dc398f4c06fc6d9997e15dbaKeith Whitwell 13205ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell lp_setup_init_vbuf(setup); 13216419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 13226419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell /* Used only in update_state(): 13236419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 13246419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell setup->pipe = pipe; 13255ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 1326946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 132739be50dcdebe6bcbb48cb6aa8ac151eee811acb1José Fonseca setup->num_threads = screen->num_threads; 13285ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell setup->vbuf = draw_vbuf_stage(draw, &setup->base); 1329c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca if (!setup->vbuf) { 1330c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca goto no_vbuf; 1331c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca } 13325ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 13335ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell draw_set_rasterize_stage(draw, setup->vbuf); 13345ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell draw_set_render(draw, &setup->base); 13355ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 1336663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /* create some empty scenes */ 1337663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell for (i = 0; i < MAX_SCENES; i++) { 13389f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell setup->scenes[i] = lp_scene_create( pipe ); 1339c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca if (!setup->scenes[i]) { 1340c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca goto no_scenes; 1341c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca } 134280eb276630a194632d9eba1e2b107d678d0f0a4dKeith Whitwell } 1343946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 1344163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->triangle = first_triangle; 1345163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->line = first_line; 1346163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->point = first_point; 1347163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell 1348301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca setup->dirty = ~0; 134908811032c2dd8f38d2ef65d7fd8794112e029b63Keith Whitwell 1350946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca return setup; 1351931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1352c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_scenes: 1353c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca for (i = 0; i < MAX_SCENES; i++) { 1354c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca if (setup->scenes[i]) { 1355c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca lp_scene_destroy(setup->scenes[i]); 1356c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca } 1357c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca } 13585ce0380a0f585b9e1fb616b749f7fd18a8afada1Keith Whitwell 1359c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonseca setup->vbuf->destroy(setup->vbuf); 1360c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_vbuf: 1361931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(setup); 1362c88f3e0374620f18cf38d9fc3c45d14bc53f62b2José Fonsecano_setup: 1363931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return NULL; 1364946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 1365946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 136686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 136786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/** 136886afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put a BeginQuery command into all bins. 136986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */ 137086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid 137186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_begin_query(struct lp_setup_context *setup, 137286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li struct llvmpipe_query *pq) 137386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{ 137442dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul 137542dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul set_scene_state(setup, SETUP_ACTIVE, "begin_query"); 1376dc5dc4fd943e1da5207e0489c355e9a7ba1dff87Roland Scheidegger 137708203428800554215657f1ebf19d74328103800eRoland Scheidegger if (!(pq->type == PIPE_QUERY_OCCLUSION_COUNTER || 137808203428800554215657f1ebf19d74328103800eRoland Scheidegger pq->type == PIPE_QUERY_OCCLUSION_PREDICATE || 137908203428800554215657f1ebf19d74328103800eRoland Scheidegger pq->type == PIPE_QUERY_PIPELINE_STATISTICS)) 138008203428800554215657f1ebf19d74328103800eRoland Scheidegger return; 138116f0d70ffe6d42d22b9e6b927b297e75a199aa78James Benton 138208203428800554215657f1ebf19d74328103800eRoland Scheidegger /* init the query to its beginning state */ 13832e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger assert(setup->active_binned_queries < LP_MAX_ACTIVE_BINNED_QUERIES); 13842e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger /* exceeding list size so just ignore the query */ 13852e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger if (setup->active_binned_queries >= LP_MAX_ACTIVE_BINNED_QUERIES) { 13862e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger return; 13872e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger } 13882e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger assert(setup->active_queries[setup->active_binned_queries] == NULL); 13892e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger setup->active_queries[setup->active_binned_queries] = pq; 13902e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger setup->active_binned_queries++; 13918cce283038bf51a03de6734523c3e9ea8c8a6f33Brian Paul 139208203428800554215657f1ebf19d74328103800eRoland Scheidegger assert(setup->scene); 139318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (setup->scene) { 13946419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_scene_bin_everywhere(setup->scene, 13959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_BEGIN_QUERY, 13966419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell lp_rast_arg_query(pq))) { 13979f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 1398ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!lp_setup_flush_and_restart(setup)) 1399ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return; 14006419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 14016419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_scene_bin_everywhere(setup->scene, 14029f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell LP_RAST_OP_BEGIN_QUERY, 14036419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell lp_rast_arg_query(pq))) { 14046419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return; 14056419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 14066419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 140759b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger setup->scene->had_queries |= TRUE; 140818452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell } 140986afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li} 141086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 141186afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li 141286afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li/** 141386afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li * Put an EndQuery command into all bins. 141486afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li */ 141586afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Livoid 141686afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Lilp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq) 141786afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li{ 141842dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul set_scene_state(setup, SETUP_ACTIVE, "end_query"); 141942dbc2530b5a2263012f3fa0e48517a1b8db1c52Brian Paul 142008203428800554215657f1ebf19d74328103800eRoland Scheidegger assert(setup->scene); 142118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell if (setup->scene) { 142218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell /* pq->fence should be the fence of the *last* scene which 142318452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell * contributed to the query result. 142418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell */ 142518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_reference(&pq->fence, setup->scene->fence); 142618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 142708203428800554215657f1ebf19d74328103800eRoland Scheidegger if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER || 142808203428800554215657f1ebf19d74328103800eRoland Scheidegger pq->type == PIPE_QUERY_OCCLUSION_PREDICATE || 142908203428800554215657f1ebf19d74328103800eRoland Scheidegger pq->type == PIPE_QUERY_PIPELINE_STATISTICS || 143008203428800554215657f1ebf19d74328103800eRoland Scheidegger pq->type == PIPE_QUERY_TIMESTAMP) { 14317d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger if (pq->type == PIPE_QUERY_TIMESTAMP && 14327d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger !(setup->scene->tiles_x | setup->scene->tiles_y)) { 14337d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger /* 14347d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger * If there's a zero width/height framebuffer, there's no bins and 14357d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger * hence no rast task is ever run. So fill in something here instead. 14367d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger */ 14377d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger pq->end[0] = os_time_get_nano(); 14387d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger } 14397d430bfab98f3639cb9d354d1d42f3c0ec5a9e76Roland Scheidegger 144008203428800554215657f1ebf19d74328103800eRoland Scheidegger if (!lp_scene_bin_everywhere(setup->scene, 144108203428800554215657f1ebf19d74328103800eRoland Scheidegger LP_RAST_OP_END_QUERY, 144208203428800554215657f1ebf19d74328103800eRoland Scheidegger lp_rast_arg_query(pq))) { 144308203428800554215657f1ebf19d74328103800eRoland Scheidegger if (!lp_setup_flush_and_restart(setup)) 144408203428800554215657f1ebf19d74328103800eRoland Scheidegger goto fail; 144508203428800554215657f1ebf19d74328103800eRoland Scheidegger 144608203428800554215657f1ebf19d74328103800eRoland Scheidegger if (!lp_scene_bin_everywhere(setup->scene, 144708203428800554215657f1ebf19d74328103800eRoland Scheidegger LP_RAST_OP_END_QUERY, 144808203428800554215657f1ebf19d74328103800eRoland Scheidegger lp_rast_arg_query(pq))) { 144908203428800554215657f1ebf19d74328103800eRoland Scheidegger goto fail; 145008203428800554215657f1ebf19d74328103800eRoland Scheidegger } 145108203428800554215657f1ebf19d74328103800eRoland Scheidegger } 145259b8689d3706fbb739d9b15943907ae67f35de95Roland Scheidegger setup->scene->had_queries |= TRUE; 14536419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 145418452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell } 145518452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell else { 145618452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell lp_fence_reference(&pq->fence, setup->last_fence); 145718452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell } 145808203428800554215657f1ebf19d74328103800eRoland Scheidegger 145908203428800554215657f1ebf19d74328103800eRoland Scheideggerfail: 146008203428800554215657f1ebf19d74328103800eRoland Scheidegger /* Need to do this now not earlier since it still needs to be marked as 146108203428800554215657f1ebf19d74328103800eRoland Scheidegger * active when binning it would cause a flush. 146208203428800554215657f1ebf19d74328103800eRoland Scheidegger */ 14632e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger if (pq->type == PIPE_QUERY_OCCLUSION_COUNTER || 14642e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger pq->type == PIPE_QUERY_OCCLUSION_PREDICATE || 14652e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger pq->type == PIPE_QUERY_PIPELINE_STATISTICS) { 14662e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger unsigned i; 14672e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger 14682e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger /* remove from active binned query list */ 14692e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger for (i = 0; i < setup->active_binned_queries; i++) { 14702e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger if (setup->active_queries[i] == pq) 14712e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger break; 14722e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger } 14732e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger assert(i < setup->active_binned_queries); 14742e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger if (i == setup->active_binned_queries) 14752e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger return; 14762e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger setup->active_binned_queries--; 14772e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger setup->active_queries[i] = setup->active_queries[setup->active_binned_queries]; 14782e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger setup->active_queries[setup->active_binned_queries] = NULL; 14792e4da1f59444c550e4b1e31dd5cfec39d7ef2a26Roland Scheidegger } 148086afe8250edaa2e6129c937a62a695f616c48d70Qicheng Christopher Li} 148118452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 148218452c1e87f79327fbd5f27478028b481ee72a5dKeith Whitwell 1483ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwellboolean 14846419ecd02ce43a2614822e228f306d4db589f317Keith Whitwelllp_setup_flush_and_restart(struct lp_setup_context *setup) 14856419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell{ 14866419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (0) debug_printf("%s\n", __FUNCTION__); 14876419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 14886419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell assert(setup->state == SETUP_ACTIVE); 1489ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1490ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__)) 1491ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 1492ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1493ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell if (!lp_setup_update_state(setup, TRUE)) 1494ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return FALSE; 1495ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell 1496ad6730fadbbeacea96322e31064ede9ea7ebad6fKeith Whitwell return TRUE; 14976419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell} 14989f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 14999f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 1500