1f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell#include "util/u_math.h"
2f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell#include "lp_rast_priv.h"
3f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell#include "lp_state_fs.h"
4f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
5f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstruct tile {
6f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   int coverage;
7f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   int overdraw;
84195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell   const struct lp_rast_state *state;
9f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   char data[TILE_SIZE][TILE_SIZE];
10f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell};
11f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
12f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic char get_label( int i )
13f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
14f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   static const char *cmd_labels = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
15f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned max_label = (2*26+10);
16f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
17f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   if (i < max_label)
18f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      return cmd_labels[i];
19f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   else
20f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      return '?';
21f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
22f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
23f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
24f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
25f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic const char *cmd_names[LP_RAST_OP_MAX] =
26f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
27f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "clear_color",
28f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "clear_zstencil",
29f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "triangle_1",
30f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "triangle_2",
31f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "triangle_3",
32f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "triangle_4",
33f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "triangle_5",
34f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "triangle_6",
35f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "triangle_7",
36f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "triangle_8",
37c4046d4fda2fe838659bff99bfa17f57f895a943Keith Whitwell   "triangle_3_4",
38f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "triangle_3_16",
390ff132e5a633170afaed0aea54d01438c895b8abKeith Whitwell   "triangle_4_16",
40f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "shade_tile",
41f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "shade_tile_opaque",
42f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "begin_query",
43f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   "end_query",
444195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell   "set_state",
45f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell};
46f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
47f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic const char *cmd_name(unsigned cmd)
48f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
49f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   assert(Elements(cmd_names) > cmd);
50f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   return cmd_names[cmd];
51f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
52f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
53f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic const struct lp_fragment_shader_variant *
544195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwellget_variant( const struct lp_rast_state *state,
554195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell             const struct cmd_block *block,
564195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell             int k )
57f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
58023ca40d80670ac0eee8c755ca5f54b1e7c2712eBrian Paul   if (!state)
59023ca40d80670ac0eee8c755ca5f54b1e7c2712eBrian Paul      return NULL;
60023ca40d80670ac0eee8c755ca5f54b1e7c2712eBrian Paul
61f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   if (block->cmd[k] == LP_RAST_OP_SHADE_TILE ||
624195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell       block->cmd[k] == LP_RAST_OP_SHADE_TILE_OPAQUE ||
634195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell       block->cmd[k] == LP_RAST_OP_TRIANGLE_1 ||
64f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell       block->cmd[k] == LP_RAST_OP_TRIANGLE_2 ||
65f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell       block->cmd[k] == LP_RAST_OP_TRIANGLE_3 ||
66f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell       block->cmd[k] == LP_RAST_OP_TRIANGLE_4 ||
67f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell       block->cmd[k] == LP_RAST_OP_TRIANGLE_5 ||
68f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell       block->cmd[k] == LP_RAST_OP_TRIANGLE_6 ||
69f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell       block->cmd[k] == LP_RAST_OP_TRIANGLE_7)
704195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell      return state->variant;
71f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
72f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   return NULL;
73f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
74f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
75f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
76f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic boolean
774195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwellis_blend( const struct lp_rast_state *state,
784195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell          const struct cmd_block *block,
79f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell          int k )
80f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
814195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell   const struct lp_fragment_shader_variant *variant = get_variant(state, block, k);
82f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
83f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   if (variant)
84f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      return  variant->key.blend.rt[0].blend_enable;
85f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
86f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   return FALSE;
87f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
88f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
89f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
90f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
91f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic void
92f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwelldebug_bin( const struct cmd_bin *bin )
93f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
9422725eb3e87921632a24579d63bb20c35a122afaVinson Lee   const struct lp_rast_state *state = NULL;
95f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   const struct cmd_block *head = bin->head;
96f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   int i, j = 0;
97f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
98f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   debug_printf("bin %d,%d:\n", bin->x, bin->y);
99f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
100f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   while (head) {
101f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      for (i = 0; i < head->count; i++, j++) {
1024195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell         if (head->cmd[i] == LP_RAST_OP_SET_STATE)
1034195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell            state = head->arg[i].state;
1044195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell
105f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         debug_printf("%d: %s %s\n", j,
106f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                      cmd_name(head->cmd[i]),
1074195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell                      is_blend(state, head, i) ? "blended" : "");
108f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      }
109f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      head = head->next;
110f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   }
111f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
112f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
113f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
114f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic void plot(struct tile *tile,
115f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                 int x, int y,
116f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                 char val,
117f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                 boolean blend)
118f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
119f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   if (tile->data[x][y] == ' ')
120f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      tile->coverage++;
121f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   else
122f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      tile->overdraw++;
123f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
124f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   tile->data[x][y] = val;
125f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
126f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
127f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
128f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
129f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
130f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
131f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
132f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic int
133f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwelldebug_shade_tile(int x, int y,
134f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                 const union lp_rast_cmd_arg arg,
135f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                 struct tile *tile,
136f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                 char val)
137f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
138f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   const struct lp_rast_shader_inputs *inputs = arg.shade_tile;
139023ca40d80670ac0eee8c755ca5f54b1e7c2712eBrian Paul   boolean blend;
140f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned i,j;
141f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
142023ca40d80670ac0eee8c755ca5f54b1e7c2712eBrian Paul   if (!tile->state)
143023ca40d80670ac0eee8c755ca5f54b1e7c2712eBrian Paul      return 0;
144023ca40d80670ac0eee8c755ca5f54b1e7c2712eBrian Paul
145023ca40d80670ac0eee8c755ca5f54b1e7c2712eBrian Paul   blend = tile->state->variant->key.blend.rt[0].blend_enable;
146023ca40d80670ac0eee8c755ca5f54b1e7c2712eBrian Paul
147f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   if (inputs->disable)
148f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      return 0;
149f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
150f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   for (i = 0; i < TILE_SIZE; i++)
151f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      for (j = 0; j < TILE_SIZE; j++)
152f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         plot(tile, i, j, val, blend);
153f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
154f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   return TILE_SIZE * TILE_SIZE;
155f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
156f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
157f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic int
158f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwelldebug_clear_tile(int x, int y,
159f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                 const union lp_rast_cmd_arg arg,
160f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                 struct tile *tile,
161f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                 char val)
162f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
163f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned i,j;
164f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
165f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   for (i = 0; i < TILE_SIZE; i++)
166f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      for (j = 0; j < TILE_SIZE; j++)
167f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         plot(tile, i, j, val, FALSE);
168f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
169f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   return TILE_SIZE * TILE_SIZE;
170f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
171f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
172f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
173f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
174f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic int
175f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwelldebug_triangle(int tilex, int tiley,
176f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell               const union lp_rast_cmd_arg arg,
177f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell               struct tile *tile,
178f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell               char val)
179f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
180f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   const struct lp_rast_triangle *tri = arg.triangle.tri;
181f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned plane_mask = arg.triangle.plane_mask;
1829bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell   const struct lp_rast_plane *tri_plane = GET_PLANES(tri);
183f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   struct lp_rast_plane plane[8];
184f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   int x, y;
185f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   int count = 0;
186f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned i, nr_planes = 0;
1874195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell   boolean blend = tile->state->variant->key.blend.rt[0].blend_enable;
188f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
189f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   if (tri->inputs.disable) {
190f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      /* This triangle was partially binned and has been disabled */
191f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      return 0;
192f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   }
193f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
194f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   while (plane_mask) {
1959bf8a55c4b29d55320fc2e7875ecf0e9ca164ee8Keith Whitwell      plane[nr_planes] = tri_plane[u_bit_scan(&plane_mask)];
196f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      plane[nr_planes].c = (plane[nr_planes].c +
197f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                            plane[nr_planes].dcdy * tiley -
198f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                            plane[nr_planes].dcdx * tilex);
199f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      nr_planes++;
200f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   }
201f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
202f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   for(y = 0; y < TILE_SIZE; y++)
203f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   {
204f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      for(x = 0; x < TILE_SIZE; x++)
205f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      {
206f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         for (i = 0; i < nr_planes; i++)
207f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            if (plane[i].c <= 0)
208f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell               goto out;
209f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
210f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         plot(tile, x, y, val, blend);
211f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         count++;
212f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
213f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      out:
214f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         for (i = 0; i < nr_planes; i++)
215f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            plane[i].c -= plane[i].dcdx;
216f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      }
217f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
218f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      for (i = 0; i < nr_planes; i++) {
219f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         plane[i].c += plane[i].dcdx * TILE_SIZE;
220f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         plane[i].c += plane[i].dcdy;
221f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      }
222f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   }
223f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   return count;
224f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
225f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
226f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
227f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
228f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
229f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
230f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic void
231f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwelldo_debug_bin( struct tile *tile,
232f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell              const struct cmd_bin *bin,
233f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell              boolean print_cmds)
234f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
235f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned k, j = 0;
236f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   const struct cmd_block *block;
237f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
238f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   int tx = bin->x * TILE_SIZE;
239f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   int ty = bin->y * TILE_SIZE;
240f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
241f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   memset(tile->data, ' ', sizeof tile->data);
242f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   tile->coverage = 0;
243f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   tile->overdraw = 0;
24436dde032a4f7d6a8b68c1adc8e829816e2e8826eVinson Lee   tile->state = NULL;
245f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
246f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   for (block = bin->head; block; block = block->next) {
247f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      for (k = 0; k < block->count; k++, j++) {
2484195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell         boolean blend = is_blend(tile->state, block, k);
249f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         char val = get_label(j);
250f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         int count = 0;
251f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
252f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         if (print_cmds)
253f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            debug_printf("%c: %15s", val, cmd_name(block->cmd[k]));
2544195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell
2554195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell         if (block->cmd[k] == LP_RAST_OP_SET_STATE)
2564195febeecd2d2f5571afdb90cbb185a4759f50aKeith Whitwell            tile->state = block->arg[k].state;
257f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
258f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         if (block->cmd[k] == LP_RAST_OP_CLEAR_COLOR ||
259f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell             block->cmd[k] == LP_RAST_OP_CLEAR_ZSTENCIL)
260f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            count = debug_clear_tile(tx, ty, block->arg[k], tile, val);
261f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
262f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         if (block->cmd[k] == LP_RAST_OP_SHADE_TILE ||
263f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell             block->cmd[k] == LP_RAST_OP_SHADE_TILE_OPAQUE)
264f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            count = debug_shade_tile(tx, ty, block->arg[k], tile, val);
265f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
266f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         if (block->cmd[k] == LP_RAST_OP_TRIANGLE_1 ||
267f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell             block->cmd[k] == LP_RAST_OP_TRIANGLE_2 ||
268f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell             block->cmd[k] == LP_RAST_OP_TRIANGLE_3 ||
269f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell             block->cmd[k] == LP_RAST_OP_TRIANGLE_4 ||
270f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell             block->cmd[k] == LP_RAST_OP_TRIANGLE_5 ||
271f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell             block->cmd[k] == LP_RAST_OP_TRIANGLE_6 ||
272f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell             block->cmd[k] == LP_RAST_OP_TRIANGLE_7)
273f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            count = debug_triangle(tx, ty, block->arg[k], tile, val);
274f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
275f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         if (print_cmds) {
276f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            debug_printf(" % 5d", count);
277f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
278f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            if (blend)
279f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell               debug_printf(" blended");
280f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
281f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            debug_printf("\n");
282f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         }
283f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      }
284f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   }
285f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
286f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
287f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellvoid
288f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwelllp_debug_bin( const struct cmd_bin *bin)
289f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
290f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   struct tile tile;
291f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   int x,y;
292f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
293f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   if (bin->head) {
294f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      do_debug_bin(&tile, bin, TRUE);
295f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
296f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      debug_printf("------------------------------------------------------------------\n");
297f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      for (y = 0; y < TILE_SIZE; y++) {
298f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         for (x = 0; x < TILE_SIZE; x++) {
299f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            debug_printf("%c", tile.data[y][x]);
300f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         }
301f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         debug_printf("|\n");
302f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      }
303f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      debug_printf("------------------------------------------------------------------\n");
304f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
305f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      debug_printf("each pixel drawn avg %f times\n",
306f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                   ((float)tile.overdraw + tile.coverage)/(float)tile.coverage);
307f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   }
308f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
309f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
310f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
311f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
312f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
313f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
314f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
315f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell/** Return number of bytes used for a single bin */
316f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellstatic unsigned
317f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwelllp_scene_bin_size( const struct lp_scene *scene, unsigned x, unsigned y )
318f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
319f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   struct cmd_bin *bin = lp_scene_get_bin((struct lp_scene *) scene, x, y);
320f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   const struct cmd_block *cmd;
321f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned size = 0;
322f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   for (cmd = bin->head; cmd; cmd = cmd->next) {
323f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      size += (cmd->count *
324f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell               (sizeof(uint8_t) + sizeof(union lp_rast_cmd_arg)));
325f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   }
326f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   return size;
327f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
328f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
329f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
330f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
331f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellvoid
332f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwelllp_debug_draw_bins_by_coverage( struct lp_scene *scene )
333f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
334f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned x, y;
335f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned total = 0;
336f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned possible = 0;
337f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   static unsigned long long _total;
338f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   static unsigned long long _possible;
339f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
340f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   for (x = 0; x < scene->tiles_x; x++)
341f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      debug_printf("-");
342f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   debug_printf("\n");
343f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
344f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   for (y = 0; y < scene->tiles_y; y++) {
345f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      for (x = 0; x < scene->tiles_x; x++) {
346f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         struct cmd_bin *bin = lp_scene_get_bin(scene, x, y);
347f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         const char *bits = "0123456789";
348f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         struct tile tile;
349f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
350f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         if (bin->head) {
351f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            //lp_debug_bin(bin);
352f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
353f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            do_debug_bin(&tile, bin, FALSE);
354f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
355f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            total += tile.coverage;
356f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            possible += 64*64;
357f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
358f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            if (tile.coverage == 64*64)
359f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell               debug_printf("*");
360f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            else if (tile.coverage) {
361f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell               int bit = tile.coverage/(64.0*64.0)*10;
362f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell               debug_printf("%c", bits[MIN2(bit,10)]);
363f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            }
364f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            else
365f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell               debug_printf("?");
366f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         }
367f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         else {
368f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            debug_printf(" ");
369f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         }
370f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      }
371f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      debug_printf("|\n");
372f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   }
373f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
374f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   for (x = 0; x < scene->tiles_x; x++)
375f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      debug_printf("-");
376f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   debug_printf("\n");
377f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
378f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   debug_printf("this tile total: %u possible %u: percentage: %f\n",
379f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                total,
380f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                possible,
381f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                total * 100.0 / (float)possible);
382f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
383f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   _total += total;
384f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   _possible += possible;
385f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
386f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   debug_printf("overall   total: %llu possible %llu: percentage: %f\n",
387f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                _total,
388f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                _possible,
389f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell                _total * 100.0 / (double)_possible);
390f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
391f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
392f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
393f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellvoid
394f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwelllp_debug_draw_bins_by_cmd_length( struct lp_scene *scene )
395f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
396f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned x, y;
397f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
398f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   for (y = 0; y < scene->tiles_y; y++) {
399f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      for (x = 0; x < scene->tiles_x; x++) {
400f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         const char *bits = " ...,-~:;=o+xaw*#XAWWWWWWWWWWWWWWWW";
401fae77579ad5f9ab0fd805c0fe9519b29d771bb42Matt Turner         unsigned sz = lp_scene_bin_size(scene, x, y);
402fae77579ad5f9ab0fd805c0fe9519b29d771bb42Matt Turner         unsigned sz2 = util_logbase2(sz);
403f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         debug_printf("%c", bits[MIN2(sz2,32)]);
404f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      }
405f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      debug_printf("\n");
406f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   }
407f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
408f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
409f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
410f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwellvoid
411f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwelllp_debug_bins( struct lp_scene *scene )
412f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell{
413f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   unsigned x, y;
414f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell
415f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   for (y = 0; y < scene->tiles_y; y++) {
416f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      for (x = 0; x < scene->tiles_x; x++) {
417f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         struct cmd_bin *bin = lp_scene_get_bin(scene, x, y);
418f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         if (bin->head) {
419f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell            debug_bin(bin);
420f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell         }
421f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell      }
422f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell   }
423f25836d7b2c21e046a725cf13c8649d3981693b7Keith Whitwell}
424