📄 r200_sanity.c
字号:
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 > 258) { 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 radeon_emit_veclinear( drm_radeon_cmd_header_t header, drm_radeon_cmd_buffer_t *cmdbuf ){ int sz = header.veclinear.count * 4; int *data = (int *)cmdbuf->buf; float *fdata =(float *)cmdbuf->buf; int start = header.veclinear.addr_lo | (header.veclinear.addr_hi << 8); int i; if (1||VERBOSE) fprintf(stderr, "emit vectors linear, start %d nr %d (end %d) (0x%x)\n", start, sz >> 2, start + (sz >> 2), header.i); if (start < 0x60) { for (i = 0 ; i < sz ; i += 4) { fprintf(stderr, "R200_VS_PARAM %d 0 %f\n", (i >> 2) + start, fdata[i]); fprintf(stderr, "R200_VS_PARAM %d 1 %f\n", (i >> 2) + start, fdata[i+1]); fprintf(stderr, "R200_VS_PARAM %d 2 %f\n", (i >> 2) + start, fdata[i+2]); fprintf(stderr, "R200_VS_PARAM %d 3 %f\n", (i >> 2) + start, fdata[i+3]); } } else if ((start >= 0x100) && (start < 0x160)) { for (i = 0 ; i < sz ; i += 4) { fprintf(stderr, "R200_VS_PARAM %d 0 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i]); fprintf(stderr, "R200_VS_PARAM %d 1 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i+1]); fprintf(stderr, "R200_VS_PARAM %d 2 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i+2]); fprintf(stderr, "R200_VS_PARAM %d 3 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i+3]); } } else if ((start >= 0x80) && (start < 0xc0)) { for (i = 0 ; i < sz ; i += 4) { fprintf(stderr, "R200_VS_PROG %d OPDST %08x\n", (i >> 2) + start - 0x80, data[i]); fprintf(stderr, "R200_VS_PROG %d SRC1 %08x\n", (i >> 2) + start - 0x80, data[i+1]); fprintf(stderr, "R200_VS_PROG %d SRC2 %08x\n", (i >> 2) + start - 0x80, data[i+2]); fprintf(stderr, "R200_VS_PROG %d SRC3 %08x\n", (i >> 2) + start - 0x80, data[i+3]); } } else if ((start >= 0x180) && (start < 0x1c0)) { for (i = 0 ; i < sz ; i += 4) { fprintf(stderr, "R200_VS_PROG %d OPDST %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i]); fprintf(stderr, "R200_VS_PROG %d SRC1 %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i+1]); fprintf(stderr, "R200_VS_PROG %d SRC2 %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i+2]); fprintf(stderr, "R200_VS_PROG %d SRC3 %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i+3]); } } else { fprintf(stderr, "write to unknown vector area\n"); } cmdbuf->buf += sz * sizeof(int); cmdbuf->bufsz -= sz * sizeof(int); return 0;}#if 0static 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 & R200_VTX_Z0) ? "z," : "", (vfmt & R200_VTX_W0) ? "w0," : "", (vfmt & R200_VTX_FPCOLOR) ? "fpcolor," : "", (vfmt & R200_VTX_FPALPHA) ? "fpalpha," : "", (vfmt & R200_VTX_PKCOLOR) ? "pkcolor," : "", (vfmt & R200_VTX_FPSPEC) ? "fpspec," : "", (vfmt & R200_VTX_FPFOG) ? "fpfog," : "", (vfmt & R200_VTX_PKSPEC) ? "pkspec," : "", (vfmt & R200_VTX_ST0) ? "st0," : "", (vfmt & R200_VTX_ST1) ? "st1," : "", (vfmt & R200_VTX_Q1) ? "q1," : "", (vfmt & R200_VTX_ST2) ? "st2," : "", (vfmt & R200_VTX_Q2) ? "q2," : "", (vfmt & R200_VTX_ST3) ? "st3," : "", (vfmt & R200_VTX_Q3) ? "q3," : "", (vfmt & R200_VTX_Q0) ? "q0," : "", (vfmt & R200_VTX_N0) ? "n0," : "", (vfmt & R200_VTX_XY1) ? "xy1," : "", (vfmt & R200_VTX_Z1) ? "z1," : "", (vfmt & R200_VTX_W1) ? "w1," : "", (vfmt & R200_VTX_N1) ? "n1," : ""); if (!find_or_add_value( &others[V_VTXFMT], vfmt )) fprintf(stderr, " *** NEW VALUE"); fprintf(stderr, "\n"); } return 0;}#endifstatic char *primname[0x10] = { "NONE", "POINTS", "LINES", "LINE_STRIP", "TRIANGLES", "TRIANGLE_FAN", "TRIANGLE_STRIP", "RECT_LIST", NULL, "3VRT_POINTS", "3VRT_LINES", "POINT_SPRITES", "LINE_LOOP", "QUADS", "QUAD_STRIP", "POLYGON",};static int print_prim_and_flags( int prim ){ int numverts; if (NORMAL) fprintf(stderr, " %s(%x): %s%s%s%s%s%s\n", "prim flags", prim, ((prim & 0x30) == R200_VF_PRIM_WALK_IND) ? "IND," : "", ((prim & 0x30) == R200_VF_PRIM_WALK_LIST) ? "LIST," : "", ((prim & 0x30) == R200_VF_PRIM_WALK_RING) ? "RING," : "", (prim & R200_VF_COLOR_ORDER_RGBA) ? "RGBA," : "BGRA, ", (prim & R200_VF_INDEX_SZ_4) ? "INDX-32," : "", (prim & R200_VF_TCL_OUTPUT_VTX_ENABLE) ? "TCL_OUT_VTX," : ""); numverts = prim>>16; if (NORMAL) fprintf(stderr, " prim: %s numverts %d\n", primname[prim&0xf], numverts); switch (prim & 0xf) { case R200_VF_PRIM_NONE: case R200_VF_PRIM_POINTS: if (numverts < 1) { fprintf(stderr, "Bad nr verts for line %d\n", numverts); return -1; } break; case R200_VF_PRIM_LINES: case R200_VF_PRIM_POINT_SPRITES: if ((numverts & 1) || numverts == 0) { fprintf(stderr, "Bad nr verts for line %d\n", numverts); return -1; } break; case R200_VF_PRIM_LINE_STRIP: case R200_VF_PRIM_LINE_LOOP: if (numverts < 2) { fprintf(stderr, "Bad nr verts for line_strip %d\n", numverts); return -1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -