lp_setup.c revision b0475a4b0d1eaa1179bc399301ed46b0b8e63497
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
45253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void set_state( struct setup_context *, unsigned );
46946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
47931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_cmd_block( struct cmd_block_list *list )
48931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
49931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   struct cmd_block *block = MALLOC_STRUCT(cmd_block);
50931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail->next = block;
51931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail = block;
52931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->next = NULL;
53931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->count = 0;
54931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
55946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
56931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid lp_setup_new_data_block( struct data_block_list *list )
57931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
58931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   struct data_block *block = MALLOC_STRUCT(data_block);
59931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail->next = block;
60931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   list->tail = block;
61931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->next = NULL;
62931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   block->used = 0;
63931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
64946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
65253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
66253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
67253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_triangle( struct setup_context *setup,
68253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v0)[4],
69253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v1)[4],
70253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float (*v2)[4])
71253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
72253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   set_state( setup, SETUP_ACTIVE );
73253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_triangle( setup );
74253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->triangle( setup, v0, v1, v2 );
75253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
76253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
77253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
78253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_line( struct setup_context *setup,
79253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	    const float (*v0)[4],
80253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	    const float (*v1)[4])
81253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
82253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   set_state( setup, SETUP_ACTIVE );
83253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_line( setup );
84253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->line( setup, v0, v1 );
85253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
86253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
87253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstatic void
88253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellfirst_point( struct setup_context *setup,
89253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell	     const float (*v0)[4])
90253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell{
91253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   set_state( setup, SETUP_ACTIVE );
92253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   lp_setup_choose_point( setup );
93253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->point( setup, v0 );
94253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell}
95253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
96931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void reset_context( struct setup_context *setup )
97931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
981caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   unsigned i, j;
991caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell
1000718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Free binner command lists:
1010718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
102931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   for (i = 0; i < setup->tiles_x; i++) {
103931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      for (j = 0; j < setup->tiles_y; j++) {
1041caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         struct cmd_block_list *list = &setup->tile[i][j];
105931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         struct cmd_block *block;
106931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         struct cmd_block *tmp;
107931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1081caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         for (block = list->head; block != list->tail; block = tmp) {
109931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell            tmp = block->next;
110931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell            FREE(block);
111931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         }
112931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1131caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         list->head = list->tail;
114931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
115931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
116e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
1170718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Free binned data:
1180718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
119931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   {
1201caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      struct data_block_list *list = &setup->data;
121931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      struct data_block *block, *tmp;
122931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1231caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      for (block = list->head; block != list->tail; block = tmp) {
124931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         tmp = block->next;
125931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         FREE(block);
126931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
127931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1281caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      list->head = list->tail;
129931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
1300718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
1310718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   /* Reset some state:
1320718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell    */
1330718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   setup->clear.flags = 0;
134253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
135253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   /* Have an explicit "start-binning" call and get rid of this
136253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell    * pointer twiddling?
137253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell    */
138253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->line = first_line;
139253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->point = first_point;
140253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->triangle = first_triangle;
141931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
142931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
143931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
144931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
145931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
146931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Add a command to all active bins.
147931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */
148931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void bin_everywhere( struct setup_context *setup,
1491caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell                            lp_rast_cmd cmd,
1504cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                            const union lp_rast_cmd_arg arg )
151e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{
152931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   unsigned i, j;
153931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   for (i = 0; i < setup->tiles_x; i++)
154931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      for (j = 0; j < setup->tiles_y; j++)
155415b271b5100d64579690111bc8eb549866865a7Keith Whitwell         bin_command( &setup->tile[i][j], cmd, arg );
156e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell}
157e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
158931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
159931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
160931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellrasterize_bins( struct setup_context *setup,
161931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                boolean write_depth )
162e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell{
1631caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   struct lp_rasterizer *rast = setup->rast;
1641caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   struct cmd_block *block;
1651caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   unsigned i,j,k;
1661caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell
16784ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   if (setup->state != SETUP_ACTIVE) {
16884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      /* this can happen, not a big deal */
16984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      debug_printf("%s called when not binning\n", __FUNCTION__);
17084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      return;
17184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   }
17284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell
17384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   lp_rast_begin( rast,
17484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                  setup->fb.width,
17584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                  setup->fb.height );
17684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell
177931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   lp_rast_bind_color( rast,
178253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                       setup->fb.cbuf,
17984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                       setup->fb.cbuf != NULL );
180931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
18184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   lp_rast_bind_zstencil( rast,
18284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                          setup->fb.zsbuf,
18384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                          setup->fb.zsbuf != NULL && write_depth );
184931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1851caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell   for (i = 0; i < setup->tiles_x; i++) {
1861caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell      for (j = 0; j < setup->tiles_y; j++) {
187931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
188931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         lp_rast_start_tile( rast,
189931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                             i * TILESIZE,
190931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                             j * TILESIZE );
191931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1921caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell         for (block = setup->tile[i][j].head; block; block = block->next) {
1931caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell            for (k = 0; k < block->count; k++) {
1941caa26202c3bcc41ea5829b646128088e14d5dfdKeith Whitwell               block->cmd[k]( rast, block->arg[k] );
195931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell            }
196931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         }
197931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
1980718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell         lp_rast_end_tile( rast );
199931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
200931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
201931210424bc46b2c13919f0ac3e0ef781eff207eKeith 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{
21084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   if (!setup->fb.cbuf && !setup->fb.zsbuf) {
21184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.width = 0;
21284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.height = 0;
21384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   }
21484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   else if (!setup->fb.zsbuf) {
21584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.width = setup->fb.cbuf->width;
21684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.height = setup->fb.cbuf->height;
21784ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   }
21884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   else if (!setup->fb.cbuf) {
21984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.width = setup->fb.zsbuf->width;
22084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.height = setup->fb.zsbuf->height;
22184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   }
22284ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   else {
22384ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      /* XXX: not sure what we're really supposed to do for
22484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell       * mis-matched color & depth buffer sizes.
22584ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell       */
22684ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.width = MIN2(setup->fb.cbuf->width,
22784ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                             setup->fb.zsbuf->width);
22884ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell      setup->fb.height = MIN2(setup->fb.cbuf->height,
22984ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell                              setup->fb.zsbuf->height);
23084ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell   }
23184ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell
232b0475a4b0d1eaa1179bc399301ed46b0b8e63497Keith Whitwell   setup->tiles_x = align(setup->fb.width, TILESIZE) / TILESIZE;
233b0475a4b0d1eaa1179bc399301ed46b0b8e63497Keith Whitwell   setup->tiles_y = align(setup->fb.height, TILESIZE) / TILESIZE;
23484ab7dcf48e87350c0622c533e51aa495f7256c2Keith Whitwell
235253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   if (setup->fb.cbuf) {
2360718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (setup->clear.flags & PIPE_CLEAR_COLOR)
237931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         bin_everywhere( setup,
238931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                         lp_rast_clear_color,
2394cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         setup->clear.color );
240931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      else
2414cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell         bin_everywhere( setup, lp_rast_load_color, lp_rast_arg_null() );
242931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
243931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
244253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   if (setup->fb.zsbuf) {
2450718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL)
246931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         bin_everywhere( setup,
247931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                         lp_rast_clear_zstencil,
2484cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         setup->clear.zstencil );
249931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      else
2504cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell         bin_everywhere( setup, lp_rast_load_zstencil, lp_rast_arg_null() );
251931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
252e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell}
253e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
254e529170c11d3cb5812aabeff0a6ee2d7a2ea66f2Keith Whitwell
255931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* This basically bins and then flushes any outstanding full-screen
256931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * clears.
257931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell *
258931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * TODO: fast path for fullscreen clears and no triangles.
259946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
260931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
261931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellexecute_clears( struct setup_context *setup )
262946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
263931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   begin_binning( setup );
2640718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell   rasterize_bins( setup, TRUE );
265946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
266946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
267931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
268931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellstatic void
269931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellset_state( struct setup_context *setup,
270931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell           unsigned new_state )
271931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
272931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   unsigned old_state = setup->state;
273931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
274931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (old_state == new_state)
275931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      return;
276931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
277931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   switch (new_state) {
278931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_ACTIVE:
279931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      if (old_state == SETUP_FLUSHED)
2800718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell         begin_binning( setup );
281931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
282931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
283931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_CLEARED:
284931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      if (old_state == SETUP_ACTIVE) {
285931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         assert(0);
286931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         return;
287931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      }
288931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
289931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
290931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   case SETUP_FLUSHED:
2910718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell      if (old_state == SETUP_CLEARED)
292931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell         execute_clears( setup );
293931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      else
2940718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell         rasterize_bins( setup, TRUE );
295931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      break;
296931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   }
297931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
298931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->state = new_state;
299931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
300931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
301931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
302946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonsecavoid
303931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_flush( struct setup_context *setup,
304931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                unsigned flags )
305946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
306931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   set_state( setup, SETUP_FLUSHED );
307946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
308946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
309946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
310931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
311931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_bind_framebuffer( struct setup_context *setup,
312931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                           struct pipe_surface *color,
313931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                           struct pipe_surface *zstencil )
314946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
315931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   set_state( setup, SETUP_FLUSHED );
316931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
317253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   pipe_surface_reference( &setup->fb.cbuf, color );
318253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   pipe_surface_reference( &setup->fb.zsbuf, zstencil );
319931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
320931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
321931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
322931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_clear( struct setup_context *setup,
323253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                const float *color,
324253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                double depth,
325253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                unsigned stencil,
326931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                unsigned flags )
327931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
3284cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell   if (flags & PIPE_CLEAR_COLOR) {
3294cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell      util_pack_color(color,
3304cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                      setup->fb.cbuf->format,
3314cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                      &setup->clear.color.clear_color );
3324cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell   }
3334cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell
3344cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell   if (flags & PIPE_CLEAR_DEPTHSTENCIL) {
3354cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell      setup->clear.zstencil.clear_zstencil =
3364cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell         util_pack_z_stencil(setup->fb.zsbuf->format,
3374cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                             depth,
3384cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                             stencil);
3394cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell   }
3404cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell
341931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (setup->state == SETUP_ACTIVE) {
342253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell      /* Add the clear to existing bins.  In the unusual case where
343253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * both color and depth-stencilare being cleared, we could
344253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * discard the currently binned scene and start again, but I
345253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * don't see that as being a common usage.
346253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       */
3474cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell      if (flags & PIPE_CLEAR_COLOR)
3484cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell         bin_everywhere( setup,
3494cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         lp_rast_clear_color,
3504cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         setup->clear.color );
351253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell
3524cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell      if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL)
3534cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell         bin_everywhere( setup,
3544cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         lp_rast_clear_zstencil,
3554cdd10cb4b60d85f6c231a26739f7d5e264a05e5Keith Whitwell                         setup->clear.zstencil );
356946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
357946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   else {
358253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell      /* Put ourselves into the 'pre-clear' state, specifically to try
359253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * and accumulate multiple clears to color and depth_stencil
360253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * buffers which the app or state-tracker might issue
361253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       * separately.
362253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell       */
363931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      set_state( setup, SETUP_CLEARED );
3640718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
365931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      setup->clear.flags |= flags;
366946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   }
367931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
368931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
369931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
370415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
371415b271b5100d64579690111bc8eb549866865a7Keith Whitwellvoid
372e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwelllp_setup_set_triangle_state( struct setup_context *setup,
373e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell                             unsigned cull_mode,
374e215f94f15fd20919cc0ed500dc2efde4f076516Keith Whitwell                             boolean ccw_is_frontface)
375415b271b5100d64579690111bc8eb549866865a7Keith Whitwell{
376415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->ccw_is_frontface = ccw_is_frontface;
377415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->cullmode = cull_mode;
378415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   setup->triangle = first_triangle;
379415b271b5100d64579690111bc8eb549866865a7Keith Whitwell}
380415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
381415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
382415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
383931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
384931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_set_fs_inputs( struct setup_context *setup,
385253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell                        const struct lp_shader_input *input,
386931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell                        unsigned nr )
387931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
388253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   memcpy( setup->fs.input, input, nr * sizeof input[0] );
389253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->fs.nr_inputs = nr;
390931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
39189498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell
3920718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwellvoid
393d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_fs( struct setup_context *setup,
394d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                 struct lp_fragment_shader *fs )
3950718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell{
396d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   /* FIXME: reference count */
397d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
398d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   setup->fs.jit_function = fs->current->jit_function;
3990718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell}
4000718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell
401d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
402d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_fs_constants(struct setup_context *setup,
403d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                          struct pipe_buffer *buffer)
404d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
405d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   const void *data = buffer ? llvmpipe_buffer(buffer)->data : NULL;
406d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   struct pipe_buffer *dummy;
407931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
408d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   /* FIXME: hold on to the reference */
409d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   dummy = NULL;
410d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   pipe_buffer_reference(&dummy, buffer);
411931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
412d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   setup->fs.jit_context.constants = data;
413d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
414d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   setup->fs.jit_context_dirty = TRUE;
415d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
416d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
417d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
418d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
419d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_alpha_ref_value( struct setup_context *setup,
420d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                              float alpha_ref_value )
421d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
422d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   if(setup->fs.jit_context.alpha_ref_value != alpha_ref_value) {
423d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      setup->fs.jit_context.alpha_ref_value = alpha_ref_value;
424d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      setup->fs.jit_context_dirty = TRUE;
425d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
426d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
427d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
428d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
429d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_blend_color( struct setup_context *setup,
430d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                          const struct pipe_blend_color *blend_color )
431d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
432d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   unsigned i, j;
433d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
434d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   if(!setup->fs.jit_context.blend_color)
435d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      setup->fs.jit_context.blend_color = align_malloc(4 * 16, 16);
436d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
437d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   for (i = 0; i < 4; ++i) {
438d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      uint8_t c = float_to_ubyte(blend_color->color[i]);
439d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      for (j = 0; j < 16; ++j)
440d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         setup->fs.jit_context.blend_color[i*4 + j] = c;
441d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
442d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
443d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   setup->fs.jit_context_dirty = TRUE;
444d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
445d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
446d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecavoid
447d904ed88c1d957f662497343de7dc3e9fa743e47José Fonsecalp_setup_set_sampler_textures( struct setup_context *setup,
448d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca                               unsigned num, struct pipe_texture **texture)
449d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca{
450d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   struct pipe_texture *dummy;
451d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   unsigned i;
452d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
453d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   assert(num <= PIPE_MAX_SAMPLERS);
454d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
455d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
456d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      struct pipe_texture *tex = i < num ? texture[i] : NULL;
457d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
458d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      /* FIXME: hold on to the reference */
459d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      dummy = NULL;
460d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      pipe_texture_reference(&dummy, tex);
461d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
462d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      if(tex) {
463d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         struct llvmpipe_texture *lp_tex = llvmpipe_texture(tex);
464d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         struct lp_jit_texture *jit_tex = &setup->fs.jit_context.textures[i];
465d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         jit_tex->width = tex->width[0];
466d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         jit_tex->height = tex->height[0];
467d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         jit_tex->stride = lp_tex->stride[0];
468d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         if(!lp_tex->dt)
469d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca            jit_tex->data = lp_tex->data;
470d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca         else
471d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca            /* FIXME: map the rendertarget */
472d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca            assert(0);
473d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca      }
474d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   }
475d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
476d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca   setup->fs.jit_context_dirty = TRUE;
477d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca}
478d904ed88c1d957f662497343de7dc3e9fa743e47José Fonseca
479c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonsecaboolean
480c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonsecalp_setup_is_texture_referenced( struct setup_context *setup,
481c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca                                const struct pipe_texture *texture )
482c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca{
483c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca   /* FIXME */
484c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca   return PIPE_UNREFERENCED;
485c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca}
486c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca
487c0e3e35b03e6cbed3768cb56e298b6119eafe1efJosé Fonseca
488931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell/* Stubs for lines & points for now:
489931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell */
490931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
491931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_point(struct setup_context *setup,
492931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell		     const float (*v0)[4])
493931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
494931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->point( setup, v0 );
495946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
496946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
497931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
498931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwelllp_setup_line(struct setup_context *setup,
499931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell		    const float (*v0)[4],
500931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell		    const float (*v1)[4])
501931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
502931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->line( setup, v0, v1 );
503931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
504931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
505931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellvoid
5060718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwelllp_setup_tri(struct setup_context *setup,
5070718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell             const float (*v0)[4],
5080718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell             const float (*v1)[4],
5090718c7700533a965d7cd06b4f67b82bbae6e66a1Keith Whitwell             const float (*v2)[4])
510931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell{
511931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   setup->triangle( setup, v0, v1, v2 );
512931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell}
513946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
514946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
515253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellvoid
516253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwelllp_setup_destroy( struct setup_context *setup )
517946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
518415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   unsigned i, j;
519415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
520415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   reset_context( setup );
521415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
522415b271b5100d64579690111bc8eb549866865a7Keith Whitwell   for (i = 0; i < TILES_X; i++)
523415b271b5100d64579690111bc8eb549866865a7Keith Whitwell      for (j = 0; j < TILES_Y; j++)
524415b271b5100d64579690111bc8eb549866865a7Keith Whitwell         FREE(setup->tile[i][j].head);
525415b271b5100d64579690111bc8eb549866865a7Keith Whitwell
526931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   lp_rast_destroy( setup->rast );
52789498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell   FREE( setup );
528946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
529946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
530946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
531946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca/**
532931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * Create a new primitive tiling engine.  Currently also creates a
533931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell * rasterizer to use with it.
534946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca */
535253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwellstruct setup_context *
536253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwelllp_setup_create( void )
537946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca{
53889498d01531cd515c769e570bf799c39fbafc8fbKeith Whitwell   struct setup_context *setup = CALLOC_STRUCT(setup_context);
539253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   unsigned i, j;
540946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
541253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell   setup->rast = lp_rast_create();
542931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   if (!setup->rast)
543931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      goto fail;
544931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
545931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   for (i = 0; i < TILES_X; i++)
546931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell      for (j = 0; j < TILES_Y; j++)
547253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell         setup->tile[i][j].head =
548253dfed93918bd87c4a55047a9d569ede545f8beKeith Whitwell            setup->tile[i][j].tail = CALLOC_STRUCT(cmd_block);
549946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
550946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca   return setup;
551931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell
552931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwellfail:
553931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   FREE(setup);
554931210424bc46b2c13919f0ac3e0ef781eff207eKeith Whitwell   return NULL;
555946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca}
556946f432a08112148d743eb9faf6b27bb8cc7fa76José Fonseca
557