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