📄 radeon_sanity.c
字号:
for (i = 0, tmp = vector_names ; i < Elements(vectors) ; i++) { if (tmp[1].idx*4 == i) tmp++; vectors[i].idx = i; vectors[i].closest = tmp; vectors[i].flags = ISFLOAT|ISVEC; } regs[Elements(regs)-1].idx = -1; scalars[Elements(scalars)-1].idx = -1; vectors[Elements(vectors)-1].idx = -1;}static int find_or_add_value( struct reg *reg, int val ){ int j; for ( j = 0 ; j < reg->nvalues ; j++) if ( val == reg->values[j].i ) return 1; if (j == reg->nalloc) { reg->nalloc += 5; reg->nalloc *= 2; reg->values = (union fi *) realloc( reg->values, reg->nalloc * sizeof(union fi) ); } reg->values[reg->nvalues++].i = val; return 0;}static struct reg *lookup_reg( struct reg *tab, int reg ){ int i; for (i = 0 ; tab[i].idx != -1 ; i++) { if (tab[i].idx == reg) return &tab[i]; } fprintf(stderr, "*** unknown reg 0x%x\n", reg); return NULL;}static const char *get_reg_name( struct reg *reg ){ static char tmp[80]; if (reg->idx == reg->closest->idx) return reg->closest->name; if (reg->flags & ISVEC) { if (reg->idx/4 != reg->closest->idx) sprintf(tmp, "%s+%d[%d]", reg->closest->name, (reg->idx/4) - reg->closest->idx, reg->idx%4); else sprintf(tmp, "%s[%d]", reg->closest->name, reg->idx%4); } else { if (reg->idx != reg->closest->idx) sprintf(tmp, "%s+%d", reg->closest->name, reg->idx - reg->closest->idx); else sprintf(tmp, "%s", reg->closest->name); } return tmp;}static int print_int_reg_assignment( struct reg *reg, int data ){ int changed = (reg->current.i != data); int ever_seen = find_or_add_value( reg, data ); if (VERBOSE || (NORMAL && (changed || !ever_seen))) fprintf(stderr, " %s <-- 0x%x", get_reg_name(reg), data); if (NORMAL) { if (!ever_seen) fprintf(stderr, " *** BRAND NEW VALUE"); else if (changed) fprintf(stderr, " *** CHANGED"); } reg->current.i = data; if (VERBOSE || (NORMAL && (changed || !ever_seen))) fprintf(stderr, "\n"); return changed;}static int print_float_reg_assignment( struct reg *reg, float data ){ int changed = (reg->current.f != data); int newmin = (data < reg->vmin); int newmax = (data > reg->vmax); if (VERBOSE || (NORMAL && (newmin || newmax || changed))) fprintf(stderr, " %s <-- %.3f", get_reg_name(reg), data); if (NORMAL) { if (newmin) { fprintf(stderr, " *** NEW MIN (prev %.3f)", reg->vmin); reg->vmin = data; } else if (newmax) { fprintf(stderr, " *** NEW MAX (prev %.3f)", reg->vmax); reg->vmax = data; } else if (changed) { fprintf(stderr, " *** CHANGED"); } } reg->current.f = data; if (VERBOSE || (NORMAL && (newmin || newmax || changed))) fprintf(stderr, "\n"); return changed;}static int print_reg_assignment( struct reg *reg, int data ){ float_ui32_type datau; datau.ui32 = data; reg->flags |= TOUCHED; if (reg->flags & ISFLOAT) return print_float_reg_assignment( reg, datau.f ); else return print_int_reg_assignment( reg, data );}static void print_reg( struct reg *reg ){ if (reg->flags & TOUCHED) { if (reg->flags & ISFLOAT) { fprintf(stderr, " %s == %f\n", get_reg_name(reg), reg->current.f); } else { fprintf(stderr, " %s == 0x%x\n", get_reg_name(reg), reg->current.i); } }}static void dump_state( void ){ int i; for (i = 0 ; i < Elements(regs) ; i++) print_reg( ®s[i] ); for (i = 0 ; i < Elements(scalars) ; i++) print_reg( &scalars[i] ); for (i = 0 ; i < Elements(vectors) ; i++) print_reg( &vectors[i] );}static int radeon_emit_packets( drm_radeon_cmd_header_t header, drm_radeon_cmd_buffer_t *cmdbuf ){ int id = (int)header.packet.packet_id; int sz = packet[id].len; int *data = (int *)cmdbuf->buf; int i; if (sz * sizeof(int) > cmdbuf->bufsz) { fprintf(stderr, "Packet overflows cmdbuf\n"); return -EINVAL; } if (!packet[id].name) { fprintf(stderr, "*** Unknown packet 0 nr %d\n", id ); return -EINVAL; } if (VERBOSE) fprintf(stderr, "Packet 0 reg %s nr %d\n", packet[id].name, sz ); for ( i = 0 ; i < sz ; i++) { struct reg *reg = lookup_reg( regs, packet[id].start + i*4 ); if (print_reg_assignment( reg, data[i] )) total_changed++; total++; } cmdbuf->buf += sz * sizeof(int); cmdbuf->bufsz -= sz * sizeof(int); return 0;}static int radeon_emit_scalars( drm_radeon_cmd_header_t header, drm_radeon_cmd_buffer_t *cmdbuf ){ int sz = header.scalars.count; int *data = (int *)cmdbuf->buf; int start = header.scalars.offset; int stride = header.scalars.stride; int i; if (VERBOSE) fprintf(stderr, "emit scalars, start %d stride %d nr %d (end %d)\n", start, stride, sz, start + stride * sz); for (i = 0 ; i < sz ; i++, start += stride) { struct reg *reg = lookup_reg( scalars, start ); if (print_reg_assignment( reg, data[i] )) total_changed++; total++; } cmdbuf->buf += sz * sizeof(int); cmdbuf->bufsz -= sz * sizeof(int); return 0;}static int radeon_emit_scalars2( drm_radeon_cmd_header_t header, drm_radeon_cmd_buffer_t *cmdbuf ){ int sz = header.scalars.count; int *data = (int *)cmdbuf->buf; int start = header.scalars.offset + 0x100; int stride = header.scalars.stride; int i; if (VERBOSE) fprintf(stderr, "emit scalars2, start %d stride %d nr %d (end %d)\n", start, stride, sz, start + stride * sz); if (start + stride * sz > 257) { fprintf(stderr, "emit scalars OVERFLOW %d/%d/%d\n", start, stride, sz); return -1; } for (i = 0 ; i < sz ; i++, start += stride) { struct reg *reg = lookup_reg( scalars, start ); if (print_reg_assignment( reg, data[i] )) total_changed++; total++; } cmdbuf->buf += sz * sizeof(int); cmdbuf->bufsz -= sz * sizeof(int); return 0;}/* Check: inf/nan/extreme-size? * Check: table start, end, nr, etc. */static int radeon_emit_vectors( drm_radeon_cmd_header_t header, drm_radeon_cmd_buffer_t *cmdbuf ){ int sz = header.vectors.count; int *data = (int *)cmdbuf->buf; int start = header.vectors.offset; int stride = header.vectors.stride; int i,j; if (VERBOSE) fprintf(stderr, "emit vectors, start %d stride %d nr %d (end %d) (0x%x)\n", start, stride, sz, start + stride * sz, header.i);/* if (start + stride * (sz/4) > 128) { *//* fprintf(stderr, "emit vectors OVERFLOW %d/%d/%d\n", start, stride, sz); *//* return -1; *//* } */ for (i = 0 ; i < sz ; start += stride) { int changed = 0; for (j = 0 ; j < 4 ; i++,j++) { struct reg *reg = lookup_reg( vectors, start*4+j ); if (print_reg_assignment( reg, data[i] )) changed = 1; } if (changed) total_changed += 4; total += 4; } cmdbuf->buf += sz * sizeof(int); cmdbuf->bufsz -= sz * sizeof(int); return 0;}static int print_vertex_format( int vfmt ){ if (NORMAL) { fprintf(stderr, " %s(%x): %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", "vertex format", vfmt, "xy,", (vfmt & RADEON_CP_VC_FRMT_Z) ? "z," : "", (vfmt & RADEON_CP_VC_FRMT_W0) ? "w0," : "", (vfmt & RADEON_CP_VC_FRMT_FPCOLOR) ? "fpcolor," : "", (vfmt & RADEON_CP_VC_FRMT_FPALPHA) ? "fpalpha," : "", (vfmt & RADEON_CP_VC_FRMT_PKCOLOR) ? "pkcolor," : "", (vfmt & RADEON_CP_VC_FRMT_FPSPEC) ? "fpspec," : "", (vfmt & RADEON_CP_VC_FRMT_FPFOG) ? "fpfog," : "", (vfmt & RADEON_CP_VC_FRMT_PKSPEC) ? "pkspec," : "", (vfmt & RADEON_CP_VC_FRMT_ST0) ? "st0," : "", (vfmt & RADEON_CP_VC_FRMT_ST1) ? "st1," : "", (vfmt & RADEON_CP_VC_FRMT_Q1) ? "q1," : "", (vfmt & RADEON_CP_VC_FRMT_ST2) ? "st2," : "", (vfmt & RADEON_CP_VC_FRMT_Q2) ? "q2," : "", (vfmt & RADEON_CP_VC_FRMT_ST3) ? "st3," : "", (vfmt & RADEON_CP_VC_FRMT_Q3) ? "q3," : "", (vfmt & RADEON_CP_VC_FRMT_Q0) ? "q0," : "", (vfmt & RADEON_CP_VC_FRMT_N0) ? "n0," : "", (vfmt & RADEON_CP_VC_FRMT_XY1) ? "xy1," : "", (vfmt & RADEON_CP_VC_FRMT_Z1) ? "z1," : "", (vfmt & RADEON_CP_VC_FRMT_W1) ? "w1," : "", (vfmt & RADEON_CP_VC_FRMT_N1) ? "n1," : ""); /* if (!find_or_add_value( &others[V_VTXFMT], vfmt )) *//* fprintf(stderr, " *** NEW VALUE"); */ fprintf(stderr, "\n"); } return 0;}static char *primname[0xf] = { "NONE", "POINTS", "LINES", "LINE_STRIP", "TRIANGLES", "TRIANGLE_FAN", "TRIANGLE_STRIP", "TRI_TYPE_2", "RECT_LIST", "3VRT_POINTS", "3VRT_LINES",};static int print_prim_and_flags( int prim ){ int numverts; if (NORMAL) fprintf(stderr, " %s(%x): %s%s%s%s%s%s%s\n",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -