⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radeon_sanity.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
   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( &regs[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 + -