1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2009 VMware, Inc. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <limits.h> 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_math.h" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_rect.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_surface.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_pack_color.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_scene_queue.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_debug.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_fence.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_perf.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_query.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_rast.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_rast_priv.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_tile_soa.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "gallivm/lp_bld_debug.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_scene.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "lp_tex_sample.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint jit_line = 0; 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct lp_rast_state *jit_state = NULL; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst struct lp_rasterizer_task *jit_task = NULL; 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Begin rasterizing a scene. 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called once per scene by one thread. 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_begin( struct lp_rasterizer *rast, 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_scene *scene ) 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast->curr_scene = scene; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_DBG(DEBUG_RAST, "%s\n", __FUNCTION__); 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_scene_begin_rasterization( scene ); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_scene_bin_iter_begin( scene ); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_end( struct lp_rasterizer *rast ) 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_scene_end_rasterization( rast->curr_scene ); 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast->curr_scene = NULL; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("Post render scene: tile unswizzle: %u tile swizzle: %u\n", 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_tile_unswizzle_count, lp_tile_swizzle_count); 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Begining rasterization of a tile. 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param x window X position of the tile, in pixels 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param y window Y position of the tile, in pixels 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_tile_begin(struct lp_rasterizer_task *task, 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct cmd_bin *bin) 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_scene *scene = task->scene; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org enum lp_texture_usage usage; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_DBG(DEBUG_RAST, "%s %d,%d\n", __FUNCTION__, bin->x, bin->y); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->bin = bin; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->x = bin->x * TILE_SIZE; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->y = bin->y * TILE_SIZE; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reset pointers to color tile(s) */ 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(task->color_tiles, 0, sizeof(task->color_tiles)); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get pointer to depth/stencil tile */ 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *zsbuf = task->scene->fb.zsbuf; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (zsbuf) { 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct llvmpipe_resource *lpt = llvmpipe_resource(zsbuf->texture); 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (scene->has_depthstencil_clear) 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage = LP_TEX_USAGE_WRITE_ALL; 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage = LP_TEX_USAGE_READ_WRITE; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* "prime" the tile: convert data from linear to tiled if necessary 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and update the tile's layout info. 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) llvmpipe_get_texture_tile(lpt, 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zsbuf->u.tex.first_layer, 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zsbuf->u.tex.level, 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org usage, 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->x, 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->y); 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Get actual pointer to the tile data. Note that depth/stencil 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * data is tiled differently than color data. 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->depth_tile = lp_rast_get_depth_block_pointer(task, 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->x, 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->y); 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(task->depth_tile); 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->depth_tile = NULL; 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clear the rasterizer's current color tile. 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a bin command called during bin processing. 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_clear_color(struct lp_rasterizer_task *task, 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union lp_rast_cmd_arg arg) 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_scene *scene = task->scene; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t *clear_color = arg.clear_color; 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_DBG(DEBUG_RAST, "%s 0x%x,0x%x,0x%x,0x%x\n", __FUNCTION__, 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clear_color[0], 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clear_color[1], 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clear_color[2], 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clear_color[3]); 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (clear_color[0] == clear_color[1] && 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clear_color[1] == clear_color[2] && 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clear_color[2] == clear_color[3]) { 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* clear to grayscale value {x, x, x, x} */ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < scene->fb.nr_cbufs; i++) { 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *ptr = 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_get_color_tile_pointer(task, i, LP_TEX_USAGE_WRITE_ALL); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(ptr, clear_color[0], TILE_SIZE * TILE_SIZE * 4); 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Non-gray color. 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: if the swizzled tile layout changes (see TILE_PIXEL) this code 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * will need to change. It'll be pretty obvious when clearing no longer 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * works. 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned chunk = TILE_SIZE / 4; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < scene->fb.nr_cbufs; i++) { 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *c = 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_get_color_tile_pointer(task, i, LP_TEX_USAGE_WRITE_ALL); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned j; 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < 4 * TILE_SIZE; j++) { 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(c, clear_color[0], chunk); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c += chunk; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(c, clear_color[1], chunk); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c += chunk; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(c, clear_color[2], chunk); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c += chunk; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(c, clear_color[3], chunk); 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org c += chunk; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_COUNT(nr_color_tile_clear); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clear the rasterizer's current z/stencil tile. 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a bin command called during bin processing. 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_clear_zstencil(struct lp_rasterizer_task *task, 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union lp_rast_cmd_arg arg) 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_scene *scene = task->scene; 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t clear_value = arg.clear_zstencil.value; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t clear_mask = arg.clear_zstencil.mask; 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned height = TILE_SIZE / TILE_VECTOR_HEIGHT; 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned width = TILE_SIZE * TILE_VECTOR_HEIGHT; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned block_size = scene->zsbuf.blocksize; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned dst_stride = scene->zsbuf.stride * TILE_VECTOR_HEIGHT; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *dst; 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, j; 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_DBG(DEBUG_RAST, "%s: value=0x%08x, mask=0x%08x\n", 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org __FUNCTION__, clear_value, clear_mask); 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Clear the area of the swizzled depth/depth buffer matching this tile, in 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stripes of TILE_VECTOR_HEIGHT x TILE_SIZE at a time. 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The swizzled depth format is such that the depths for 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TILE_VECTOR_HEIGHT x TILE_VECTOR_WIDTH pixels have consecutive offsets. 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = task->depth_tile; 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clear_value &= clear_mask; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (block_size) { 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(clear_mask == 0xff); 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(dst, (uint8_t) clear_value, height * width); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (clear_mask == 0xffff) { 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < height; i++) { 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint16_t *row = (uint16_t *)dst; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < width; j++) 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *row++ = (uint16_t) clear_value; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dst_stride; 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < height; i++) { 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint16_t *row = (uint16_t *)dst; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < width; j++) { 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint16_t tmp = ~clear_mask & *row; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *row++ = clear_value | tmp; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dst_stride; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (clear_mask == 0xffffffff) { 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < height; i++) { 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *row = (uint32_t *)dst; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < width; j++) 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *row++ = clear_value; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dst_stride; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < height; i++) { 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *row = (uint32_t *)dst; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < width; j++) { 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t tmp = ~clear_mask & *row; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *row++ = clear_value | tmp; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dst_stride; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert the color tile from tiled to linear layout. 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is generally only done when we're flushing the scene just prior to 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SwapBuffers. If we didn't do this here, we'd have to convert the entire 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * tiled color buffer to linear layout in the llvmpipe_texture_unmap() 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * function. It's better to do it here to take advantage of 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * threading/parallelism. 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a bin command which is stored in all bins. 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_store_linear_color( struct lp_rasterizer_task *task ) 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_scene *scene = task->scene; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned buf; 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (buf = 0; buf < scene->fb.nr_cbufs; buf++) { 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_surface *cbuf = scene->fb.cbufs[buf]; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned layer = cbuf->u.tex.first_layer; 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned level = cbuf->u.tex.level; 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct llvmpipe_resource *lpt = llvmpipe_resource(cbuf->texture); 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!task->color_tiles[buf]) 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org continue; 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org llvmpipe_unswizzle_cbuf_tile(lpt, 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org layer, 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org level, 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->x, task->y, 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->color_tiles[buf]); 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Run the shader on all blocks in a tile. This is used when a tile is 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * completely contained inside a triangle. 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a bin command called during bin processing. 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_shade_tile(struct lp_rasterizer_task *task, 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union lp_rast_cmd_arg arg) 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_scene *scene = task->scene; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_rast_shader_inputs *inputs = arg.shade_tile; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_rast_state *state; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_fragment_shader_variant *variant; 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned tile_x = task->x, tile_y = task->y; 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, y; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inputs->disable) { 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This command was partially binned and has been disabled */ 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_DBG(DEBUG_RAST, "%s\n", __FUNCTION__); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state = task->state; 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(state); 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!state) { 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org variant = state->variant; 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* render the whole 64x64 tile in 4x4 chunks */ 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (y = 0; y < TILE_SIZE; y += 4){ 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (x = 0; x < TILE_SIZE; x += 4) { 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *color[PIPE_MAX_COLOR_BUFS]; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint32_t *depth; 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* color buffer */ 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < scene->fb.nr_cbufs; i++) 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color[i] = lp_rast_get_color_block_pointer(task, i, 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tile_x + x, tile_y + y); 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* depth buffer */ 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = lp_rast_get_depth_block_pointer(task, tile_x + x, tile_y + y); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* run shader on 4x4 block */ 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_JIT_CALL(state, task); 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org variant->jit_function[RAST_WHOLE]( &state->jit_context, 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tile_x + x, tile_y + y, 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inputs->frontfacing, 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_A0(inputs), 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_DADX(inputs), 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_DADY(inputs), 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color, 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth, 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0xffff, 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &task->vis_counter); 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_JIT_CALL(); 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Run the shader on all blocks in a tile. This is used when a tile is 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * completely contained inside a triangle, and the shader is opaque. 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a bin command called during bin processing. 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_shade_tile_opaque(struct lp_rasterizer_task *task, 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union lp_rast_cmd_arg arg) 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_scene *scene = task->scene; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_DBG(DEBUG_RAST, "%s\n", __FUNCTION__); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(task->state); 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!task->state) { 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this will prevent converting the layout from tiled to linear */ 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < scene->fb.nr_cbufs; i++) { 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void)lp_rast_get_color_tile_pointer(task, i, LP_TEX_USAGE_WRITE_ALL); 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_shade_tile(task, arg); 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Compute shading for a 4x4 block of pixels inside a triangle. 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a bin command called during bin processing. 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param x X position of quad in window coords 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param y Y position of quad in window coords 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_shade_quads_mask(struct lp_rasterizer_task *task, 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_rast_shader_inputs *inputs, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned x, unsigned y, 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned mask) 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_rast_state *state = task->state; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_fragment_shader_variant *variant = state->variant; 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_scene *scene = task->scene; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *color[PIPE_MAX_COLOR_BUFS]; 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *depth; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(state); 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Sanity checks */ 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(x < scene->tiles_x * TILE_SIZE); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(y < scene->tiles_y * TILE_SIZE); 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(x % TILE_VECTOR_WIDTH == 0); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(y % TILE_VECTOR_HEIGHT == 0); 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert((x % 4) == 0); 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert((y % 4) == 0); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* color buffer */ 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < scene->fb.nr_cbufs; i++) { 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color[i] = lp_rast_get_color_block_pointer(task, i, x, y); 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(lp_check_alignment(color[i], 16)); 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* depth buffer */ 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = lp_rast_get_depth_block_pointer(task, x, y); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(lp_check_alignment(state->jit_context.blend_color, 16)); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* run shader on 4x4 block */ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org BEGIN_JIT_CALL(state, task); 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org variant->jit_function[RAST_EDGE_TEST](&state->jit_context, 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, y, 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inputs->frontfacing, 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_A0(inputs), 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_DADX(inputs), 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_DADY(inputs), 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org color, 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth, 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mask, 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &task->vis_counter); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org END_JIT_CALL(); 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Begin a new occlusion query. 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a bin command put in all bins. 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called per thread. 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_begin_query(struct lp_rasterizer_task *task, 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union lp_rast_cmd_arg arg) 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct llvmpipe_query *pq = arg.query_obj; 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(task->query == NULL); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->vis_counter = 0; 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->query = pq; 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * End the current occlusion query. 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is a bin command put in all bins. 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called per thread. 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_end_query(struct lp_rasterizer_task *task, 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union lp_rast_cmd_arg arg) 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(task->query); 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (task->query) { 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->query->count[task->thread_index] += task->vis_counter; 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->query = NULL; 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_set_state(struct lp_rasterizer_task *task, 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const union lp_rast_cmd_arg arg) 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->state = arg.state; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set top row and left column of the tile's pixels to white. For debugging. 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgoutline_tile(uint8_t *tile) 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t val = 0xff; 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TILE_SIZE; i++) { 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, i, 0, 0) = val; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, i, 0, 1) = val; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, i, 0, 2) = val; 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, i, 0, 3) = val; 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, 0, i, 0) = val; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, 0, i, 1) = val; 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, 0, i, 2) = val; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, 0, i, 3) = val; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Draw grid of gray lines at 16-pixel intervals across the tile to 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * show the sub-tile boundaries. For debugging. 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgoutline_subtiles(uint8_t *tile) 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint8_t val = 0x80; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const unsigned step = 16; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, j; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < TILE_SIZE; i += step) { 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < TILE_SIZE; j++) { 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, i, j, 0) = val; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, i, j, 1) = val; 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, i, j, 2) = val; 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, i, j, 3) = val; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, j, i, 0) = val; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, j, i, 1) = val; 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, j, i, 2) = val; 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org TILE_PIXEL(tile, j, i, 3) = val; 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org outline_tile(tile); 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called when we're done writing to a color tile. 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_tile_end(struct lp_rasterizer_task *task) 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (LP_DEBUG & (DEBUG_SHOW_SUBTILES | DEBUG_SHOW_TILES)) { 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct lp_scene *scene = task->scene; 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned buf; 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (buf = 0; buf < scene->fb.nr_cbufs; buf++) { 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint8_t *color = lp_rast_get_color_block_pointer(task, buf, 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->x, task->y); 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (LP_DEBUG & DEBUG_SHOW_SUBTILES) 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org outline_subtiles(color); 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (LP_DEBUG & DEBUG_SHOW_TILES) 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org outline_tile(color); 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) outline_subtiles; 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_store_linear_color(task); 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (task->query) { 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org union lp_rast_cmd_arg dummy = {0}; 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_end_query(task, dummy); 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* debug */ 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(task->color_tiles, 0, sizeof(task->color_tiles)); 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->depth_tile = NULL; 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->bin = NULL; 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic lp_rast_cmd_func dispatch[LP_RAST_OP_MAX] = 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_clear_color, 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_clear_zstencil, 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_1, 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_2, 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_3, 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_4, 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_5, 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_6, 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_7, 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_8, 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_3_4, 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_3_16, 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_triangle_4_16, 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_shade_tile, 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_shade_tile_opaque, 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_begin_query, 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_end_query, 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_set_state, 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdo_rasterize_bin(struct lp_rasterizer_task *task, 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct cmd_bin *bin) 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct cmd_block *block; 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned k; 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (0) 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_debug_bin(bin); 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (block = bin->head; block; block = block->next) { 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 0; k < block->count; k++) { 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dispatch[block->cmd[k]]( task, block->arg[k] ); 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Rasterize commands for a single bin. 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param x, y position of the bin's tile in the framebuffer 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Must be called between lp_rast_begin() and lp_rast_end(). 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called per thread. 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgrasterize_bin(struct lp_rasterizer_task *task, 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct cmd_bin *bin ) 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_tile_begin( task, bin ); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do_rasterize_bin(task, bin); 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_tile_end(task); 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Debug/Perf flags: 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bin->head->count == 1) { 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (bin->head->cmd[0] == LP_RAST_OP_SHADE_TILE_OPAQUE) 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_COUNT(nr_pure_shade_opaque_64); 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (bin->head->cmd[0] == LP_RAST_OP_SHADE_TILE) 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_COUNT(nr_pure_shade_64); 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* An empty bin is one that just loads the contents of the tile and 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * stores them again unchanged. This typically happens when bins have 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * been flushed for some reason in the middle of a frame, or when 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * incremental updates are being made to a render target. 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Try to avoid doing pointless work in this case. 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgis_empty_bin( const struct cmd_bin *bin ) 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return bin->head == NULL; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Rasterize/execute all bins within a scene. 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called per thread. 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgrasterize_scene(struct lp_rasterizer_task *task, 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_scene *scene) 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->scene = scene; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!task->rast->no_rast) { 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* loop over scene bins, rasterize each */ 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i, j; 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < scene->tiles_x; i++) { 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < scene->tiles_y; j++) { 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cmd_bin *bin = lp_scene_get_bin(scene, i, j); 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rasterize_bin(task, bin, i, j); 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cmd_bin *bin; 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(scene); 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while ((bin = lp_scene_bin_iter_next(scene))) { 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!is_empty_bin( bin )) 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rasterize_bin(task, bin); 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (scene->fence) { 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_fence_signal(scene->fence); 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->scene = NULL; 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by setup module when it has something for us to render. 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_queue_scene( struct lp_rasterizer *rast, 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_scene *scene) 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_DBG(DEBUG_SETUP, "%s\n", __FUNCTION__); 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rast->num_threads == 0) { 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no threading */ 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_begin( rast, scene ); 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rasterize_scene( &rast->tasks[0], scene ); 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_end( rast ); 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast->curr_scene = NULL; 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* threaded rendering! */ 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_scene_enqueue( rast->full_scenes, scene ); 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* signal the threads that there's work to do */ 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < rast->num_threads; i++) { 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_semaphore_signal(&rast->tasks[i].work_ready); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LP_DBG(DEBUG_SETUP, "%s done \n", __FUNCTION__); 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_finish( struct lp_rasterizer *rast ) 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rast->num_threads == 0) { 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* nothing to do */ 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* wait for work to complete */ 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < rast->num_threads; i++) { 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_semaphore_wait(&rast->tasks[i].work_done); 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the thread's main entrypoint. 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It's a simple loop: 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1. wait for work 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2. do work 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3. signal that we're done 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic PIPE_THREAD_ROUTINE( thread_function, init_data ) 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_rasterizer_task *task = (struct lp_rasterizer_task *) init_data; 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_rasterizer *rast = task->rast; 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org boolean debug = false; 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (1) { 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* wait for work */ 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (debug) 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("thread %d waiting for work\n", task->thread_index); 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_semaphore_wait(&task->work_ready); 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (rast->exit_flag) 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (task->thread_index == 0) { 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* thread[0]: 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - get next scene to rasterize 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * - map the framebuffer surfaces 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_begin( rast, 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_scene_dequeue( rast->full_scenes, TRUE ) ); 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Wait for all threads to get here so that threads[1+] don't 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * get a null rast->curr_scene pointer. 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_barrier_wait( &rast->barrier ); 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* do work */ 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (debug) 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("thread %d doing work\n", task->thread_index); 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rasterize_scene(task, 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast->curr_scene); 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* wait for all threads to finish with this scene */ 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_barrier_wait( &rast->barrier ); 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: shouldn't be necessary: 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (task->thread_index == 0) { 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_rast_end( rast ); 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* signal done with work */ 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (debug) 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("thread %d done working\n", task->thread_index); 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_semaphore_signal(&task->work_done); 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize semaphores and spawn the threads. 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcreate_rast_threads(struct lp_rasterizer *rast) 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* NOTE: if num_threads is zero, we won't use any threads */ 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < rast->num_threads; i++) { 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_semaphore_init(&rast->tasks[i].work_ready, 0); 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_semaphore_init(&rast->tasks[i].work_done, 0); 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast->threads[i] = pipe_thread_create(thread_function, 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void *) &rast->tasks[i]); 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Create new lp_rasterizer. If num_threads is zero, don't create any 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * new threads, do rendering synchronously. 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param num_threads number of rasterizer threads to create 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct lp_rasterizer * 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_create( unsigned num_threads ) 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_rasterizer *rast; 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast = CALLOC_STRUCT(lp_rasterizer); 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rast) { 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto no_rast; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast->full_scenes = lp_scene_queue_create(); 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!rast->full_scenes) { 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto no_full_scenes; 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < Elements(rast->tasks); i++) { 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct lp_rasterizer_task *task = &rast->tasks[i]; 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->rast = rast; 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org task->thread_index = i; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast->num_threads = num_threads; 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast->no_rast = debug_get_bool_option("LP_NO_RAST", FALSE); 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org create_rast_threads(rast); 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* for synchronizing rasterization threads */ 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_barrier_init( &rast->barrier, rast->num_threads ); 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(lp_swizzled_cbuf, 0, sizeof lp_swizzled_cbuf); 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(lp_dummy_tile, 0, sizeof lp_dummy_tile); 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rast; 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgno_full_scenes: 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(rast); 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgno_rast: 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Shutdown: 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid lp_rast_destroy( struct lp_rasterizer *rast ) 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned i; 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set exit_flag and signal each thread's work_ready semaphore. 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Each thread will be woken up, notice that the exit_flag is set and 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * break out of its main loop. The thread will then exit. 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rast->exit_flag = TRUE; 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < rast->num_threads; i++) { 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_semaphore_signal(&rast->tasks[i].work_ready); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Wait for threads to terminate before cleaning up per-thread data */ 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < rast->num_threads; i++) { 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_thread_wait(rast->threads[i]); 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Clean up per-thread data */ 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < rast->num_threads; i++) { 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_semaphore_destroy(&rast->tasks[i].work_ready); 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_semaphore_destroy(&rast->tasks[i].work_done); 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* for synchronizing rasterization threads */ 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_barrier_destroy( &rast->barrier ); 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org lp_scene_queue_destroy(rast->full_scenes); 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(rast); 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Return number of rasterization threads */ 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgunsigned 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglp_rast_get_num_threads( struct lp_rasterizer *rast ) 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return rast->num_threads; 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 967