lp_setup.c revision 402c189af7e95be99ba2e5fd71a71987ffd73c2f
1946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**************************************************************************
2946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
3946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * All Rights Reserved.
5946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
6946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * copy of this software and associated documentation files (the
8946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * "Software"), to deal in the Software without restriction, including
9946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * the following conditions:
13946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
14946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * The above copyright notice and this permission notice (including the
15946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * next paragraph) shall be included in all copies or substantial portions
16946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * of the Software.
17946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
18946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
26946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca **************************************************************************/
27946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
28946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
29931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Tiling engine.
30946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca *
31931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Builds per-tile display lists and executes them on calls to
32931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * lp_setup_flush().
33946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
34946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
35d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "pipe/p_defines.h"
36d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "pipe/p_inlines.h"
37946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_math.h"
38946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca#include "util/u_memory.h"
39253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell#include "util/u_pack_color.h"
40d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_state.h"
41d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_buffer.h"
42d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_texture.h"
43d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca#include "lp_setup_context.h"
44253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
45402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell#define SETUP_DEBUG debug_printf
46402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
47253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void set_state( struct setup_context *, unsigned );
48946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
49931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_cmd_block( struct cmd_block_list *list )
50931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
51931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   struct cmd_block *block = MALLOC_STRUCT(cmd_block);
52931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail->next = block;
53931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail = block;
54931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->next = NULL;
55931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->count = 0;
56931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
57946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
58931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_data_block( struct data_block_list *list )
59931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
60931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   struct data_block *block = MALLOC_STRUCT(data_block);
61931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail->next = block;
62931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail = block;
63931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->next = NULL;
64931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->used = 0;
65931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
66946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
67253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
68253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
69253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_triangle( struct setup_context *setup,
70253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v0)[4],
71253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v1)[4],
72253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v2)[4])
73253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
74253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   set_state( setup, SETUP_ACTIVE );
75253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_triangle( setup );
76253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->triangle( setup, v0, v1, v2 );
77253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
78253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
79253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
80253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_line( struct setup_context *setup,
81253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	    const float (*v0)[4],
82253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	    const float (*v1)[4])
83253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
84253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   set_state( setup, SETUP_ACTIVE );
85253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_line( setup );
86253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->line( setup, v0, v1 );
87253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
88253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
89253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
90253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_point( struct setup_context *setup,
91253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	     const float (*v0)[4])
92253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
93253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   set_state( setup, SETUP_ACTIVE );
94253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_point( setup );
95253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->point( setup, v0 );
96253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
97253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
98931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void reset_context( struct setup_context *setup )
99931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
1001caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   unsigned i, j;
1011caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell
102402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
103402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
1040718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Free binner command lists:
1050718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
106931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   for (i = 0; i < setup->tiles_x; i++) {
107931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      for (j = 0; j < setup->tiles_y; j++) {
1081caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         struct cmd_block_list *list = &setup->tile[i][j];
109931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         struct cmd_block *block;
110931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         struct cmd_block *tmp;
111931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1121caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         for (block = list->head; block != list->tail; block = tmp) {
113931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell            tmp = block->next;
114931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell            FREE(block);
115931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         }
116931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1171caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         list->head = list->tail;
118931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
119931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
120e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
1210718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Free binned data:
1220718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
123931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   {
1241caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      struct data_block_list *list = &setup->data;
125931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      struct data_block *block, *tmp;
126931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1271caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      for (block = list->head; block != list->tail; block = tmp) {
128931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         tmp = block->next;
129931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         FREE(block);
130931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
131931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1321caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      list->head = list->tail;
133931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
1340718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
1350718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Reset some state:
1360718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
1370718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   setup->clear.flags = 0;
138253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
139253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   /* Have an explicit "start-binning" call and get rid of this
140253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell    * pointer twiddling?
141253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell    */
142253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->line = first_line;
143253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->point = first_point;
144253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->triangle = first_triangle;
145931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
146931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
147931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
148931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
149931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
150931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Add a command to all active bins.
151931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */
152931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void bin_everywhere( struct setup_context *setup,
1531caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell                            lp_rast_cmd cmd,
1544cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                            const union lp_rast_cmd_arg arg )
155e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{
156931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   unsigned i, j;
157931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   for (i = 0; i < setup->tiles_x; i++)
158931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      for (j = 0; j < setup->tiles_y; j++)
159415b271b5100d64579690111bc8eb549866865a7Keith Whitwell         bin_command( &setup->tile[i][j], cmd, arg );
160e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell}
161e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
162931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
163931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
164931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellrasterize_bins( struct setup_context *setup,
165931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                boolean write_depth )
166e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{
1671caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   struct lp_rasterizer *rast = setup->rast;
1681caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   struct cmd_block *block;
1691caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   unsigned i,j,k;
1701caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell
171402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
172402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
17384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   lp_rast_begin( rast,
174e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell                  setup->fb.cbuf,
175e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell                  setup->fb.zsbuf,
176e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell                  setup->fb.cbuf != NULL,
177e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell                  setup->fb.zsbuf != NULL && write_depth,
17884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                  setup->fb.width,
17984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                  setup->fb.height );
18084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell
181931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
182931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1831caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   for (i = 0; i < setup->tiles_x; i++) {
1841caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      for (j = 0; j < setup->tiles_y; j++) {
185931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
186931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         lp_rast_start_tile( rast,
187931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                             i * TILESIZE,
188931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                             j * TILESIZE );
189931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1901caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         for (block = setup->tile[i][j].head; block; block = block->next) {
1911caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell            for (k = 0; k < block->count; k++) {
1921caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell               block->cmd[k]( rast, block->arg[k] );
193931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell            }
194931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         }
195931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1960718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell         lp_rast_end_tile( rast );
197931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
198931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
199931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
200e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell   lp_rast_end( rast );
201e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell
2021caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   reset_context( setup );
203e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell}
204e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
205931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
206931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
207931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
208931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellbegin_binning( struct setup_context *setup )
209e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{
210402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
211402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
21284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   if (!setup->fb.cbuf && !setup->fb.zsbuf) {
21384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.width = 0;
21484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.height = 0;
21584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   }
21684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   else if (!setup->fb.zsbuf) {
21784ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.width = setup->fb.cbuf->width;
21884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.height = setup->fb.cbuf->height;
21984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   }
22084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   else if (!setup->fb.cbuf) {
22184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.width = setup->fb.zsbuf->width;
22284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.height = setup->fb.zsbuf->height;
22384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   }
22484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   else {
22584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      /* XXX: not sure what we're really supposed to do for
22684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell       * mis-matched color & depth buffer sizes.
22784ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell       */
22884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.width = MIN2(setup->fb.cbuf->width,
22984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                             setup->fb.zsbuf->width);
23084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.height = MIN2(setup->fb.cbuf->height,
23184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                              setup->fb.zsbuf->height);
23284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   }
23384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell
234b0475a4b0d1eaa1179bc399301ed46b0b8e63497Keith Whitwell   setup->tiles_x = align(setup->fb.width, TILESIZE) / TILESIZE;
235b0475a4b0d1eaa1179bc399301ed46b0b8e63497Keith Whitwell   setup->tiles_y = align(setup->fb.height, TILESIZE) / TILESIZE;
23684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell
237253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   if (setup->fb.cbuf) {
2380718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (setup->clear.flags & PIPE_CLEAR_COLOR)
239931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         bin_everywhere( setup,
240931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                         lp_rast_clear_color,
2414cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         setup->clear.color );
242931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      else
2434cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell         bin_everywhere( setup, lp_rast_load_color, lp_rast_arg_null() );
244931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
245931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
246253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   if (setup->fb.zsbuf) {
2470718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL)
248931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         bin_everywhere( setup,
249931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                         lp_rast_clear_zstencil,
2504cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         setup->clear.zstencil );
251931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      else
2524cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell         bin_everywhere( setup, lp_rast_load_zstencil, lp_rast_arg_null() );
253931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
254e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell}
255e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
256e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
257931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen
258931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears.
259931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell *
260931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles.
261946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
262931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
263931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellexecute_clears( struct setup_context *setup )
264946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
265402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
266402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
267931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   begin_binning( setup );
2680718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   rasterize_bins( setup, TRUE );
269946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
270946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
271931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
272931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
273931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellset_state( struct setup_context *setup,
274931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell           unsigned new_state )
275931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
276931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   unsigned old_state = setup->state;
277931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
278931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (old_state == new_state)
279931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      return;
280931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
281402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s old %d new %d\n", __FUNCTION__, old_state, new_state);
282402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
283931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   switch (new_state) {
284931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_ACTIVE:
285402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell      begin_binning( setup );
286931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
287931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
288931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_CLEARED:
289931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      if (old_state == SETUP_ACTIVE) {
290931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         assert(0);
291931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         return;
292931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
293931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
294931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
295931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_FLUSHED:
2960718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (old_state == SETUP_CLEARED)
297931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         execute_clears( setup );
298931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      else
2990718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell         rasterize_bins( setup, TRUE );
300931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
301931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
302931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
303931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->state = new_state;
304931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
305931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
306931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
307946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid
308931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_flush( struct setup_context *setup,
309931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                unsigned flags )
310946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
311402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
312402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
313931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   set_state( setup, SETUP_FLUSHED );
314946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
315946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
316946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
317931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
318931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_bind_framebuffer( struct setup_context *setup,
319931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                           struct pipe_surface *color,
320931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                           struct pipe_surface *zstencil )
321946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
322402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
323402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
324931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   set_state( setup, SETUP_FLUSHED );
325931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
326253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   pipe_surface_reference( &setup->fb.cbuf, color );
327253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   pipe_surface_reference( &setup->fb.zsbuf, zstencil );
328931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
329931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
330931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
331931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_clear( struct setup_context *setup,
332253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float *color,
333253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                double depth,
334253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                unsigned stencil,
335931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                unsigned flags )
336931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
337659609e0ae27071a601794935c85547e315dedebJosé Fonseca   unsigned i;
338659609e0ae27071a601794935c85547e315dedebJosé Fonseca
339402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s state %d\n", __FUNCTION__, setup->state);
340402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
341402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
3424cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell   if (flags & PIPE_CLEAR_COLOR) {
343659609e0ae27071a601794935c85547e315dedebJosé Fonseca      for (i = 0; i < 4; ++i)
344659609e0ae27071a601794935c85547e315dedebJosé Fonseca         setup->clear.color.clear_color[i] = float_to_ubyte(color[i]);
3454cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell   }
3464cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell
3474cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell   if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
3484cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell      setup->clear.zstencil.clear_zstencil =
3494cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell         util_pack_z_stencil(setup->fb.zsbuf->format,
3504cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                             depth,
3514cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                             stencil);
3524cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell   }
3534cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell
354931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (setup->state == SETUP_ACTIVE) {
355253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell      /* Add the clear to existing bins.  In the unusual case where
356253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * both color and depth-stencilare being cleared, we could
357253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * discard the currently binned scene and start again, but I
358253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * don't see that as being a common usage.
359253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       */
3604cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell      if (flags & PIPE_CLEAR_COLOR)
3614cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell         bin_everywhere( setup,
3624cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         lp_rast_clear_color,
3634cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         setup->clear.color );
364253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
3654cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell      if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL)
3664cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell         bin_everywhere( setup,
3674cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         lp_rast_clear_zstencil,
3684cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         setup->clear.zstencil );
369946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
370946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   else {
371253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell      /* Put ourselves into the 'pre-clear' state, specifically to try
372253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * and accumulate multiple clears to color and depth_stencil
373253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * buffers which the app or state-tracker might issue
374253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * separately.
375253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       */
376931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      set_state( setup, SETUP_CLEARED );
3770718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
378931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      setup->clear.flags |= flags;
379946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
380931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
381931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
382931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
383415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
384415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid
385e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwelllp_setup_set_triangle_state( struct setup_context *setup,
386e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell                             unsigned cull_mode,
387e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell                             boolean ccw_is_frontface)
388415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{
389402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
390402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
391415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->ccw_is_frontface = ccw_is_frontface;
392415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->cullmode = cull_mode;
393415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->triangle = first_triangle;
394415b271b5100d64579690111bc8eb549866865a7Keith Whitwell}
395415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
396415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
397415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
398931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
399931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_set_fs_inputs( struct setup_context *setup,
400253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                        const struct lp_shader_input *input,
401931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                        unsigned nr )
402931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
403402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
404402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
405253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   memcpy( setup->fs.input, input, nr * sizeof input[0] );
406253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->fs.nr_inputs = nr;
407931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
40889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell
4090718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid
410d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_fs( struct setup_context *setup,
411d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                 struct lp_fragment_shader *fs )
4120718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell{
413402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
414d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   /* FIXME: reference count */
415d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
416d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   setup->fs.jit_function = fs->current->jit_function;
4170718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell}
4180718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
419d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
420d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_fs_constants(struct setup_context *setup,
421d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                          struct pipe_buffer *buffer)
422d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
423d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   const void *data = buffer ? llvmpipe_buffer(buffer)->data : NULL;
424d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   struct pipe_buffer *dummy;
425931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
426402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
427402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
428d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   /* FIXME: hold on to the reference */
429d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   dummy = NULL;
430d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   pipe_buffer_reference(&dummy, buffer);
431931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
432d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   setup->fs.jit_context.constants = data;
433d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
434d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   setup->fs.jit_context_dirty = TRUE;
435d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
436d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
437d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
438d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
439d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_alpha_ref_value( struct setup_context *setup,
440d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                              float alpha_ref_value )
441d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
442402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
443402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
444d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   if(setup->fs.jit_context.alpha_ref_value != alpha_ref_value) {
445d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      setup->fs.jit_context.alpha_ref_value = alpha_ref_value;
446d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      setup->fs.jit_context_dirty = TRUE;
447d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
448d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
449d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
450d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
451d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_blend_color( struct setup_context *setup,
452d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                          const struct pipe_blend_color *blend_color )
453d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
454d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   unsigned i, j;
455d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
456402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
457402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
458d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   if(!setup->fs.jit_context.blend_color)
459d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      setup->fs.jit_context.blend_color = align_malloc(4 * 16, 16);
460d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
461d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   for (i = 0; i < 4; ++i) {
462d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      uint8_t c = float_to_ubyte(blend_color->color[i]);
463d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      for (j = 0; j < 16; ++j)
464d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         setup->fs.jit_context.blend_color[i*4 + j] = c;
465d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
466d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
467d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   setup->fs.jit_context_dirty = TRUE;
468d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
469d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
470d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
471d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_sampler_textures( struct setup_context *setup,
472d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                               unsigned num, struct pipe_texture **texture)
473d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
474d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   struct pipe_texture *dummy;
475d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   unsigned i;
476d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
477402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
478402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
479402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
480d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   assert(num <= PIPE_MAX_SAMPLERS);
481d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
482d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
483d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      struct pipe_texture *tex = i < num ? texture[i] : NULL;
484d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
485d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      /* FIXME: hold on to the reference */
486d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      dummy = NULL;
487d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      pipe_texture_reference(&dummy, tex);
488d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
489d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      if(tex) {
490d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         struct llvmpipe_texture *lp_tex = llvmpipe_texture(tex);
491d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         struct lp_jit_texture *jit_tex = &setup->fs.jit_context.textures[i];
492d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         jit_tex->width = tex->width[0];
493d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         jit_tex->height = tex->height[0];
494d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         jit_tex->stride = lp_tex->stride[0];
495d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         if(!lp_tex->dt)
496d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca            jit_tex->data = lp_tex->data;
497d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         else
498d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca            /* FIXME: map the rendertarget */
499d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca            assert(0);
500d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      }
501d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
502d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
503d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   setup->fs.jit_context_dirty = TRUE;
504d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
505d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
506c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonsecaboolean
507c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonsecalp_setup_is_texture_referenced( struct setup_context *setup,
508c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca                                const struct pipe_texture *texture )
509c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca{
510c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca   /* FIXME */
511c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca   return PIPE_UNREFERENCED;
512c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca}
513c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca
514c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca
515608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonsecastatic INLINE void
516608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonsecalp_setup_update_shader_state( struct setup_context *setup )
517608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca{
518402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
519608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca
520608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca   if(setup->fs.jit_context_dirty) {
521608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca      if(!setup->fs.last_jc ||
522608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca         memcmp(setup->fs.last_jc, &setup->fs.jit_context, sizeof *setup->fs.last_jc)) {
523608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca         struct lp_jit_context *jc;
524608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca
525608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca         jc = get_data(&setup->data, sizeof *jc);
526608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca         if(jc) {
527608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca            memcpy(jc, &setup->fs.jit_context, sizeof *jc);
528608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca            setup->fs.last_jc = jc;
529608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca         }
530608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca      }
531608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca
532608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca      setup->fs.jit_context_dirty = FALSE;
533608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca   }
534608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca
535608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca   assert(setup->fs.last_jc);
536608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca}
537608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca
538608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca
539931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Stubs for lines & points for now:
540931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */
541931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
542931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_point(struct setup_context *setup,
543931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell		     const float (*v0)[4])
544931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
545608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca   lp_setup_update_shader_state(setup);
546931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->point( setup, v0 );
547946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
548946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
549931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
550931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_line(struct setup_context *setup,
551931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell		    const float (*v0)[4],
552931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell		    const float (*v1)[4])
553931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
554608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca   lp_setup_update_shader_state(setup);
555931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->line( setup, v0, v1 );
556931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
557931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
558931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
5590718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwelllp_setup_tri(struct setup_context *setup,
5600718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell             const float (*v0)[4],
5610718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell             const float (*v1)[4],
5620718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell             const float (*v2)[4])
563931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
564402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell   SETUP_DEBUG("%s\n", __FUNCTION__);
565402c189af7e95be99ba2e5fd71a71987ffd73c2fKeith Whitwell
566608c22272327d3b554c7665b60f6322716e5fd9dJosé Fonseca   lp_setup_update_shader_state(setup);
567931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->triangle( setup, v0, v1, v2 );
568931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
569946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
570946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
571253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid
572253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwelllp_setup_destroy( struct setup_context *setup )
573946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
574415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   unsigned i, j;
575415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
576415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   reset_context( setup );
577415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
578415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   for (i = 0; i < TILES_X; i++)
579415b271b5100d64579690111bc8eb549866865a7Keith Whitwell      for (j = 0; j < TILES_Y; j++)
580415b271b5100d64579690111bc8eb549866865a7Keith Whitwell         FREE(setup->tile[i][j].head);
581415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
582931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   lp_rast_destroy( setup->rast );
58389498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell   FREE( setup );
584946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
585946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
586946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
587946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
588931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Create a new primitive tiling engine.  Currently also creates a
589931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * rasterizer to use with it.
590946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
591253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstruct setup_context *
592e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwelllp_setup_create( struct pipe_screen *screen )
593946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
59489498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell   struct setup_context *setup = CALLOC_STRUCT(setup_context);
595253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   unsigned i, j;
596946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
597e0e2008f1dcd73a59a184e0ef4c1dd77ac2a1cbfKeith Whitwell   setup->rast = lp_rast_create( screen );
598931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (!setup->rast)
599931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      goto fail;
600931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
601931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   for (i = 0; i < TILES_X; i++)
602931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      for (j = 0; j < TILES_Y; j++)
603253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell         setup->tile[i][j].head =
604253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell            setup->tile[i][j].tail = CALLOC_STRUCT(cmd_block);
605946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
606082b3b0a895615a60a7eae40fea14bf231960dbaKeith Whitwell   setup->data.head =
607082b3b0a895615a60a7eae40fea14bf231960dbaKeith Whitwell      setup->data.tail = CALLOC_STRUCT(data_block);
608082b3b0a895615a60a7eae40fea14bf231960dbaKeith Whitwell
609163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->triangle = first_triangle;
610163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->line     = first_line;
611163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell   setup->point    = first_point;
612163a31952c903034c8a70213b344e1b2ef287270Keith Whitwell
613946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   return setup;
614931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
615931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfail:
616931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   FREE(setup);
617931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   return NULL;
618946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
619946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
620