lp_setup.c revision 0718c7700533a965d7cd06b4f67b82bbae6e66a1
1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**************************************************************************
2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
3946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * All Rights Reserved.
5946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
6946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * copy of this software and associated documentation files (the
8946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * "Software"), to deal in the Software without restriction, including
9946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * the following conditions:
13946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
14946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * The above copyright notice and this permission notice (including the
15946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * next paragraph) shall be included in all copies or substantial portions
16946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * of the Software.
17946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
18946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
26946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca **************************************************************************/
27946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
28946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
29931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Tiling engine.
30946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
31931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Builds per-tile display lists and executes them on calls to
32931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * lp_setup_flush().
33946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
34946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
351caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell#include "lp_setup_context.h"
36946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_math.h"
37946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h"
38946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
39931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_cmd_block( struct cmd_block_list *list )
40931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
41931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   struct cmd_block *block = MALLOC_STRUCT(cmd_block);
42931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail->next = block;
43931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail = block;
44931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->next = NULL;
45931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->count = 0;
46931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
47946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
48931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_data_block( struct data_block_list *list )
49931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
50931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   struct data_block *block = MALLOC_STRUCT(data_block);
51931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail->next = block;
52931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail = block;
53931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->next = NULL;
54931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->used = 0;
55931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
56946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
57931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void reset_context( struct setup_context *setup )
58931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
591caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   unsigned i, j;
601caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell
610718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Free binner command lists:
620718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
63931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   for (i = 0; i < setup->tiles_x; i++) {
64931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      for (j = 0; j < setup->tiles_y; j++) {
651caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         struct cmd_block_list *list = &setup->tile[i][j];
66931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         struct cmd_block *block;
67931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         struct cmd_block *tmp;
68931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
691caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         for (block = list->head; block != list->tail; block = tmp) {
70931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell            tmp = block->next;
71931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell            FREE(block);
72931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         }
73931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
741caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         list->head = list->tail;
75931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
76931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
77e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
780718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Free binned data:
790718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
80931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   {
811caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      struct data_block_list *list = &setup->data;
82931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      struct data_block *block, *tmp;
83931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
841caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      for (block = list->head; block != list->tail; block = tmp) {
85931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         tmp = block->next;
86931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         FREE(block);
87931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
88931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
891caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      list->head = list->tail;
90931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
910718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
920718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Reset some state:
930718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
940718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   setup->clear.flags = 0;
95931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
96931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
97931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
98931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
99931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
100931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Add a command to all active bins.
101931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */
102931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void bin_everywhere( struct setup_context *setup,
1031caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell                            lp_rast_cmd cmd,
104931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                            const union lp_rast_cmd_arg *arg )
105e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{
106931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   unsigned i, j;
107931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   for (i = 0; i < setup->tiles_x; i++)
108931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      for (j = 0; j < setup->tiles_y; j++)
1091caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         bin_cmd( &setup->tile[i][j], cmd, arg );
110e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell}
111e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
112931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
113931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
114931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellrasterize_bins( struct setup_context *setup,
115931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                boolean write_depth )
116e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{
1171caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   struct lp_rasterizer *rast = setup->rast;
1181caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   struct cmd_block *block;
1191caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   unsigned i,j,k;
1201caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell
121931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   lp_rast_bind_color( rast,
1221caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell                       setup->fb.color,
123931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                       TRUE );                    /* WRITE */
124931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
125931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   lp_rast_bind_depth( rast,
1261caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell                       setup->fb.zstencil,
127931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                       write_depth );             /* WRITE */
128931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1291caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   for (i = 0; i < setup->tiles_x; i++) {
1301caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      for (j = 0; j < setup->tiles_y; j++) {
131931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
132931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         lp_rast_start_tile( rast,
133931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                             i * TILESIZE,
134931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                             j * TILESIZE );
135931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1361caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         for (block = setup->tile[i][j].head; block; block = block->next) {
1371caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell            for (k = 0; k < block->count; k++) {
1381caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell               block->cmd[k]( rast, block->arg[k] );
139931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell            }
140931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         }
141931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1420718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell         lp_rast_end_tile( rast );
143931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
144931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
145931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1461caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   reset_context( setup );
147e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell}
148e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
149931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
150931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
151931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
152931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellbegin_binning( struct setup_context *setup )
153e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{
154931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (setup->fb.color) {
1550718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (setup->clear.flags & PIPE_CLEAR_COLOR)
156931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         bin_everywhere( setup,
157931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                         lp_rast_clear_color,
1580718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell                         &setup->clear.color );
159931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      else
160931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         bin_everywhere( setup,
161931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                         lp_rast_load_color,
162931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                         NULL );
163931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
164931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
165931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (setup->fb.zstencil) {
1660718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL)
167931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         bin_everywhere( setup,
168931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                         lp_rast_clear_zstencil,
1690718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell                         &setup->clear.zstencil );
170931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      else
171931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         bin_everywhere( setup,
172931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                         lp_rast_load_zstencil,
173931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                         NULL );
174931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
175e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell}
176e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
177e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
178931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen
179931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears.
180931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell *
181931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles.
182946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
183931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
184931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellexecute_clears( struct setup_context *setup )
185946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
186931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   begin_binning( setup );
1870718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   rasterize_bins( setup, TRUE );
188946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
189946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
190931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
191931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
192931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellset_state( struct setup_context *setup,
193931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell           unsigned new_state )
194931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
195931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   unsigned old_state = setup->state;
196931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
197931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (old_state == new_state)
198931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      return;
199931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
200931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   switch (new_state) {
201931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_ACTIVE:
202931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      if (old_state == SETUP_FLUSHED)
2030718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell         begin_binning( setup );
204931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
205931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
206931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_CLEARED:
207931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      if (old_state == SETUP_ACTIVE) {
208931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         assert(0);
209931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         return;
210931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
211931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
212931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
213931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_FLUSHED:
2140718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (old_state == SETUP_CLEARED)
215931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         execute_clears( setup );
216931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      else
2170718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell         rasterize_bins( setup, TRUE );
218931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
219931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
220931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
221931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->state = new_state;
222931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
223931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
224931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
225946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid
226931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_flush( struct setup_context *setup,
227931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                unsigned flags )
228946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
229931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   set_state( setup, SETUP_FLUSHED );
230946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
231946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
232946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
233931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
234931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_bind_framebuffer( struct setup_context *setup,
235931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                           struct pipe_surface *color,
236931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                           struct pipe_surface *zstencil )
237946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
238931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   unsigned width, height;
239946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
240931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   set_state( setup, SETUP_FLUSHED );
241931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
242931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   pipe_surface_reference( &setup->fb.color, color );
243931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   pipe_surface_reference( &setup->fb.zstencil, zstencil );
244931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
245931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   width = MAX2( color->width, zstencil->width );
246931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   height = MAX2( color->height, zstencil->height );
247931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
248931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->tiles_x = align( width, TILESIZE ) / TILESIZE;
249931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->tiles_y = align( height, TILESIZE ) / TILESIZE;
250931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
251931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
252931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
253931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_clear( struct setup_context *setup,
254931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                const float *clear_color,
255931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                double clear_depth,
256931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                unsigned clear_stencil,
257931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                unsigned flags )
258931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
259931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (setup->state == SETUP_ACTIVE) {
260931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      struct lp_rast_clear_info *clear_info;
261931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
262931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      clear_info = alloc_clear_info( setup );
263946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
264931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      if (flags & PIPE_CLEAR_COLOR) {
265931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         pack_color( setup,
266931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                     clear_info->color,
267931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                     clear_color );
268931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         bin_everywhere(setup, lp_rast_clear_color, clear_info );
269931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
27089498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell
271931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      if (flags & PIPE_CLEAR_DEPTH_STENCIL) {
272931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         pack_depth_stencil( setup,
273931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                             clear_info->depth,
274931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                             clear_depth,
275931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                             clear_stencil );
276931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
277931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         bin_everywhere(setup, lp_rast_clear_zstencil, clear_info );
278931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
279946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
280946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   else {
281931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      set_state( setup, SETUP_CLEARED );
2820718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
283931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      setup->clear.flags |= flags;
284931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
285931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      if (flags & PIPE_CLEAR_COLOR) {
2860718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell         util_pack_color(rgba,
2870718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell                         setup->fb.cbuf->format,
2880718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell                         &setup->clear.color.clear_color );
289931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
290931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
291931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      if (flags & PIPE_CLEAR_DEPTH_STENCIL) {
2920718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell         setup->clear.zstencil.clear_zstencil =
2930718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell            util_pack_z_stencil(setup->fb.zsbuf->format,
2940718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell                                depth,
2950718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell                                stencil);
296931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
297946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
298931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
299931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
300931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
301931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
302931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_set_fs_inputs( struct setup_context *setup,
303931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                        const enum lp_interp *interp,
304931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                        unsigned nr )
305931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
306931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   memcpy( setup->interp, interp, nr * sizeof interp[0] );
307931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
30889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell
3090718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid
3100718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwelllp_setup_set_shader_state( struct setup_context *setup,
3110718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell                           const struct jit_context *jc )
3120718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell{
3130718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell}
3140718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
315931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
316931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
317931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfirst_triangle( struct setup_context *setup,
318931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                const float (*v0)[4],
319931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                const float (*v1)[4],
320931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                const float (*v2)[4])
321931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
322931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   set_state( setup, STATE_ACTIVE );
323931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup_choose_triangle( setup, v0, v1, v2 );
324931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
325931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
326931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
327931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
328931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Stubs for lines & points for now:
329931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */
330931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
331931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_point(struct setup_context *setup,
332931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell		     const float (*v0)[4])
333931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
334931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->point( setup, v0 );
335946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
336946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
337931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
338931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_line(struct setup_context *setup,
339931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell		    const float (*v0)[4],
340931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell		    const float (*v1)[4])
341931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
342931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->line( setup, v0, v1 );
343931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
344931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
345931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
3460718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwelllp_setup_tri(struct setup_context *setup,
3470718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell             const float (*v0)[4],
3480718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell             const float (*v1)[4],
3490718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell             const float (*v2)[4])
350931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
351931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->triangle( setup, v0, v1, v2 );
352931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
353946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
354946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
35589498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwellvoid setup_destroy_context( struct setup_context *setup )
356946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
357931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   lp_rast_destroy( setup->rast );
35889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell   FREE( setup );
359946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
360946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
361946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
362946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
363931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Create a new primitive tiling engine.  Currently also creates a
364931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * rasterizer to use with it.
365946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
366931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstruct setup_context *setup_create_context( void )
367946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
36889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell   struct setup_context *setup = CALLOC_STRUCT(setup_context);
369946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
370931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->rast = lp_rast_create( void );
371931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (!setup->rast)
372931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      goto fail;
373931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
374931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   for (i = 0; i < TILES_X; i++)
375931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      for (j = 0; j < TILES_Y; j++)
376931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         setup->tile[i][j].first =
377931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell            setup->tile[i][j].next = CALLOC_STRUCT(cmd_block);
378946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
379946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   return setup;
380931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
381931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfail:
382931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   FREE(setup);
383931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   return NULL;
384946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
385946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
386