1d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul/************************************************************************** 2d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * 3d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * Copyright 2009 VMware, Inc. 4d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * All Rights Reserved. 5d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * 6d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 7d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * copy of this software and associated documentation files (the 8d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * "Software"), to deal in the Software without restriction, including 9d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * without limitation the rights to use, copy, modify, merge, publish, 10d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * distribute, sub license, and/or sell copies of the Software, and to 11d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * permit persons to whom the Software is furnished to do so, subject to 12d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * the following conditions: 13d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * 14d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * The above copyright notice and this permission notice (including the 15d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * next paragraph) shall be included in all copies or substantial portions 16d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * of the Software. 17d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * 18d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 22d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * 26d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul **************************************************************************/ 27d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 28d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 29d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul/** 30d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * Binner data structures and bin-related functions. 31663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell * Note: the "setup" code is concerned with building scenes while 32663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell * The "rast" code is concerned with consuming/executing scenes. 33d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul */ 34d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 35663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#ifndef LP_SCENE_H 36663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell#define LP_SCENE_H 37d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 38a1af8eec66c5f7ec421e8011b41c1a7c36319f9fJosé Fonseca#include "os/os_thread.h" 3901b1900084152dbacd4025a31ced25f75666ce59Brian Paul#include "lp_tile_soa.h" 40d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul#include "lp_rast.h" 41bc759cd37e7d51977bcda46dde61d118e4c372e0Keith Whitwell#include "lp_debug.h" 42d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 435fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwellstruct lp_scene_queue; 444195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwellstruct lp_rast_state; 45d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 4601b1900084152dbacd4025a31ced25f75666ce59Brian Paul/* We're limited to 2K by 2K for 32bit fixed point rasterization. 4701b1900084152dbacd4025a31ced25f75666ce59Brian Paul * Will need a 64-bit version for larger framebuffers. 4801b1900084152dbacd4025a31ced25f75666ce59Brian Paul */ 494a72ec49f671015cd556ca2efbe5327f8e02fb28Brian Paul#define TILES_X (LP_MAX_WIDTH / TILE_SIZE) 504a72ec49f671015cd556ca2efbe5327f8e02fb28Brian Paul#define TILES_Y (LP_MAX_HEIGHT / TILE_SIZE) 5101b1900084152dbacd4025a31ced25f75666ce59Brian Paul 5201b1900084152dbacd4025a31ced25f75666ce59Brian Paul 53afd328afa8fdad58d22c214c01bcbf82614801c5Keith Whitwell#define CMD_BLOCK_MAX 128 544b99b9f5ff8e55252be7cd6dcc2e9fda24561ea3Keith Whitwell#define DATA_BLOCK_SIZE (64 * 1024) 556419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 566419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell/* Scene temporary storage is clamped to this size: 576419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 58b7a54b3dc6879fbcd0a1226fa6891eddd14baa36Keith Whitwell#define LP_SCENE_MAX_SIZE (4*1024*1024) 596419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 606419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell/* The maximum amount of texture storage referenced by a scene is 616419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * clamped ot this size: 626419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 636419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell#define LP_SCENE_MAX_RESOURCE_SIZE (64*1024*1024) 64d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 65d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 66d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul/* switch to a non-pointer value for this: 67d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul */ 689f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelltypedef void (*lp_rast_cmd_func)( struct lp_rasterizer_task *, 699f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell const union lp_rast_cmd_arg ); 70d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 719f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 72d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paulstruct cmd_block { 739f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell uint8_t cmd[CMD_BLOCK_MAX]; 74d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul union lp_rast_cmd_arg arg[CMD_BLOCK_MAX]; 75d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul unsigned count; 76d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul struct cmd_block *next; 77d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul}; 78d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 796419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstruct cmd_block_list { 806419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell struct cmd_block *head; 816419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell struct cmd_block *tail; 826419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell}; 836419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 84d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paulstruct data_block { 85d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul ubyte data[DATA_BLOCK_SIZE]; 86d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul unsigned used; 87d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul struct data_block *next; 88d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul}; 89d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 906419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 91d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 92d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul/** 93d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * For each screen tile we have one of these bins. 94d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul */ 95d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paulstruct cmd_bin { 969f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell ushort x; 979f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell ushort y; 984195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell const struct lp_rast_state *last_state; /* most recent state set in bin */ 999f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct cmd_block *head; 1009f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct cmd_block *tail; 101d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul}; 102d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 103d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 104d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul/** 1056419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * This stores bulk data which is used for all memory allocations 1066419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * within a scene. 1076419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * 108d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * Examples include triangle data and state data. The commands in 109d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * the per-tile bins will point to chunks of data in this structure. 1109f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell * 1119f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell * Include the first block of data statically to ensure we can always 1129f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell * initiate a scene without relying on malloc succeeding. 113d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul */ 114d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paulstruct data_block_list { 1159f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct data_block first; 116d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul struct data_block *head; 117592e40aa7bdbda5a09becb898300393d599c033aBrian Paul}; 118592e40aa7bdbda5a09becb898300393d599c033aBrian Paul 1196419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstruct resource_ref; 120592e40aa7bdbda5a09becb898300393d599c033aBrian Paul 12101b1900084152dbacd4025a31ced25f75666ce59Brian Paul/** 12201b1900084152dbacd4025a31ced25f75666ce59Brian Paul * All bins and bin data are contained here. 12301b1900084152dbacd4025a31ced25f75666ce59Brian Paul * Per-bin data goes into the 'tile' bins. 124663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell * Shared data goes into the 'data' buffer. 125663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell * 126663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell * When there are multiple threads, will want to double-buffer between 127663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell * scenes: 12801b1900084152dbacd4025a31ced25f75666ce59Brian Paul */ 129663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwellstruct lp_scene { 1305fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell struct pipe_context *pipe; 1313bd9aedbac79eec16bfe6f5fc6f6a021eebe769aKeith Whitwell struct lp_fence *fence; 1325fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell 1339f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell /* Framebuffer mappings - valid only between begin_rasterization() 1349f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell * and end_rasterization(). 1359f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell */ 1369f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct { 1379f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell uint8_t *map; 1389f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell unsigned stride; 1399f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell unsigned blocksize; 1409f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell } zsbuf, cbufs[PIPE_MAX_COLOR_BUFS]; 1419f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 142663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell /** the framebuffer to render the scene into */ 1432bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul struct pipe_framebuffer_state fb; 1442bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul 145f855193796b834e9f06775f8a7130837d1f86f95Brian Paul /** list of resources referenced by the scene commands */ 1466419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell struct resource_ref *resources; 147592e40aa7bdbda5a09becb898300393d599c033aBrian Paul 1486419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell /** Total memory used by the scene (in bytes). This sums all the 1496419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * data blocks and counts all bins, state, resource references and 1506419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * other random allocations within the scene. 151bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul */ 152bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul unsigned scene_size; 153bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul 1546419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell /** Sum of sizes of all resources referenced by the scene. Sums 1556419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell * all the textures read by the scene: 1566419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell */ 1576419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell unsigned resource_reference_size; 1586419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 1596419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell boolean alloc_failed; 1601e17178fc40b6a1a54cb3e93c098bdd0d490b88aRoland Scheidegger boolean has_depthstencil_clear; 1612bce5c195f94e2cce8f67c6a8066b0ae408487ceBrian Paul 1628a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul /** 1638a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul * Number of active tiles in each dimension. 1648a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul * This basically the framebuffer size divided by tile size 1658a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul */ 1668a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul unsigned tiles_x, tiles_y; 167270f15486072b0a2fbea2a21b7a4a9d4c76d4bfbBrian Paul 168270f15486072b0a2fbea2a21b7a4a9d4c76d4bfbBrian Paul int curr_x, curr_y; /**< for iterating over bins */ 169270f15486072b0a2fbea2a21b7a4a9d4c76d4bfbBrian Paul pipe_mutex mutex; 1705fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell 1715fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell struct cmd_bin tile[TILES_X][TILES_Y]; 1725fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell struct data_block_list data; 17301b1900084152dbacd4025a31ced25f75666ce59Brian Paul}; 17401b1900084152dbacd4025a31ced25f75666ce59Brian Paul 17501b1900084152dbacd4025a31ced25f75666ce59Brian Paul 17601b1900084152dbacd4025a31ced25f75666ce59Brian Paul 1779f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellstruct lp_scene *lp_scene_create(struct pipe_context *pipe); 17888e62b33dc5ed4a4ab0c668e627c7e85991c74a1Brian Paul 179663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwellvoid lp_scene_destroy(struct lp_scene *scene); 18088e62b33dc5ed4a4ab0c668e627c7e85991c74a1Brian Paul 181de10168a462f57ead41800ea135476bb5ae8c678Brian Paulboolean lp_scene_is_empty(struct lp_scene *scene ); 1826419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellboolean lp_scene_is_oom(struct lp_scene *scene ); 183de10168a462f57ead41800ea135476bb5ae8c678Brian Paul 1848a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul 1856419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstruct data_block *lp_scene_new_data_block( struct lp_scene *scene ); 186d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 1876419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstruct cmd_block *lp_scene_new_cmd_block( struct lp_scene *scene, 1886419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell struct cmd_bin *bin ); 18988e62b33dc5ed4a4ab0c668e627c7e85991c74a1Brian Paul 1906419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellboolean lp_scene_add_resource_reference(struct lp_scene *scene, 1919f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct pipe_resource *resource, 1929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell boolean initializing_scene); 193592e40aa7bdbda5a09becb898300393d599c033aBrian Paul 194f855193796b834e9f06775f8a7130837d1f86f95Brian Paulboolean lp_scene_is_resource_referenced(const struct lp_scene *scene, 195f855193796b834e9f06775f8a7130837d1f86f95Brian Paul const struct pipe_resource *resource ); 196592e40aa7bdbda5a09becb898300393d599c033aBrian Paul 197d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 198d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul/** 19901b1900084152dbacd4025a31ced25f75666ce59Brian Paul * Allocate space for a command/data in the bin's data buffer. 200d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * Grow the block list if needed. 201d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul */ 202d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paulstatic INLINE void * 203663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwelllp_scene_alloc( struct lp_scene *scene, unsigned size) 204d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul{ 205663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct data_block_list *list = &scene->data; 2066419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell struct data_block *block = list->head; 2070671c6b5891f38347a3186f367913d674d3196c4Brian Paul 2086419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell assert(size <= DATA_BLOCK_SIZE); 2099f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(block != NULL); 2106419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 211bc759cd37e7d51977bcda46dde61d118e4c372e0Keith Whitwell if (LP_DEBUG & DEBUG_MEM) 2124b99b9f5ff8e55252be7cd6dcc2e9fda24561ea3Keith Whitwell debug_printf("alloc %u block %u/%u tot %u/%u\n", 213bc759cd37e7d51977bcda46dde61d118e4c372e0Keith Whitwell size, block->used, DATA_BLOCK_SIZE, 214bc759cd37e7d51977bcda46dde61d118e4c372e0Keith Whitwell scene->scene_size, LP_SCENE_MAX_SIZE); 215bc759cd37e7d51977bcda46dde61d118e4c372e0Keith Whitwell 2169f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (block->used + size > DATA_BLOCK_SIZE) { 2176419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell block = lp_scene_new_data_block( scene ); 2186419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!block) { 2190671c6b5891f38347a3186f367913d674d3196c4Brian Paul /* out of memory */ 2200671c6b5891f38347a3186f367913d674d3196c4Brian Paul return NULL; 2210671c6b5891f38347a3186f367913d674d3196c4Brian Paul } 222d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul } 223d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 224d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul { 2256419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell ubyte *data = block->data + block->used; 2266419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell block->used += size; 227d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul return data; 228d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul } 229d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul} 230d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 231d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 232d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul/** 233d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul * As above, but with specific alignment. 234d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul */ 235d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paulstatic INLINE void * 236663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwelllp_scene_alloc_aligned( struct lp_scene *scene, unsigned size, 237663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell unsigned alignment ) 238d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul{ 239663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct data_block_list *list = &scene->data; 2406419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell struct data_block *block = list->head; 24101b1900084152dbacd4025a31ced25f75666ce59Brian Paul 2429f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell assert(block != NULL); 243bc759cd37e7d51977bcda46dde61d118e4c372e0Keith Whitwell 244bc759cd37e7d51977bcda46dde61d118e4c372e0Keith Whitwell if (LP_DEBUG & DEBUG_MEM) 2454b99b9f5ff8e55252be7cd6dcc2e9fda24561ea3Keith Whitwell debug_printf("alloc %u block %u/%u tot %u/%u\n", 246bc759cd37e7d51977bcda46dde61d118e4c372e0Keith Whitwell size + alignment - 1, 247bc759cd37e7d51977bcda46dde61d118e4c372e0Keith Whitwell block->used, DATA_BLOCK_SIZE, 248bc759cd37e7d51977bcda46dde61d118e4c372e0Keith Whitwell scene->scene_size, LP_SCENE_MAX_SIZE); 2499f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 2509f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell if (block->used + size + alignment - 1 > DATA_BLOCK_SIZE) { 2516419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell block = lp_scene_new_data_block( scene ); 2526419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!block) 2530671c6b5891f38347a3186f367913d674d3196c4Brian Paul return NULL; 254d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul } 255d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 256d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul { 2576419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell ubyte *data = block->data + block->used; 258d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul unsigned offset = (((uintptr_t)data + alignment - 1) & ~(alignment - 1)) - (uintptr_t)data; 2596419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell block->used += offset + size; 260d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul return data + offset; 261d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul } 262d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul} 263d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 264d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 265d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul/* Put back data if we decide not to use it, eg. culled triangles. 266d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul */ 267d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paulstatic INLINE void 268663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwelllp_scene_putback_data( struct lp_scene *scene, unsigned size) 269d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul{ 270663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct data_block_list *list = &scene->data; 2716419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell assert(list->head && list->head->used >= size); 2726419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell list->head->used -= size; 273d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul} 274d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 275d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 27601b1900084152dbacd4025a31ced25f75666ce59Brian Paul/** Return pointer to a particular tile's bin. */ 27701b1900084152dbacd4025a31ced25f75666ce59Brian Paulstatic INLINE struct cmd_bin * 278663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwelllp_scene_get_bin(struct lp_scene *scene, unsigned x, unsigned y) 27901b1900084152dbacd4025a31ced25f75666ce59Brian Paul{ 280663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell return &scene->tile[x][y]; 28101b1900084152dbacd4025a31ced25f75666ce59Brian Paul} 28201b1900084152dbacd4025a31ced25f75666ce59Brian Paul 28301b1900084152dbacd4025a31ced25f75666ce59Brian Paul 284a1acbff299c444913418e65da473745cd901a2dbJosé Fonseca/** Remove all commands from a bin */ 285a1acbff299c444913418e65da473745cd901a2dbJosé Fonsecavoid 286a1acbff299c444913418e65da473745cd901a2dbJosé Fonsecalp_scene_bin_reset(struct lp_scene *scene, unsigned x, unsigned y); 287a1acbff299c444913418e65da473745cd901a2dbJosé Fonseca 28801b1900084152dbacd4025a31ced25f75666ce59Brian Paul 28901b1900084152dbacd4025a31ced25f75666ce59Brian Paul/* Add a command to bin[x][y]. 290d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul */ 2916419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic INLINE boolean 292663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwelllp_scene_bin_command( struct lp_scene *scene, 2939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell unsigned x, unsigned y, 2949f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell unsigned cmd, 2959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell union lp_rast_cmd_arg arg ) 296d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul{ 297663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell struct cmd_bin *bin = lp_scene_get_bin(scene, x, y); 2989f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell struct cmd_block *tail = bin->tail; 299d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 300be29a60f9ec273931ec2cc244619a387de3075a0José Fonseca assert(x < scene->tiles_x); 301be29a60f9ec273931ec2cc244619a387de3075a0José Fonseca assert(y < scene->tiles_y); 3024195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell assert(cmd < LP_RAST_OP_MAX); 303be29a60f9ec273931ec2cc244619a387de3075a0José Fonseca 3046419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (tail == NULL || tail->count == CMD_BLOCK_MAX) { 3056419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell tail = lp_scene_new_cmd_block( scene, bin ); 3060671c6b5891f38347a3186f367913d674d3196c4Brian Paul if (!tail) { 3076419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 3080671c6b5891f38347a3186f367913d674d3196c4Brian Paul } 3095c2f6a3e9ff933444e0d0b2e844702dd91cc2ce2Brian Paul assert(tail->count == 0); 310d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul } 311d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 312d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul { 313d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul unsigned i = tail->count; 3149f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell tail->cmd[i] = cmd & LP_RAST_OP_MASK; 315d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul tail->arg[i] = arg; 316d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul tail->count++; 317d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul } 3186419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell 3196419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return TRUE; 320d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul} 321d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 322d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul 3234195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwellstatic INLINE boolean 3244195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwelllp_scene_bin_cmd_with_state( struct lp_scene *scene, 3254195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell unsigned x, unsigned y, 3264195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell const struct lp_rast_state *state, 3274195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell unsigned cmd, 3284195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell union lp_rast_cmd_arg arg ) 3294195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell{ 3304195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell struct cmd_bin *bin = lp_scene_get_bin(scene, x, y); 3314195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell 3324195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell if (state != bin->last_state) { 3334195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell bin->last_state = state; 3344195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell if (!lp_scene_bin_command(scene, x, y, 3354195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell LP_RAST_OP_SET_STATE, 3364195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell lp_rast_arg_state(state))) 3374195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell return FALSE; 3384195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell } 3394195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell 3404195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell if (!lp_scene_bin_command( scene, x, y, cmd, arg )) 3414195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell return FALSE; 3424195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell 3434195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell return TRUE; 3444195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell} 3454195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell 3464195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell 3478a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul/* Add a command to all active bins. 3488a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul */ 3496419ecd02ce43a2614822e228f306d4db589f317Keith Whitwellstatic INLINE boolean 350663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwelllp_scene_bin_everywhere( struct lp_scene *scene, 3519f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell unsigned cmd, 352663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell const union lp_rast_cmd_arg arg ) 3538a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul{ 3548a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul unsigned i, j; 3556419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell for (i = 0; i < scene->tiles_x; i++) { 3566419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell for (j = 0; j < scene->tiles_y; j++) { 3576419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell if (!lp_scene_bin_command( scene, i, j, cmd, arg )) 3586419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return FALSE; 3596419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 3606419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell } 3618a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul 3626419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell return TRUE; 3636419ecd02ce43a2614822e228f306d4db589f317Keith Whitwell} 3648a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul 3658a23105fa016ec4368f407ca64e7763f110da4e5Brian Paul 3668736ee1e7d45c2a3868d46b2ecba7471518cd9b6Brian Paulstatic INLINE unsigned 367663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwelllp_scene_get_num_bins( const struct lp_scene *scene ) 3688736ee1e7d45c2a3868d46b2ecba7471518cd9b6Brian Paul{ 369663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwell return scene->tiles_x * scene->tiles_y; 3708736ee1e7d45c2a3868d46b2ecba7471518cd9b6Brian Paul} 3718736ee1e7d45c2a3868d46b2ecba7471518cd9b6Brian Paul 3728736ee1e7d45c2a3868d46b2ecba7471518cd9b6Brian Paul 373270f15486072b0a2fbea2a21b7a4a9d4c76d4bfbBrian Paulvoid 374663750d5564a225b4720f7ee8bea93ffb309fc88Keith Whitwelllp_scene_bin_iter_begin( struct lp_scene *scene ); 375270f15486072b0a2fbea2a21b7a4a9d4c76d4bfbBrian Paul 376270f15486072b0a2fbea2a21b7a4a9d4c76d4bfbBrian Paulstruct cmd_bin * 3779f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_scene_bin_iter_next( struct lp_scene *scene ); 378270f15486072b0a2fbea2a21b7a4a9d4c76d4bfbBrian Paul 3790639765b2850739af1678f10fc0c5706d5827776Brian Paul 3805fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell 3819f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell/* Begin/end binning of a scene 3829f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell */ 3835fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwellvoid 3845fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwelllp_scene_begin_binning( struct lp_scene *scene, 3855fe2ce28b6e9fba181c13c6f49b57b3dd68fe88eKeith Whitwell struct pipe_framebuffer_state *fb ); 386270f15486072b0a2fbea2a21b7a4a9d4c76d4bfbBrian Paul 3879f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellvoid 3889f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_scene_end_binning( struct lp_scene *scene ); 3899f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 3909f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 3919f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell/* Begin/end rasterization of a scene 3929f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell */ 3939f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellvoid 3949f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_scene_begin_rasterization(struct lp_scene *scene); 3959f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 3969f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwellvoid 3979f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwelllp_scene_end_rasterization(struct lp_scene *scene ); 3989f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 3999f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 4009f6e8e1d6b8696a3ee96cba01b2466ba7a1a8ef6Keith Whitwell 401bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul 402bb527c0af6c53b335330da1063979f5ac3a19174Brian Paul 403d9dc3d59760a28d54013d3d164f61d85ec807651Brian Paul#endif /* LP_BIN_H */ 404