lp_setup.c revision 6cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3
1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/************************************************************************** 2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 3946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * All Rights Reserved. 5946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 6946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 7946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * copy of this software and associated documentation files (the 8946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * "Software"), to deal in the Software without restriction, including 9946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * without limitation the rights to use, copy, modify, merge, publish, 10946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * distribute, sub license, and/or sell copies of the Software, and to 11946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * permit persons to whom the Software is furnished to do so, subject to 12946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * the following conditions: 13946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 14946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * The above copyright notice and this permission notice (including the 15946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * next paragraph) shall be included in all copies or substantial portions 16946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * of the Software. 17946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 18946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 26946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca **************************************************************************/ 27946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 28946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 29931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Tiling engine. 30946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * 31931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Builds per-tile display lists and executes them on calls to 32931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * lp_setup_flush(). 33946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 34946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 35d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "pipe/p_defines.h" 36d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "pipe/p_inlines.h" 37946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h" 38253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell#include "util/u_pack_color.h" 39d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul#include "lp_bin.h" 40d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul#include "lp_bin_queue.h" 41a08d6302168341001003da32d42cfcff2311fa04Brian Paul#include "lp_debug.h" 426cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul#include "lp_fence.h" 43d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_state.h" 44d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_buffer.h" 45d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_texture.h" 46d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_setup_context.h" 47253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 48402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 49d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul/** XXX temporary value, temporary here */ 50d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul#define MAX_BINS 2 51d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul 52d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul 53253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void set_state( struct setup_context *, unsigned ); 54946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 55946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 5622b07b8be4c2939b00e10f17fa91e68682808594Brian Paulstruct lp_bins * 5722b07b8be4c2939b00e10f17fa91e68682808594Brian Paullp_setup_get_current_bins(struct setup_context *setup) 5822b07b8be4c2939b00e10f17fa91e68682808594Brian Paul{ 593bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul if (!setup->bins) { 603bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul /* wait for a free/empty bin */ 613bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul setup->bins = lp_bins_dequeue(setup->empty_bins); 623bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul if(0)lp_reset_bins( setup->bins ); /* XXX temporary? */ 633bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul 643bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul if (setup->fb) { 65ad3c16c127f167513a136759a1700e111a0ef7b8Brian Paul lp_bin_set_framebuffer_size(setup->bins, 66ad3c16c127f167513a136759a1700e111a0ef7b8Brian Paul setup->fb->width, setup->fb->height); 673bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul } 683bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul } 6922b07b8be4c2939b00e10f17fa91e68682808594Brian Paul return setup->bins; 7022b07b8be4c2939b00e10f17fa91e68682808594Brian Paul} 7122b07b8be4c2939b00e10f17fa91e68682808594Brian Paul 72253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 73253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 74253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_triangle( struct setup_context *setup, 75253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 76253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4], 77253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v2)[4]) 78253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 79253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell set_state( setup, SETUP_ACTIVE ); 80253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_triangle( setup ); 81253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 82253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 83253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 84253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 85253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_line( struct setup_context *setup, 86253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4], 87253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v1)[4]) 88253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 89253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell set_state( setup, SETUP_ACTIVE ); 90253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_line( setup ); 91253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line( setup, v0, v1 ); 92253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 93253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 94253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void 95253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_point( struct setup_context *setup, 96253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float (*v0)[4]) 97253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{ 98253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell set_state( setup, SETUP_ACTIVE ); 99253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell lp_setup_choose_point( setup ); 100253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point( setup, v0 ); 101253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell} 102253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 103931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void reset_context( struct setup_context *setup ) 104931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 105a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 106402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 107301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca /* Reset derived state */ 1082e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = 0; 1092e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = NULL; 110301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca setup->fs.stored = NULL; 111f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty = ~0; 1122e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 1133bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul /* no current bin */ 1143bee8c2e7c17893f91f6b62e2db090ef495dca9dBrian Paul setup->bins = NULL; 1150718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 1160718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell /* Reset some state: 1170718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell */ 1180718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell setup->clear.flags = 0; 119253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 120253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Have an explicit "start-binning" call and get rid of this 121253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * pointer twiddling? 122253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 123253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->line = first_line; 124253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->point = first_point; 125253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->triangle = first_triangle; 126931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 127931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 128931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1297d042ac2a285c220a396d91a6dbe5c7f4e697c71Brian Paul/** Rasterize all tile's bins */ 130931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 131931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellrasterize_bins( struct setup_context *setup, 132931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell boolean write_depth ) 133e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{ 13422b07b8be4c2939b00e10f17fa91e68682808594Brian Paul struct lp_bins *bins = lp_setup_get_current_bins(setup); 13522b07b8be4c2939b00e10f17fa91e68682808594Brian Paul 13601b1900084152dbacd4025a31ced25f75666ce59Brian Paul lp_rasterize_bins(setup->rast, 13722b07b8be4c2939b00e10f17fa91e68682808594Brian Paul bins, 13801b1900084152dbacd4025a31ced25f75666ce59Brian Paul setup->fb, 13901b1900084152dbacd4025a31ced25f75666ce59Brian Paul write_depth); 140e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell 1411caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell reset_context( setup ); 1423094fc200920f9d5eb62136d3b25896229fb0dbfBrian Paul 143a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__); 144e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell} 145e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 146931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 147931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 148931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 149931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellbegin_binning( struct setup_context *setup ) 150e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{ 15122b07b8be4c2939b00e10f17fa91e68682808594Brian Paul struct lp_bins *bins = lp_setup_get_current_bins(setup); 15222b07b8be4c2939b00e10f17fa91e68682808594Brian Paul 153a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 154402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 1559fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul if (setup->fb->cbufs[0]) { 1560718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_COLOR) 15722b07b8be4c2939b00e10f17fa91e68682808594Brian Paul lp_bin_everywhere( bins, 1588a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul lp_rast_clear_color, 1598a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul setup->clear.color ); 160931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 16122b07b8be4c2939b00e10f17fa91e68682808594Brian Paul lp_bin_everywhere( bins, 1628a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul lp_rast_load_color, 1638a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul lp_rast_arg_null() ); 164931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 165931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 1669fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul if (setup->fb->zsbuf) { 1670718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 16822b07b8be4c2939b00e10f17fa91e68682808594Brian Paul lp_bin_everywhere( bins, 1698a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul lp_rast_clear_zstencil, 1708a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul setup->clear.zstencil ); 171931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 17222b07b8be4c2939b00e10f17fa91e68682808594Brian Paul lp_bin_everywhere( bins, 1738a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul lp_rast_load_zstencil, 1748a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul lp_rast_arg_null() ); 175931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 1763094fc200920f9d5eb62136d3b25896229fb0dbfBrian Paul 177a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s done\n", __FUNCTION__); 178e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell} 179e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 180e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell 181931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen 182931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears. 183931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * 184931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles. 185946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 186931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 187931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellexecute_clears( struct setup_context *setup ) 188946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 189a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 190402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 191931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell begin_binning( setup ); 1920718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell rasterize_bins( setup, TRUE ); 193946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 194946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 195931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 196931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void 197931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellset_state( struct setup_context *setup, 198931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned new_state ) 199931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 200931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned old_state = setup->state; 201931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 202931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == new_state) 203931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 204931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 205a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s old %d new %d\n", __FUNCTION__, old_state, new_state); 206402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 207931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell switch (new_state) { 208931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_ACTIVE: 209402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell begin_binning( setup ); 210931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 211931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 212931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_CLEARED: 213931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (old_state == SETUP_ACTIVE) { 214931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell assert(0); 215931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return; 216931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 217931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 218931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 219931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell case SETUP_FLUSHED: 2200718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell if (old_state == SETUP_CLEARED) 221931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell execute_clears( setup ); 222931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell else 2230718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell rasterize_bins( setup, TRUE ); 224931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell break; 225931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell } 226931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 227931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->state = new_state; 228931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 229931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 230931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 231946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid 232931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_flush( struct setup_context *setup, 233931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 234946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 235a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 236402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 237931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_FLUSHED ); 238946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 239946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 240946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 241931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 242931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_bind_framebuffer( struct setup_context *setup, 2439fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul const struct pipe_framebuffer_state *fb ) 244946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 24522b07b8be4c2939b00e10f17fa91e68682808594Brian Paul struct lp_bins *bins = lp_setup_get_current_bins(setup); 2468a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul 247a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 248402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 249931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_FLUSHED ); 250931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 2519fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul setup->fb = fb; 2528a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul 253ad3c16c127f167513a136759a1700e111a0ef7b8Brian Paul lp_bin_set_framebuffer_size(bins, setup->fb->width, setup->fb->height); 254931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 255931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 256b1659b9213f3eeee440590dfe379f0d193948307Brian Paul 257931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 258931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_clear( struct setup_context *setup, 259253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const float *color, 260253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell double depth, 261253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell unsigned stencil, 262931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned flags ) 263931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 26422b07b8be4c2939b00e10f17fa91e68682808594Brian Paul struct lp_bins *bins = lp_setup_get_current_bins(setup); 265659609e0ae27071a601794935c85547e315dedebJosé Fonseca unsigned i; 266659609e0ae27071a601794935c85547e315dedebJosé Fonseca 267a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state); 268402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 269402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 2704cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_COLOR) { 271659609e0ae27071a601794935c85547e315dedebJosé Fonseca for (i = 0; i < 4; ++i) 272659609e0ae27071a601794935c85547e315dedebJosé Fonseca setup->clear.color.clear_color[i] = float_to_ubyte(color[i]); 2734cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell } 2744cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell 2754cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_DEPTHSTENCIL) { 2764cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell setup->clear.zstencil.clear_zstencil = 2779fca3e065b9ab5ef1389a76934bc24ed2b287a76Brian Paul util_pack_z_stencil(setup->fb->zsbuf->format, 2784cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell depth, 2794cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell stencil); 2804cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell } 2814cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell 282931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (setup->state == SETUP_ACTIVE) { 283253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Add the clear to existing bins. In the unusual case where 2849a6567f1ed88727545f747e8670b713f17627c94Brian Paul * both color and depth-stencil are being cleared when there's 2859a6567f1ed88727545f747e8670b713f17627c94Brian Paul * already been some rendering, we could discard the currently 2869a6567f1ed88727545f747e8670b713f17627c94Brian Paul * binned scene and start again, but I don't see that as being 2879a6567f1ed88727545f747e8670b713f17627c94Brian Paul * a common usage. 288253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 2894cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (flags & PIPE_CLEAR_COLOR) 29022b07b8be4c2939b00e10f17fa91e68682808594Brian Paul lp_bin_everywhere( bins, 2918a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul lp_rast_clear_color, 2928a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul setup->clear.color ); 293253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell 2944cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) 29522b07b8be4c2939b00e10f17fa91e68682808594Brian Paul lp_bin_everywhere( bins, 2968a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul lp_rast_clear_zstencil, 2978a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul setup->clear.zstencil ); 298946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 299946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca else { 300253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell /* Put ourselves into the 'pre-clear' state, specifically to try 301253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * and accumulate multiple clears to color and depth_stencil 302253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * buffers which the app or state-tracker might issue 303253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell * separately. 304253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell */ 305931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell set_state( setup, SETUP_CLEARED ); 3060718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 307931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->clear.flags |= flags; 308946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca } 309931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 310931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 311931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 3126cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul/** 3136cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul * Emit a fence. 3146cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul */ 3156cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paulstruct pipe_fence_handle * 3166cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paullp_setup_fence( struct setup_context *setup ) 3176cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul{ 3186cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul struct lp_bins *bins = lp_setup_get_current_bins(setup); 3196cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul const unsigned rank = lp_bin_get_num_bins( bins ); 3206cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul struct lp_fence *fence = lp_fence_create(rank); 3216cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul 3226cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul LP_DBG(DEBUG_SETUP, "%s rank %u\n", __FUNCTION__, rank); 3236cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul 3246cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul set_state( setup, SETUP_ACTIVE ); 3256cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul 3266cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul /* insert the fence into all command bins */ 3276cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul lp_bin_everywhere( bins, 3286cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul lp_rast_fence, 3296cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul lp_rast_arg_fence(fence) ); 3306cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul 3316cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul return (struct pipe_fence_handle *) fence; 3326cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul} 3336cbb1219a3f6b83ee4d24aecb61f5b5943e3cac3Brian Paul 334415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 335415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid 336e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwelllp_setup_set_triangle_state( struct setup_context *setup, 337e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell unsigned cull_mode, 338e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell boolean ccw_is_frontface) 339415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{ 340a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 341402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 342415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->ccw_is_frontface = ccw_is_frontface; 343415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->cullmode = cull_mode; 344415b271b5100d64579690111bc8eb549866865a7Keith Whitwell setup->triangle = first_triangle; 345415b271b5100d64579690111bc8eb549866865a7Keith Whitwell} 346415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 347415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 348415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 349931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 350931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_set_fs_inputs( struct setup_context *setup, 351253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell const struct lp_shader_input *input, 352931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell unsigned nr ) 353931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 354a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %p %u\n", __FUNCTION__, (void *) input, nr); 355402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 356253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell memcpy( setup->fs.input, input, nr * sizeof input[0] ); 357253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell setup->fs.nr_inputs = nr; 358931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 35989498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell 3600718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid 361d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_fs( struct setup_context *setup, 362d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct lp_fragment_shader *fs ) 3630718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell{ 364a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) fs); 365d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: reference count */ 366d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 36785999695829823e459e11822b4846ed1db5c055dJosé Fonseca setup->fs.current.jit_function = fs ? fs->current->jit_function : NULL; 3680e042bed49c51fef38b02b7cc05efa504f2f703dBrian Paul setup->dirty |= LP_SETUP_NEW_FS; 3690718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell} 3700718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell 371d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 372d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_fs_constants(struct setup_context *setup, 373d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_buffer *buffer) 374d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 375a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %p\n", __FUNCTION__, (void *) buffer); 376402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 3772e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca pipe_buffer_reference(&setup->constants.current, buffer); 378931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 3792e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_CONSTANTS; 380d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 381d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 382d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 383d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 384d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_alpha_ref_value( struct setup_context *setup, 385d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca float alpha_ref_value ) 386d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 387a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s %f\n", __FUNCTION__, alpha_ref_value); 388402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 38985999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) { 39085999695829823e459e11822b4846ed1db5c055dJosé Fonseca setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value; 3912e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 392d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 393d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 394d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 395d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 396d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_blend_color( struct setup_context *setup, 397d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca const struct pipe_blend_color *blend_color ) 398d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 399a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 400402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 401f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca assert(blend_color); 402d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 403f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) { 404f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color); 405f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty |= LP_SETUP_NEW_BLEND_COLOR; 406d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 407d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 408d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 409d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid 410d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_sampler_textures( struct setup_context *setup, 411d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca unsigned num, struct pipe_texture **texture) 412d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{ 413d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_texture *dummy; 414d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca unsigned i; 415d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 416a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 417402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 418402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 419d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca assert(num <= PIPE_MAX_SAMPLERS); 420d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 421d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca for (i = 0; i < PIPE_MAX_SAMPLERS; i++) { 422d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct pipe_texture *tex = i < num ? texture[i] : NULL; 423d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 424d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: hold on to the reference */ 425d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca dummy = NULL; 426d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca pipe_texture_reference(&dummy, tex); 427d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 428d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca if(tex) { 429d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca struct llvmpipe_texture *lp_tex = llvmpipe_texture(tex); 43085999695829823e459e11822b4846ed1db5c055dJosé Fonseca struct lp_jit_texture *jit_tex; 43185999695829823e459e11822b4846ed1db5c055dJosé Fonseca jit_tex = &setup->fs.current.jit_context.textures[i]; 432d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->width = tex->width[0]; 433d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->height = tex->height[0]; 434d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->stride = lp_tex->stride[0]; 435d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca if(!lp_tex->dt) 436d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca jit_tex->data = lp_tex->data; 437d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca else 438d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca /* FIXME: map the rendertarget */ 439d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca assert(0); 440d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 441d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca } 442d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 4432e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 444d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca} 445d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca 446c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonsecaboolean 447c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonsecalp_setup_is_texture_referenced( struct setup_context *setup, 448c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca const struct pipe_texture *texture ) 449c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca{ 450c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca /* FIXME */ 451c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca return PIPE_UNREFERENCED; 452c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca} 453c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca 454c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca 455608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonsecastatic INLINE void 456608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonsecalp_setup_update_shader_state( struct setup_context *setup ) 457608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca{ 45822b07b8be4c2939b00e10f17fa91e68682808594Brian Paul struct lp_bins *bins = lp_setup_get_current_bins(setup); 45922b07b8be4c2939b00e10f17fa91e68682808594Brian Paul 460a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 461608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 46285999695829823e459e11822b4846ed1db5c055dJosé Fonseca assert(setup->fs.current.jit_function); 46385999695829823e459e11822b4846ed1db5c055dJosé Fonseca 464f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) { 465f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca uint8_t *stored; 466f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca unsigned i, j; 467f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca 46822b07b8be4c2939b00e10f17fa91e68682808594Brian Paul stored = lp_bin_alloc_aligned(bins, 4 * 16, 16); 469f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca 4709c1debe208d07b57e88c65bae186bb339de7dee7Brian Paul /* smear each blend color component across 16 ubyte elements */ 471f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca for (i = 0; i < 4; ++i) { 472f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]); 473f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca for (j = 0; j < 16; ++j) 4744e058f6c4803be5d9d676338d6aee2775b88b87cBrian Paul stored[i*16 + j] = c; 475f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca } 476f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca 477f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->blend_color.stored = stored; 478f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca 479f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->fs.current.jit_context.blend_color = setup->blend_color.stored; 480f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca setup->dirty |= LP_SETUP_NEW_FS; 481f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca } 482f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca 483f2be08ae0e20b3da8ff684ffeb94412cc6a5a5a1José Fonseca 4842e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->dirty & LP_SETUP_NEW_CONSTANTS) { 4852e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca struct pipe_buffer *buffer = setup->constants.current; 4862e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 4872e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(buffer) { 4882e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca unsigned current_size = buffer->size; 4892e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca const void *current_data = llvmpipe_buffer(buffer)->data; 4902e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 4912e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca /* TODO: copy only the actually used constants? */ 4922e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 4932e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->constants.stored_size != current_size || 4942e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca !setup->constants.stored_data || 4952e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca memcmp(setup->constants.stored_data, 4962e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_data, 4972e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_size) != 0) { 4982e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca void *stored; 4992e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 50022b07b8be4c2939b00e10f17fa91e68682808594Brian Paul stored = lp_bin_alloc(bins, current_size); 5012e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(stored) { 5022e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca memcpy(stored, 5032e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_data, 5042e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca current_size); 5052e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = current_size; 5062e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = stored; 5072e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 5082e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 5092e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 5102e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca else { 5112e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_size = 0; 5122e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->constants.stored_data = NULL; 5132e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 5142e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 5152e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->fs.current.jit_context.constants = setup->constants.stored_data; 5162e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty |= LP_SETUP_NEW_FS; 5172e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca } 5182e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 5192e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 5202e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca if(setup->dirty & LP_SETUP_NEW_FS) { 52185999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(!setup->fs.stored || 52285999695829823e459e11822b4846ed1db5c055dJosé Fonseca memcmp(setup->fs.stored, 52385999695829823e459e11822b4846ed1db5c055dJosé Fonseca &setup->fs.current, 52485999695829823e459e11822b4846ed1db5c055dJosé Fonseca sizeof setup->fs.current) != 0) { 525e2f46344560f8f1193b311ad41883011e67eea00Brian Paul /* The fs state that's been stored in the bins is different from 526e2f46344560f8f1193b311ad41883011e67eea00Brian Paul * the new, current state. So allocate a new lp_rast_state object 527e2f46344560f8f1193b311ad41883011e67eea00Brian Paul * and append it to the bin's setup data buffer. 528e2f46344560f8f1193b311ad41883011e67eea00Brian Paul */ 529e2f46344560f8f1193b311ad41883011e67eea00Brian Paul struct lp_rast_state *stored = 53022b07b8be4c2939b00e10f17fa91e68682808594Brian Paul (struct lp_rast_state *) lp_bin_alloc(bins, sizeof *stored); 53185999695829823e459e11822b4846ed1db5c055dJosé Fonseca if(stored) { 53285999695829823e459e11822b4846ed1db5c055dJosé Fonseca memcpy(stored, 53385999695829823e459e11822b4846ed1db5c055dJosé Fonseca &setup->fs.current, 53485999695829823e459e11822b4846ed1db5c055dJosé Fonseca sizeof setup->fs.current); 53585999695829823e459e11822b4846ed1db5c055dJosé Fonseca setup->fs.stored = stored; 536e2f46344560f8f1193b311ad41883011e67eea00Brian Paul 537e2f46344560f8f1193b311ad41883011e67eea00Brian Paul /* put the state-set command into all bins */ 53822b07b8be4c2939b00e10f17fa91e68682808594Brian Paul lp_bin_state_command( bins, 5398a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul lp_rast_set_state, 5408a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul lp_rast_arg_state(setup->fs.stored) ); 541608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca } 542608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca } 543608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca } 544608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 5452e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca setup->dirty = 0; 5462e3580d994e2caf6d81763803c8525a7ed42b8fdJosé Fonseca 54785999695829823e459e11822b4846ed1db5c055dJosé Fonseca assert(setup->fs.stored); 548608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca} 549608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 550608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca 551931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Stubs for lines & points for now: 552931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */ 553931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 554931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_point(struct setup_context *setup, 555931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v0)[4]) 556931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 557608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca lp_setup_update_shader_state(setup); 558931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->point( setup, v0 ); 559946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 560946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 561931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 562931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_line(struct setup_context *setup, 563931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v0)[4], 564931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell const float (*v1)[4]) 565931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 566608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca lp_setup_update_shader_state(setup); 567931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->line( setup, v0, v1 ); 568931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 569931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 570931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid 5710718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwelllp_setup_tri(struct setup_context *setup, 5720718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v0)[4], 5730718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v1)[4], 5740718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell const float (*v2)[4]) 575931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{ 576a08d6302168341001003da32d42cfcff2311fa04Brian Paul LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 577402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell 578608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca lp_setup_update_shader_state(setup); 579931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell setup->triangle( setup, v0, v1, v2 ); 580931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell} 581946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 582946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 583253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid 584253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwelllp_setup_destroy( struct setup_context *setup ) 585946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 586415b271b5100d64579690111bc8eb549866865a7Keith Whitwell reset_context( setup ); 587415b271b5100d64579690111bc8eb549866865a7Keith Whitwell 588301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca pipe_buffer_reference(&setup->constants.current, NULL); 589301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca 590d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul /* free the bins in the 'empty' queue */ 591d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul while (lp_bins_queue_size(setup->empty_bins) > 0) { 592d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul struct lp_bins *bins = lp_bins_dequeue(setup->empty_bins); 593d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul if (!bins) 594d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul break; 595d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul lp_bins_destroy(bins); 596d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul } 597d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul 598931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell lp_rast_destroy( setup->rast ); 59922b07b8be4c2939b00e10f17fa91e68682808594Brian Paul 60089498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell FREE( setup ); 601946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 602946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 603946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 604946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/** 605931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Create a new primitive tiling engine. Currently also creates a 606931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * rasterizer to use with it. 607946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */ 608253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstruct setup_context * 609e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwelllp_setup_create( struct pipe_screen *screen ) 610946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{ 611d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul unsigned i; 61289498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell struct setup_context *setup = CALLOC_STRUCT(setup_context); 613946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 614d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul if (!setup) 615d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul return NULL; 616d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul 617d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul setup->empty_bins = lp_bins_queue_create(); 618d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul if (!setup->empty_bins) 619d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul goto fail; 620d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul 621d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul setup->rast = lp_rast_create( screen, setup->empty_bins ); 622931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell if (!setup->rast) 623931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell goto fail; 624931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 625d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul /* create some empty bins */ 626d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul for (i = 0; i < MAX_BINS; i++) { 627d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul struct lp_bins *bins = lp_bins_create(); 628d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul lp_bins_enqueue(setup->empty_bins, bins); 629d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul } 630d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul 631163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->triangle = first_triangle; 632163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->line = first_line; 633163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell setup->point = first_point; 634163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell 635301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca setup->dirty = ~0; 636301c1494b27ad92ff1237909f9c98c1660be8fc1José Fonseca 637946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca return setup; 638931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell 639931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfail: 640d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul if (setup->empty_bins) 641d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul lp_bins_queue_destroy(setup->empty_bins); 642d7dbc666367438ee9efe748505907b36bba6b66aBrian Paul 643931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell FREE(setup); 644931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell return NULL; 645946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca} 646946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca 647