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