Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  
  3. Copyright 2002 ATI Technologies Inc., Ontario, Canada, and
  4.                      Tungsten Graphics Inc, Cedar Park, TX.
  5.  
  6. All Rights Reserved.
  7.  
  8. Permission is hereby granted, free of charge, to any person obtaining a
  9. copy of this software and associated documentation files (the "Software"),
  10. to deal in the Software without restriction, including without limitation
  11. on the rights to use, copy, modify, merge, publish, distribute, sub
  12. license, and/or sell copies of the Software, and to permit persons to whom
  13. the Software is furnished to do so, subject to the following conditions:
  14.  
  15. The above copyright notice and this permission notice (including the next
  16. paragraph) shall be included in all copies or substantial portions of the
  17. Software.
  18.  
  19. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21. FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  22. ATI, TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
  23. DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  24. OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  25. USE OR OTHER DEALINGS IN THE SOFTWARE.
  26.  
  27. **************************************************************************/
  28.  
  29. /*
  30.  * Authors:
  31.  *   Keith Whitwell <keith@tungstengraphics.com>
  32.  *
  33.  */
  34.  
  35. #include <errno.h>
  36.  
  37. #include "main/glheader.h"
  38. #include "main/imports.h"
  39.  
  40. #include "r200_context.h"
  41. #include "r200_sanity.h"
  42. #include "radeon_reg.h"
  43. #include "r200_reg.h"
  44.  
  45. /* Set this '1' to get more verbiage.
  46.  */
  47. #define MORE_VERBOSE 1
  48.  
  49. #if MORE_VERBOSE
  50. #define VERBOSE (R200_DEBUG & RADEON_VERBOSE)
  51. #define NORMAL  (1)
  52. #else
  53. #define VERBOSE 0
  54. #define NORMAL  (R200_DEBUG & RADEON_VERBOSE)
  55. #endif
  56.  
  57.  
  58. /* New (1.3) state mechanism.  3 commands (packet, scalar, vector) in
  59.  * 1.3 cmdbuffers allow all previous state to be updated as well as
  60.  * the tcl scalar and vector areas.  
  61.  */
  62. static struct {
  63.    int start;
  64.    int len;
  65.    const char *name;
  66. } packet[RADEON_MAX_STATE_PACKETS] = {
  67.    { RADEON_PP_MISC,7,"RADEON_PP_MISC" },
  68.    { RADEON_PP_CNTL,3,"RADEON_PP_CNTL" },
  69.    { RADEON_RB3D_COLORPITCH,1,"RADEON_RB3D_COLORPITCH" },
  70.    { RADEON_RE_LINE_PATTERN,2,"RADEON_RE_LINE_PATTERN" },
  71.    { RADEON_SE_LINE_WIDTH,1,"RADEON_SE_LINE_WIDTH" },
  72.    { RADEON_PP_LUM_MATRIX,1,"RADEON_PP_LUM_MATRIX" },
  73.    { RADEON_PP_ROT_MATRIX_0,2,"RADEON_PP_ROT_MATRIX_0" },
  74.    { RADEON_RB3D_STENCILREFMASK,3,"RADEON_RB3D_STENCILREFMASK" },
  75.    { RADEON_SE_VPORT_XSCALE,6,"RADEON_SE_VPORT_XSCALE" },
  76.    { RADEON_SE_CNTL,2,"RADEON_SE_CNTL" },
  77.    { RADEON_SE_CNTL_STATUS,1,"RADEON_SE_CNTL_STATUS" },
  78.    { RADEON_RE_MISC,1,"RADEON_RE_MISC" },
  79.    { RADEON_PP_TXFILTER_0,6,"RADEON_PP_TXFILTER_0" },
  80.    { RADEON_PP_BORDER_COLOR_0,1,"RADEON_PP_BORDER_COLOR_0" },
  81.    { RADEON_PP_TXFILTER_1,6,"RADEON_PP_TXFILTER_1" },
  82.    { RADEON_PP_BORDER_COLOR_1,1,"RADEON_PP_BORDER_COLOR_1" },
  83.    { RADEON_PP_TXFILTER_2,6,"RADEON_PP_TXFILTER_2" },
  84.    { RADEON_PP_BORDER_COLOR_2,1,"RADEON_PP_BORDER_COLOR_2" },
  85.    { RADEON_SE_ZBIAS_FACTOR,2,"RADEON_SE_ZBIAS_FACTOR" },
  86.    { RADEON_SE_TCL_OUTPUT_VTX_FMT,11,"RADEON_SE_TCL_OUTPUT_VTX_FMT" },
  87.    { RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED,17,"RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED" },
  88.    { R200_PP_TXCBLEND_0, 4, "R200_EMIT_PP_TXCBLEND_0" },
  89.    { R200_PP_TXCBLEND_1, 4, "R200_PP_TXCBLEND_1" },
  90.    { R200_PP_TXCBLEND_2, 4, "R200_PP_TXCBLEND_2" },
  91.    { R200_PP_TXCBLEND_3, 4, "R200_PP_TXCBLEND_3" },
  92.    { R200_PP_TXCBLEND_4, 4, "R200_PP_TXCBLEND_4" },
  93.    { R200_PP_TXCBLEND_5, 4, "R200_PP_TXCBLEND_5" },
  94.    { R200_PP_TXCBLEND_6, 4, "R200_PP_TXCBLEND_6" },
  95.    { R200_PP_TXCBLEND_7, 4, "R200_PP_TXCBLEND_7" },
  96.    { R200_SE_TCL_LIGHT_MODEL_CTL_0, 6, "R200_SE_TCL_LIGHT_MODEL_CTL_0" },
  97.    { R200_PP_TFACTOR_0, 6, "R200_PP_TFACTOR_0" },
  98.    { R200_SE_VTX_FMT_0, 4, "R200_SE_VTX_FMT_0" },
  99.    { R200_SE_VAP_CNTL, 1, "R200_SE_VAP_CNTL" },
  100.    { R200_SE_TCL_MATRIX_SEL_0, 5, "R200_SE_TCL_MATRIX_SEL_0" },
  101.    { R200_SE_TCL_TEX_PROC_CTL_2, 5, "R200_SE_TCL_TEX_PROC_CTL_2" },
  102.    { R200_SE_TCL_UCP_VERT_BLEND_CTL, 1, "R200_SE_TCL_UCP_VERT_BLEND_CTL" },
  103.    { R200_PP_TXFILTER_0, 6, "R200_PP_TXFILTER_0" },
  104.    { R200_PP_TXFILTER_1, 6, "R200_PP_TXFILTER_1" },
  105.    { R200_PP_TXFILTER_2, 6, "R200_PP_TXFILTER_2" },
  106.    { R200_PP_TXFILTER_3, 6, "R200_PP_TXFILTER_3" },
  107.    { R200_PP_TXFILTER_4, 6, "R200_PP_TXFILTER_4" },
  108.    { R200_PP_TXFILTER_5, 6, "R200_PP_TXFILTER_5" },
  109.    { R200_PP_TXOFFSET_0, 1, "R200_PP_TXOFFSET_0" },
  110.    { R200_PP_TXOFFSET_1, 1, "R200_PP_TXOFFSET_1" },
  111.    { R200_PP_TXOFFSET_2, 1, "R200_PP_TXOFFSET_2" },
  112.    { R200_PP_TXOFFSET_3, 1, "R200_PP_TXOFFSET_3" },
  113.    { R200_PP_TXOFFSET_4, 1, "R200_PP_TXOFFSET_4" },
  114.    { R200_PP_TXOFFSET_5, 1, "R200_PP_TXOFFSET_5" },
  115.    { R200_SE_VTE_CNTL, 1, "R200_SE_VTE_CNTL" },
  116.    { R200_SE_TCL_OUTPUT_VTX_COMP_SEL, 1, "R200_SE_TCL_OUTPUT_VTX_COMP_SEL" },
  117.    { R200_PP_TAM_DEBUG3, 1, "R200_PP_TAM_DEBUG3" },
  118.    { R200_PP_CNTL_X, 1, "R200_PP_CNTL_X" },
  119.    { R200_RB3D_DEPTHXY_OFFSET, 1, "R200_RB3D_DEPTHXY_OFFSET" },
  120.    { R200_RE_AUX_SCISSOR_CNTL, 1, "R200_RE_AUX_SCISSOR_CNTL" },
  121.    { R200_RE_SCISSOR_TL_0, 2, "R200_RE_SCISSOR_TL_0" },
  122.    { R200_RE_SCISSOR_TL_1, 2, "R200_RE_SCISSOR_TL_1" },
  123.    { R200_RE_SCISSOR_TL_2, 2, "R200_RE_SCISSOR_TL_2" },
  124.    { R200_SE_VAP_CNTL_STATUS, 1, "R200_SE_VAP_CNTL_STATUS" },
  125.    { R200_SE_VTX_STATE_CNTL, 1, "R200_SE_VTX_STATE_CNTL" },
  126.    { R200_RE_POINTSIZE, 1, "R200_RE_POINTSIZE" },
  127.    { R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0, 4, "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0" },
  128.    { R200_PP_CUBIC_FACES_0, 1, "R200_PP_CUBIC_FACES_0" }, /* 61 */
  129.    { R200_PP_CUBIC_OFFSET_F1_0, 5, "R200_PP_CUBIC_OFFSET_F1_0" }, /* 62 */
  130.    { R200_PP_CUBIC_FACES_1, 1, "R200_PP_CUBIC_FACES_1" },
  131.    { R200_PP_CUBIC_OFFSET_F1_1, 5, "R200_PP_CUBIC_OFFSET_F1_1" },
  132.    { R200_PP_CUBIC_FACES_2, 1, "R200_PP_CUBIC_FACES_2" },
  133.    { R200_PP_CUBIC_OFFSET_F1_2, 5, "R200_PP_CUBIC_OFFSET_F1_2" },
  134.    { R200_PP_CUBIC_FACES_3, 1, "R200_PP_CUBIC_FACES_3" },
  135.    { R200_PP_CUBIC_OFFSET_F1_3, 5, "R200_PP_CUBIC_OFFSET_F1_3" },
  136.    { R200_PP_CUBIC_FACES_4, 1, "R200_PP_CUBIC_FACES_4" },
  137.    { R200_PP_CUBIC_OFFSET_F1_4, 5, "R200_PP_CUBIC_OFFSET_F1_4" },
  138.    { R200_PP_CUBIC_FACES_5, 1, "R200_PP_CUBIC_FACES_5" },
  139.    { R200_PP_CUBIC_OFFSET_F1_5, 5, "R200_PP_CUBIC_OFFSET_F1_5" },
  140.    { RADEON_PP_TEX_SIZE_0, 2, "RADEON_PP_TEX_SIZE_0" },
  141.    { RADEON_PP_TEX_SIZE_1, 2, "RADEON_PP_TEX_SIZE_1" },
  142.    { RADEON_PP_TEX_SIZE_2, 2, "RADEON_PP_TEX_SIZE_2" },
  143.    { R200_RB3D_BLENDCOLOR, 3, "R200_RB3D_BLENDCOLOR" },
  144.    { R200_SE_TCL_POINT_SPRITE_CNTL, 1, "R200_SE_TCL_POINT_SPRITE_CNTL" },
  145.    { RADEON_PP_CUBIC_FACES_0, 1, "RADEON_PP_CUBIC_FACES_0" },
  146.    { RADEON_PP_CUBIC_OFFSET_T0_0, 5, "RADEON_PP_CUBIC_OFFSET_T0_0" },
  147.    { RADEON_PP_CUBIC_FACES_1, 1, "RADEON_PP_CUBIC_FACES_1" },
  148.    { RADEON_PP_CUBIC_OFFSET_T1_0, 5, "RADEON_PP_CUBIC_OFFSET_T1_0" },
  149.    { RADEON_PP_CUBIC_FACES_2, 1, "RADEON_PP_CUBIC_FACES_2" },
  150.    { RADEON_PP_CUBIC_OFFSET_T2_0, 5, "RADEON_PP_CUBIC_OFFSET_T2_0" },
  151.    { R200_PP_TRI_PERF, 2, "R200_PP_TRI_PERF" },
  152.    { R200_PP_TXCBLEND_8, 32, "R200_PP_AFS_0"},   /* 85 */
  153.    { R200_PP_TXCBLEND_0, 32, "R200_PP_AFS_1"},
  154.    { R200_PP_TFACTOR_0, 8, "R200_ATF_TFACTOR"},
  155.    { R200_PP_TXFILTER_0, 8, "R200_PP_TXCTLALL_0"},
  156.    { R200_PP_TXFILTER_1, 8, "R200_PP_TXCTLALL_1"},
  157.    { R200_PP_TXFILTER_2, 8, "R200_PP_TXCTLALL_2"},
  158.    { R200_PP_TXFILTER_3, 8, "R200_PP_TXCTLALL_3"},
  159.    { R200_PP_TXFILTER_4, 8, "R200_PP_TXCTLALL_4"},
  160.    { R200_PP_TXFILTER_5, 8, "R200_PP_TXCTLALL_5"},
  161.    { R200_VAP_PVS_CNTL_1, 2, "R200_VAP_PVS_CNTL"},
  162. };
  163.  
  164. struct reg_names {
  165.    int idx;
  166.    const char *name;
  167. };
  168.  
  169. static struct reg_names reg_names[] = {
  170.    { R200_PP_MISC, "R200_PP_MISC" },
  171.    { R200_PP_FOG_COLOR, "R200_PP_FOG_COLOR" },
  172.    { R200_RE_SOLID_COLOR, "R200_RE_SOLID_COLOR" },
  173.    { R200_RB3D_BLENDCNTL, "R200_RB3D_BLENDCNTL" },
  174.    { R200_RB3D_DEPTHOFFSET, "R200_RB3D_DEPTHOFFSET" },
  175.    { R200_RB3D_DEPTHPITCH, "R200_RB3D_DEPTHPITCH" },
  176.    { R200_RB3D_ZSTENCILCNTL, "R200_RB3D_ZSTENCILCNTL" },
  177.    { R200_PP_CNTL, "R200_PP_CNTL" },
  178.    { R200_RB3D_CNTL, "R200_RB3D_CNTL" },
  179.    { R200_RB3D_COLOROFFSET, "R200_RB3D_COLOROFFSET" },
  180.    { R200_RE_WIDTH_HEIGHT, "R200_RE_WIDTH_HEIGHT" },
  181.    { R200_RB3D_COLORPITCH, "R200_RB3D_COLORPITCH" },
  182.    { R200_SE_CNTL, "R200_SE_CNTL" },
  183.    { R200_RE_CNTL, "R200_RE_CNTL" },
  184.    { R200_RE_MISC, "R200_RE_MISC" },
  185.    { R200_RE_STIPPLE_ADDR, "R200_RE_STIPPLE_ADDR" },
  186.    { R200_RE_STIPPLE_DATA, "R200_RE_STIPPLE_DATA" },
  187.    { R200_RE_LINE_PATTERN, "R200_RE_LINE_PATTERN" },
  188.    { R200_RE_LINE_STATE, "R200_RE_LINE_STATE" },
  189.    { R200_RE_SCISSOR_TL_0, "R200_RE_SCISSOR_TL_0" },
  190.    { R200_RE_SCISSOR_BR_0, "R200_RE_SCISSOR_BR_0" },
  191.    { R200_RE_SCISSOR_TL_1, "R200_RE_SCISSOR_TL_1" },
  192.    { R200_RE_SCISSOR_BR_1, "R200_RE_SCISSOR_BR_1" },
  193.    { R200_RE_SCISSOR_TL_2, "R200_RE_SCISSOR_TL_2" },
  194.    { R200_RE_SCISSOR_BR_2, "R200_RE_SCISSOR_BR_2" },
  195.    { R200_RB3D_DEPTHXY_OFFSET, "R200_RB3D_DEPTHXY_OFFSET" },
  196.    { R200_RB3D_STENCILREFMASK, "R200_RB3D_STENCILREFMASK" },
  197.    { R200_RB3D_ROPCNTL, "R200_RB3D_ROPCNTL" },
  198.    { R200_RB3D_PLANEMASK, "R200_RB3D_PLANEMASK" },
  199.    { R200_SE_VPORT_XSCALE, "R200_SE_VPORT_XSCALE" },
  200.    { R200_SE_VPORT_XOFFSET, "R200_SE_VPORT_XOFFSET" },
  201.    { R200_SE_VPORT_YSCALE, "R200_SE_VPORT_YSCALE" },
  202.    { R200_SE_VPORT_YOFFSET, "R200_SE_VPORT_YOFFSET" },
  203.    { R200_SE_VPORT_ZSCALE, "R200_SE_VPORT_ZSCALE" },
  204.    { R200_SE_VPORT_ZOFFSET, "R200_SE_VPORT_ZOFFSET" },
  205.    { R200_SE_ZBIAS_FACTOR, "R200_SE_ZBIAS_FACTOR" },
  206.    { R200_SE_ZBIAS_CONSTANT, "R200_SE_ZBIAS_CONSTANT" },
  207.    { R200_SE_LINE_WIDTH, "R200_SE_LINE_WIDTH" },
  208.    { R200_SE_VAP_CNTL, "R200_SE_VAP_CNTL" },
  209.    { R200_SE_VF_CNTL, "R200_SE_VF_CNTL" },
  210.    { R200_SE_VTX_FMT_0, "R200_SE_VTX_FMT_0" },
  211.    { R200_SE_VTX_FMT_1, "R200_SE_VTX_FMT_1" },
  212.    { R200_SE_TCL_OUTPUT_VTX_FMT_0, "R200_SE_TCL_OUTPUT_VTX_FMT_0" },
  213.    { R200_SE_TCL_OUTPUT_VTX_FMT_1, "R200_SE_TCL_OUTPUT_VTX_FMT_1" },
  214.    { R200_SE_VTE_CNTL, "R200_SE_VTE_CNTL" },
  215.    { R200_SE_VTX_NUM_ARRAYS, "R200_SE_VTX_NUM_ARRAYS" },
  216.    { R200_SE_VTX_AOS_ATTR01, "R200_SE_VTX_AOS_ATTR01" },
  217.    { R200_SE_VTX_AOS_ADDR0, "R200_SE_VTX_AOS_ADDR0" },
  218.    { R200_SE_VTX_AOS_ADDR1, "R200_SE_VTX_AOS_ADDR1" },
  219.    { R200_SE_VTX_AOS_ATTR23, "R200_SE_VTX_AOS_ATTR23" },
  220.    { R200_SE_VTX_AOS_ADDR2, "R200_SE_VTX_AOS_ADDR2" },
  221.    { R200_SE_VTX_AOS_ADDR3, "R200_SE_VTX_AOS_ADDR3" },
  222.    { R200_SE_VTX_AOS_ATTR45, "R200_SE_VTX_AOS_ATTR45" },
  223.    { R200_SE_VTX_AOS_ADDR4, "R200_SE_VTX_AOS_ADDR4" },
  224.    { R200_SE_VTX_AOS_ADDR5, "R200_SE_VTX_AOS_ADDR5" },
  225.    { R200_SE_VTX_AOS_ATTR67, "R200_SE_VTX_AOS_ATTR67" },
  226.    { R200_SE_VTX_AOS_ADDR6, "R200_SE_VTX_AOS_ADDR6" },
  227.    { R200_SE_VTX_AOS_ADDR7, "R200_SE_VTX_AOS_ADDR7" },
  228.    { R200_SE_VTX_AOS_ATTR89, "R200_SE_VTX_AOS_ATTR89" },
  229.    { R200_SE_VTX_AOS_ADDR8, "R200_SE_VTX_AOS_ADDR8" },
  230.    { R200_SE_VTX_AOS_ADDR9, "R200_SE_VTX_AOS_ADDR9" },
  231.    { R200_SE_VTX_AOS_ATTR1011, "R200_SE_VTX_AOS_ATTR1011" },
  232.    { R200_SE_VTX_AOS_ADDR10, "R200_SE_VTX_AOS_ADDR10" },
  233.    { R200_SE_VTX_AOS_ADDR11, "R200_SE_VTX_AOS_ADDR11" },
  234.    { R200_SE_VF_MAX_VTX_INDX, "R200_SE_VF_MAX_VTX_INDX" },
  235.    { R200_SE_VF_MIN_VTX_INDX, "R200_SE_VF_MIN_VTX_INDX" },
  236.    { R200_SE_VTX_STATE_CNTL, "R200_SE_VTX_STATE_CNTL" },
  237.    { R200_SE_TCL_VECTOR_INDX_REG, "R200_SE_TCL_VECTOR_INDX_REG" },
  238.    { R200_SE_TCL_VECTOR_DATA_REG, "R200_SE_TCL_VECTOR_DATA_REG" },
  239.    { R200_SE_TCL_SCALAR_INDX_REG, "R200_SE_TCL_SCALAR_INDX_REG" },
  240.    { R200_SE_TCL_SCALAR_DATA_REG, "R200_SE_TCL_SCALAR_DATA_REG" },
  241.    { R200_SE_TCL_MATRIX_SEL_0, "R200_SE_TCL_MATRIX_SEL_0" },
  242.    { R200_SE_TCL_MATRIX_SEL_1, "R200_SE_TCL_MATRIX_SEL_1" },
  243.    { R200_SE_TCL_MATRIX_SEL_2, "R200_SE_TCL_MATRIX_SEL_2" },
  244.    { R200_SE_TCL_MATRIX_SEL_3, "R200_SE_TCL_MATRIX_SEL_3" },
  245.    { R200_SE_TCL_MATRIX_SEL_4, "R200_SE_TCL_MATRIX_SEL_4" },
  246.    { R200_SE_TCL_LIGHT_MODEL_CTL_0, "R200_SE_TCL_LIGHT_MODEL_CTL_0" },
  247.    { R200_SE_TCL_LIGHT_MODEL_CTL_1, "R200_SE_TCL_LIGHT_MODEL_CTL_1" },
  248.    { R200_SE_TCL_PER_LIGHT_CTL_0, "R200_SE_TCL_PER_LIGHT_CTL_0" },
  249.    { R200_SE_TCL_PER_LIGHT_CTL_1, "R200_SE_TCL_PER_LIGHT_CTL_1" },
  250.    { R200_SE_TCL_PER_LIGHT_CTL_2, "R200_SE_TCL_PER_LIGHT_CTL_2" },
  251.    { R200_SE_TCL_PER_LIGHT_CTL_3, "R200_SE_TCL_PER_LIGHT_CTL_3" },
  252.    { R200_SE_TCL_TEX_PROC_CTL_2, "R200_SE_TCL_TEX_PROC_CTL_2" },
  253.    { R200_SE_TCL_TEX_PROC_CTL_3, "R200_SE_TCL_TEX_PROC_CTL_3" },
  254.    { R200_SE_TCL_TEX_PROC_CTL_0, "R200_SE_TCL_TEX_PROC_CTL_0" },
  255.    { R200_SE_TCL_TEX_PROC_CTL_1, "R200_SE_TCL_TEX_PROC_CTL_1" },
  256.    { R200_SE_TC_TEX_CYL_WRAP_CTL, "R200_SE_TC_TEX_CYL_WRAP_CTL" },
  257.    { R200_SE_TCL_UCP_VERT_BLEND_CTL, "R200_SE_TCL_UCP_VERT_BLEND_CTL" },
  258.    { R200_SE_TCL_POINT_SPRITE_CNTL, "R200_SE_TCL_POINT_SPRITE_CNTL" },
  259.    { R200_SE_VTX_ST_POS_0_X_4, "R200_SE_VTX_ST_POS_0_X_4" },
  260.    { R200_SE_VTX_ST_POS_0_Y_4, "R200_SE_VTX_ST_POS_0_Y_4" },
  261.    { R200_SE_VTX_ST_POS_0_Z_4, "R200_SE_VTX_ST_POS_0_Z_4" },
  262.    { R200_SE_VTX_ST_POS_0_W_4, "R200_SE_VTX_ST_POS_0_W_4" },
  263.    { R200_SE_VTX_ST_NORM_0_X, "R200_SE_VTX_ST_NORM_0_X" },
  264.    { R200_SE_VTX_ST_NORM_0_Y, "R200_SE_VTX_ST_NORM_0_Y" },
  265.    { R200_SE_VTX_ST_NORM_0_Z, "R200_SE_VTX_ST_NORM_0_Z" },
  266.    { R200_SE_VTX_ST_PVMS, "R200_SE_VTX_ST_PVMS" },
  267.    { R200_SE_VTX_ST_CLR_0_R, "R200_SE_VTX_ST_CLR_0_R" },
  268.    { R200_SE_VTX_ST_CLR_0_G, "R200_SE_VTX_ST_CLR_0_G" },
  269.    { R200_SE_VTX_ST_CLR_0_B, "R200_SE_VTX_ST_CLR_0_B" },
  270.    { R200_SE_VTX_ST_CLR_0_A, "R200_SE_VTX_ST_CLR_0_A" },
  271.    { R200_SE_VTX_ST_CLR_1_R, "R200_SE_VTX_ST_CLR_1_R" },
  272.    { R200_SE_VTX_ST_CLR_1_G, "R200_SE_VTX_ST_CLR_1_G" },
  273.    { R200_SE_VTX_ST_CLR_1_B, "R200_SE_VTX_ST_CLR_1_B" },
  274.    { R200_SE_VTX_ST_CLR_1_A, "R200_SE_VTX_ST_CLR_1_A" },
  275.    { R200_SE_VTX_ST_CLR_2_R, "R200_SE_VTX_ST_CLR_2_R" },
  276.    { R200_SE_VTX_ST_CLR_2_G, "R200_SE_VTX_ST_CLR_2_G" },
  277.    { R200_SE_VTX_ST_CLR_2_B, "R200_SE_VTX_ST_CLR_2_B" },
  278.    { R200_SE_VTX_ST_CLR_2_A, "R200_SE_VTX_ST_CLR_2_A" },
  279.    { R200_SE_VTX_ST_CLR_3_R, "R200_SE_VTX_ST_CLR_3_R" },
  280.    { R200_SE_VTX_ST_CLR_3_G, "R200_SE_VTX_ST_CLR_3_G" },
  281.    { R200_SE_VTX_ST_CLR_3_B, "R200_SE_VTX_ST_CLR_3_B" },
  282.    { R200_SE_VTX_ST_CLR_3_A, "R200_SE_VTX_ST_CLR_3_A" },
  283.    { R200_SE_VTX_ST_CLR_4_R, "R200_SE_VTX_ST_CLR_4_R" },
  284.    { R200_SE_VTX_ST_CLR_4_G, "R200_SE_VTX_ST_CLR_4_G" },
  285.    { R200_SE_VTX_ST_CLR_4_B, "R200_SE_VTX_ST_CLR_4_B" },
  286.    { R200_SE_VTX_ST_CLR_4_A, "R200_SE_VTX_ST_CLR_4_A" },
  287.    { R200_SE_VTX_ST_CLR_5_R, "R200_SE_VTX_ST_CLR_5_R" },
  288.    { R200_SE_VTX_ST_CLR_5_G, "R200_SE_VTX_ST_CLR_5_G" },
  289.    { R200_SE_VTX_ST_CLR_5_B, "R200_SE_VTX_ST_CLR_5_B" },
  290.    { R200_SE_VTX_ST_CLR_5_A, "R200_SE_VTX_ST_CLR_5_A" },
  291.    { R200_SE_VTX_ST_CLR_6_R, "R200_SE_VTX_ST_CLR_6_R" },
  292.    { R200_SE_VTX_ST_CLR_6_G, "R200_SE_VTX_ST_CLR_6_G" },
  293.    { R200_SE_VTX_ST_CLR_6_B, "R200_SE_VTX_ST_CLR_6_B" },
  294.    { R200_SE_VTX_ST_CLR_6_A, "R200_SE_VTX_ST_CLR_6_A" },
  295.    { R200_SE_VTX_ST_CLR_7_R, "R200_SE_VTX_ST_CLR_7_R" },
  296.    { R200_SE_VTX_ST_CLR_7_G, "R200_SE_VTX_ST_CLR_7_G" },
  297.    { R200_SE_VTX_ST_CLR_7_B, "R200_SE_VTX_ST_CLR_7_B" },
  298.    { R200_SE_VTX_ST_CLR_7_A, "R200_SE_VTX_ST_CLR_7_A" },
  299.    { R200_SE_VTX_ST_TEX_0_S, "R200_SE_VTX_ST_TEX_0_S" },
  300.    { R200_SE_VTX_ST_TEX_0_T, "R200_SE_VTX_ST_TEX_0_T" },
  301.    { R200_SE_VTX_ST_TEX_0_R, "R200_SE_VTX_ST_TEX_0_R" },
  302.    { R200_SE_VTX_ST_TEX_0_Q, "R200_SE_VTX_ST_TEX_0_Q" },
  303.    { R200_SE_VTX_ST_TEX_1_S, "R200_SE_VTX_ST_TEX_1_S" },
  304.    { R200_SE_VTX_ST_TEX_1_T, "R200_SE_VTX_ST_TEX_1_T" },
  305.    { R200_SE_VTX_ST_TEX_1_R, "R200_SE_VTX_ST_TEX_1_R" },
  306.    { R200_SE_VTX_ST_TEX_1_Q, "R200_SE_VTX_ST_TEX_1_Q" },
  307.    { R200_SE_VTX_ST_TEX_2_S, "R200_SE_VTX_ST_TEX_2_S" },
  308.    { R200_SE_VTX_ST_TEX_2_T, "R200_SE_VTX_ST_TEX_2_T" },
  309.    { R200_SE_VTX_ST_TEX_2_R, "R200_SE_VTX_ST_TEX_2_R" },
  310.    { R200_SE_VTX_ST_TEX_2_Q, "R200_SE_VTX_ST_TEX_2_Q" },
  311.    { R200_SE_VTX_ST_TEX_3_S, "R200_SE_VTX_ST_TEX_3_S" },
  312.    { R200_SE_VTX_ST_TEX_3_T, "R200_SE_VTX_ST_TEX_3_T" },
  313.    { R200_SE_VTX_ST_TEX_3_R, "R200_SE_VTX_ST_TEX_3_R" },
  314.    { R200_SE_VTX_ST_TEX_3_Q, "R200_SE_VTX_ST_TEX_3_Q" },
  315.    { R200_SE_VTX_ST_TEX_4_S, "R200_SE_VTX_ST_TEX_4_S" },
  316.    { R200_SE_VTX_ST_TEX_4_T, "R200_SE_VTX_ST_TEX_4_T" },
  317.    { R200_SE_VTX_ST_TEX_4_R, "R200_SE_VTX_ST_TEX_4_R" },
  318.    { R200_SE_VTX_ST_TEX_4_Q, "R200_SE_VTX_ST_TEX_4_Q" },
  319.    { R200_SE_VTX_ST_TEX_5_S, "R200_SE_VTX_ST_TEX_5_S" },
  320.    { R200_SE_VTX_ST_TEX_5_T, "R200_SE_VTX_ST_TEX_5_T" },
  321.    { R200_SE_VTX_ST_TEX_5_R, "R200_SE_VTX_ST_TEX_5_R" },
  322.    { R200_SE_VTX_ST_TEX_5_Q, "R200_SE_VTX_ST_TEX_5_Q" },
  323.    { R200_SE_VTX_ST_PNT_SPRT_SZ, "R200_SE_VTX_ST_PNT_SPRT_SZ" },
  324.    { R200_SE_VTX_ST_DISC_FOG, "R200_SE_VTX_ST_DISC_FOG" },
  325.    { R200_SE_VTX_ST_SHININESS_0, "R200_SE_VTX_ST_SHININESS_0" },
  326.    { R200_SE_VTX_ST_SHININESS_1, "R200_SE_VTX_ST_SHININESS_1" },
  327.    { R200_SE_VTX_ST_BLND_WT_0, "R200_SE_VTX_ST_BLND_WT_0" },
  328.    { R200_SE_VTX_ST_BLND_WT_1, "R200_SE_VTX_ST_BLND_WT_1" },
  329.    { R200_SE_VTX_ST_BLND_WT_2, "R200_SE_VTX_ST_BLND_WT_2" },
  330.    { R200_SE_VTX_ST_BLND_WT_3, "R200_SE_VTX_ST_BLND_WT_3" },
  331.    { R200_SE_VTX_ST_POS_1_X, "R200_SE_VTX_ST_POS_1_X" },
  332.    { R200_SE_VTX_ST_POS_1_Y, "R200_SE_VTX_ST_POS_1_Y" },
  333.    { R200_SE_VTX_ST_POS_1_Z, "R200_SE_VTX_ST_POS_1_Z" },
  334.    { R200_SE_VTX_ST_POS_1_W, "R200_SE_VTX_ST_POS_1_W" },
  335.    { R200_SE_VTX_ST_NORM_1_X, "R200_SE_VTX_ST_NORM_1_X" },
  336.    { R200_SE_VTX_ST_NORM_1_Y, "R200_SE_VTX_ST_NORM_1_Y" },
  337.    { R200_SE_VTX_ST_NORM_1_Z, "R200_SE_VTX_ST_NORM_1_Z" },
  338.    { R200_SE_VTX_ST_USR_CLR_0_R, "R200_SE_VTX_ST_USR_CLR_0_R" },
  339.    { R200_SE_VTX_ST_USR_CLR_0_G, "R200_SE_VTX_ST_USR_CLR_0_G" },
  340.    { R200_SE_VTX_ST_USR_CLR_0_B, "R200_SE_VTX_ST_USR_CLR_0_B" },
  341.    { R200_SE_VTX_ST_USR_CLR_0_A, "R200_SE_VTX_ST_USR_CLR_0_A" },
  342.    { R200_SE_VTX_ST_USR_CLR_1_R, "R200_SE_VTX_ST_USR_CLR_1_R" },
  343.    { R200_SE_VTX_ST_USR_CLR_1_G, "R200_SE_VTX_ST_USR_CLR_1_G" },
  344.    { R200_SE_VTX_ST_USR_CLR_1_B, "R200_SE_VTX_ST_USR_CLR_1_B" },
  345.    { R200_SE_VTX_ST_USR_CLR_1_A, "R200_SE_VTX_ST_USR_CLR_1_A" },
  346.    { R200_SE_VTX_ST_CLR_0_PKD, "R200_SE_VTX_ST_CLR_0_PKD" },
  347.    { R200_SE_VTX_ST_CLR_1_PKD, "R200_SE_VTX_ST_CLR_1_PKD" },
  348.    { R200_SE_VTX_ST_CLR_2_PKD, "R200_SE_VTX_ST_CLR_2_PKD" },
  349.    { R200_SE_VTX_ST_CLR_3_PKD, "R200_SE_VTX_ST_CLR_3_PKD" },
  350.    { R200_SE_VTX_ST_CLR_4_PKD, "R200_SE_VTX_ST_CLR_4_PKD" },
  351.    { R200_SE_VTX_ST_CLR_5_PKD, "R200_SE_VTX_ST_CLR_5_PKD" },
  352.    { R200_SE_VTX_ST_CLR_6_PKD, "R200_SE_VTX_ST_CLR_6_PKD" },
  353.    { R200_SE_VTX_ST_CLR_7_PKD, "R200_SE_VTX_ST_CLR_7_PKD" },
  354.    { R200_SE_VTX_ST_POS_0_X_2, "R200_SE_VTX_ST_POS_0_X_2" },
  355.    { R200_SE_VTX_ST_POS_0_Y_2, "R200_SE_VTX_ST_POS_0_Y_2" },
  356.    { R200_SE_VTX_ST_PAR_CLR_LD, "R200_SE_VTX_ST_PAR_CLR_LD" },
  357.    { R200_SE_VTX_ST_USR_CLR_PKD, "R200_SE_VTX_ST_USR_CLR_PKD" },
  358.    { R200_SE_VTX_ST_POS_0_X_3, "R200_SE_VTX_ST_POS_0_X_3" },
  359.    { R200_SE_VTX_ST_POS_0_Y_3, "R200_SE_VTX_ST_POS_0_Y_3" },
  360.    { R200_SE_VTX_ST_POS_0_Z_3, "R200_SE_VTX_ST_POS_0_Z_3" },
  361.    { R200_SE_VTX_ST_END_OF_PKT, "R200_SE_VTX_ST_END_OF_PKT" },
  362.    { R200_RE_POINTSIZE, "R200_RE_POINTSIZE" },
  363.    { R200_RE_TOP_LEFT, "R200_RE_TOP_LEFT" },
  364.    { R200_RE_AUX_SCISSOR_CNTL, "R200_RE_AUX_SCISSOR_CNTL" },
  365.    { R200_PP_TXFILTER_0, "R200_PP_TXFILTER_0" },
  366.    { R200_PP_TXFORMAT_0, "R200_PP_TXFORMAT_0" },
  367.    { R200_PP_TXSIZE_0, "R200_PP_TXSIZE_0" },
  368.    { R200_PP_TXFORMAT_X_0, "R200_PP_TXFORMAT_X_0" },
  369.    { R200_PP_TXPITCH_0, "R200_PP_TXPITCH_0" },
  370.    { R200_PP_BORDER_COLOR_0, "R200_PP_BORDER_COLOR_0" },
  371.    { R200_PP_CUBIC_FACES_0, "R200_PP_CUBIC_FACES_0" },
  372.    { R200_PP_TXMULTI_CTL_0, "R200_PP_TXMULTI_CTL_0" },
  373.    { R200_PP_TXFILTER_1, "R200_PP_TXFILTER_1" },
  374.    { R200_PP_TXFORMAT_1, "R200_PP_TXFORMAT_1" },
  375.    { R200_PP_TXSIZE_1, "R200_PP_TXSIZE_1" },
  376.    { R200_PP_TXFORMAT_X_1, "R200_PP_TXFORMAT_X_1" },
  377.    { R200_PP_TXPITCH_1, "R200_PP_TXPITCH_1" },
  378.    { R200_PP_BORDER_COLOR_1, "R200_PP_BORDER_COLOR_1" },
  379.    { R200_PP_CUBIC_FACES_1, "R200_PP_CUBIC_FACES_1" },
  380.    { R200_PP_TXMULTI_CTL_1, "R200_PP_TXMULTI_CTL_1" },
  381.    { R200_PP_TXFILTER_2, "R200_PP_TXFILTER_2" },
  382.    { R200_PP_TXFORMAT_2, "R200_PP_TXFORMAT_2" },
  383.    { R200_PP_TXSIZE_2, "R200_PP_TXSIZE_2" },
  384.    { R200_PP_TXFORMAT_X_2, "R200_PP_TXFORMAT_X_2" },
  385.    { R200_PP_TXPITCH_2, "R200_PP_TXPITCH_2" },
  386.    { R200_PP_BORDER_COLOR_2, "R200_PP_BORDER_COLOR_2" },
  387.    { R200_PP_CUBIC_FACES_2, "R200_PP_CUBIC_FACES_2" },
  388.    { R200_PP_TXMULTI_CTL_2, "R200_PP_TXMULTI_CTL_2" },
  389.    { R200_PP_TXFILTER_3, "R200_PP_TXFILTER_3" },
  390.    { R200_PP_TXFORMAT_3, "R200_PP_TXFORMAT_3" },
  391.    { R200_PP_TXSIZE_3, "R200_PP_TXSIZE_3" },
  392.    { R200_PP_TXFORMAT_X_3, "R200_PP_TXFORMAT_X_3" },
  393.    { R200_PP_TXPITCH_3, "R200_PP_TXPITCH_3" },
  394.    { R200_PP_BORDER_COLOR_3, "R200_PP_BORDER_COLOR_3" },
  395.    { R200_PP_CUBIC_FACES_3, "R200_PP_CUBIC_FACES_3" },
  396.    { R200_PP_TXMULTI_CTL_3, "R200_PP_TXMULTI_CTL_3" },
  397.    { R200_PP_TXFILTER_4, "R200_PP_TXFILTER_4" },
  398.    { R200_PP_TXFORMAT_4, "R200_PP_TXFORMAT_4" },
  399.    { R200_PP_TXSIZE_4, "R200_PP_TXSIZE_4" },
  400.    { R200_PP_TXFORMAT_X_4, "R200_PP_TXFORMAT_X_4" },
  401.    { R200_PP_TXPITCH_4, "R200_PP_TXPITCH_4" },
  402.    { R200_PP_BORDER_COLOR_4, "R200_PP_BORDER_COLOR_4" },
  403.    { R200_PP_CUBIC_FACES_4, "R200_PP_CUBIC_FACES_4" },
  404.    { R200_PP_TXMULTI_CTL_4, "R200_PP_TXMULTI_CTL_4" },
  405.    { R200_PP_TXFILTER_5, "R200_PP_TXFILTER_5" },
  406.    { R200_PP_TXFORMAT_5, "R200_PP_TXFORMAT_5" },
  407.    { R200_PP_TXSIZE_5, "R200_PP_TXSIZE_5" },
  408.    { R200_PP_TXFORMAT_X_5, "R200_PP_TXFORMAT_X_5" },
  409.    { R200_PP_TXPITCH_5, "R200_PP_TXPITCH_5" },
  410.    { R200_PP_BORDER_COLOR_5, "R200_PP_BORDER_COLOR_5" },
  411.    { R200_PP_CUBIC_FACES_5, "R200_PP_CUBIC_FACES_5" },
  412.    { R200_PP_TXMULTI_CTL_5, "R200_PP_TXMULTI_CTL_5" },
  413.    { R200_PP_TXOFFSET_0, "R200_PP_TXOFFSET_0" },
  414.    { R200_PP_CUBIC_OFFSET_F1_0, "R200_PP_CUBIC_OFFSET_F1_0" },
  415.    { R200_PP_CUBIC_OFFSET_F2_0, "R200_PP_CUBIC_OFFSET_F2_0" },
  416.    { R200_PP_CUBIC_OFFSET_F3_0, "R200_PP_CUBIC_OFFSET_F3_0" },
  417.    { R200_PP_CUBIC_OFFSET_F4_0, "R200_PP_CUBIC_OFFSET_F4_0" },
  418.    { R200_PP_CUBIC_OFFSET_F5_0, "R200_PP_CUBIC_OFFSET_F5_0" },
  419.    { R200_PP_TXOFFSET_1, "R200_PP_TXOFFSET_1" },
  420.    { R200_PP_CUBIC_OFFSET_F1_1, "R200_PP_CUBIC_OFFSET_F1_1" },
  421.    { R200_PP_CUBIC_OFFSET_F2_1, "R200_PP_CUBIC_OFFSET_F2_1" },
  422.    { R200_PP_CUBIC_OFFSET_F3_1, "R200_PP_CUBIC_OFFSET_F3_1" },
  423.    { R200_PP_CUBIC_OFFSET_F4_1, "R200_PP_CUBIC_OFFSET_F4_1" },
  424.    { R200_PP_CUBIC_OFFSET_F5_1, "R200_PP_CUBIC_OFFSET_F5_1" },
  425.    { R200_PP_TXOFFSET_2, "R200_PP_TXOFFSET_2" },
  426.    { R200_PP_CUBIC_OFFSET_F1_2, "R200_PP_CUBIC_OFFSET_F1_2" },
  427.    { R200_PP_CUBIC_OFFSET_F2_2, "R200_PP_CUBIC_OFFSET_F2_2" },
  428.    { R200_PP_CUBIC_OFFSET_F3_2, "R200_PP_CUBIC_OFFSET_F3_2" },
  429.    { R200_PP_CUBIC_OFFSET_F4_2, "R200_PP_CUBIC_OFFSET_F4_2" },
  430.    { R200_PP_CUBIC_OFFSET_F5_2, "R200_PP_CUBIC_OFFSET_F5_2" },
  431.    { R200_PP_TXOFFSET_3, "R200_PP_TXOFFSET_3" },
  432.    { R200_PP_CUBIC_OFFSET_F1_3, "R200_PP_CUBIC_OFFSET_F1_3" },
  433.    { R200_PP_CUBIC_OFFSET_F2_3, "R200_PP_CUBIC_OFFSET_F2_3" },
  434.    { R200_PP_CUBIC_OFFSET_F3_3, "R200_PP_CUBIC_OFFSET_F3_3" },
  435.    { R200_PP_CUBIC_OFFSET_F4_3, "R200_PP_CUBIC_OFFSET_F4_3" },
  436.    { R200_PP_CUBIC_OFFSET_F5_3, "R200_PP_CUBIC_OFFSET_F5_3" },
  437.    { R200_PP_TXOFFSET_4, "R200_PP_TXOFFSET_4" },
  438.    { R200_PP_CUBIC_OFFSET_F1_4, "R200_PP_CUBIC_OFFSET_F1_4" },
  439.    { R200_PP_CUBIC_OFFSET_F2_4, "R200_PP_CUBIC_OFFSET_F2_4" },
  440.    { R200_PP_CUBIC_OFFSET_F3_4, "R200_PP_CUBIC_OFFSET_F3_4" },
  441.    { R200_PP_CUBIC_OFFSET_F4_4, "R200_PP_CUBIC_OFFSET_F4_4" },
  442.    { R200_PP_CUBIC_OFFSET_F5_4, "R200_PP_CUBIC_OFFSET_F5_4" },
  443.    { R200_PP_TXOFFSET_5, "R200_PP_TXOFFSET_5" },
  444.    { R200_PP_CUBIC_OFFSET_F1_5, "R200_PP_CUBIC_OFFSET_F1_5" },
  445.    { R200_PP_CUBIC_OFFSET_F2_5, "R200_PP_CUBIC_OFFSET_F2_5" },
  446.    { R200_PP_CUBIC_OFFSET_F3_5, "R200_PP_CUBIC_OFFSET_F3_5" },
  447.    { R200_PP_CUBIC_OFFSET_F4_5, "R200_PP_CUBIC_OFFSET_F4_5" },
  448.    { R200_PP_CUBIC_OFFSET_F5_5, "R200_PP_CUBIC_OFFSET_F5_5" },
  449.    { R200_PP_TAM_DEBUG3, "R200_PP_TAM_DEBUG3" },
  450.    { R200_PP_TFACTOR_0, "R200_PP_TFACTOR_0" },
  451.    { R200_PP_TFACTOR_1, "R200_PP_TFACTOR_1" },
  452.    { R200_PP_TFACTOR_2, "R200_PP_TFACTOR_2" },
  453.    { R200_PP_TFACTOR_3, "R200_PP_TFACTOR_3" },
  454.    { R200_PP_TFACTOR_4, "R200_PP_TFACTOR_4" },
  455.    { R200_PP_TFACTOR_5, "R200_PP_TFACTOR_5" },
  456.    { R200_PP_TFACTOR_6, "R200_PP_TFACTOR_6" },
  457.    { R200_PP_TFACTOR_7, "R200_PP_TFACTOR_7" },
  458.    { R200_PP_TXCBLEND_0, "R200_PP_TXCBLEND_0" },
  459.    { R200_PP_TXCBLEND2_0, "R200_PP_TXCBLEND2_0" },
  460.    { R200_PP_TXABLEND_0, "R200_PP_TXABLEND_0" },
  461.    { R200_PP_TXABLEND2_0, "R200_PP_TXABLEND2_0" },
  462.    { R200_PP_TXCBLEND_1, "R200_PP_TXCBLEND_1" },
  463.    { R200_PP_TXCBLEND2_1, "R200_PP_TXCBLEND2_1" },
  464.    { R200_PP_TXABLEND_1, "R200_PP_TXABLEND_1" },
  465.    { R200_PP_TXABLEND2_1, "R200_PP_TXABLEND2_1" },
  466.    { R200_PP_TXCBLEND_2, "R200_PP_TXCBLEND_2" },
  467.    { R200_PP_TXCBLEND2_2, "R200_PP_TXCBLEND2_2" },
  468.    { R200_PP_TXABLEND_2, "R200_PP_TXABLEND_2" },
  469.    { R200_PP_TXABLEND2_2, "R200_PP_TXABLEND2_2" },
  470.    { R200_PP_TXCBLEND_3, "R200_PP_TXCBLEND_3" },
  471.    { R200_PP_TXCBLEND2_3, "R200_PP_TXCBLEND2_3" },
  472.    { R200_PP_TXABLEND_3, "R200_PP_TXABLEND_3" },
  473.    { R200_PP_TXABLEND2_3, "R200_PP_TXABLEND2_3" },
  474.    { R200_PP_TXCBLEND_4, "R200_PP_TXCBLEND_4" },
  475.    { R200_PP_TXCBLEND2_4, "R200_PP_TXCBLEND2_4" },
  476.    { R200_PP_TXABLEND_4, "R200_PP_TXABLEND_4" },
  477.    { R200_PP_TXABLEND2_4, "R200_PP_TXABLEND2_4" },
  478.    { R200_PP_TXCBLEND_5, "R200_PP_TXCBLEND_5" },
  479.    { R200_PP_TXCBLEND2_5, "R200_PP_TXCBLEND2_5" },
  480.    { R200_PP_TXABLEND_5, "R200_PP_TXABLEND_5" },
  481.    { R200_PP_TXABLEND2_5, "R200_PP_TXABLEND2_5" },
  482.    { R200_PP_TXCBLEND_6, "R200_PP_TXCBLEND_6" },
  483.    { R200_PP_TXCBLEND2_6, "R200_PP_TXCBLEND2_6" },
  484.    { R200_PP_TXABLEND_6, "R200_PP_TXABLEND_6" },
  485.    { R200_PP_TXABLEND2_6, "R200_PP_TXABLEND2_6" },
  486.    { R200_PP_TXCBLEND_7, "R200_PP_TXCBLEND_7" },
  487.    { R200_PP_TXCBLEND2_7, "R200_PP_TXCBLEND2_7" },
  488.    { R200_PP_TXABLEND_7, "R200_PP_TXABLEND_7" },
  489.    { R200_PP_TXABLEND2_7, "R200_PP_TXABLEND2_7" },
  490.    { R200_RB3D_BLENDCOLOR, "R200_RB3D_BLENDCOLOR" },
  491.    { R200_RB3D_ABLENDCNTL, "R200_RB3D_ABLENDCNTL" },
  492.    { R200_RB3D_CBLENDCNTL, "R200_RB3D_CBLENDCNTL" },
  493.    { R200_SE_TCL_OUTPUT_VTX_COMP_SEL, "R200_SE_TCL_OUTPUT_VTX_COMP_SEL" },
  494.    { R200_PP_CNTL_X, "R200_PP_CNTL_X" },
  495.    { R200_SE_VAP_CNTL_STATUS, "R200_SE_VAP_CNTL_STATUS" },
  496.    { R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0, "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0" },
  497.    { R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_1, "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_1" },
  498.    { R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_2, "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_2" },
  499.    { R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_3, "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_3" },
  500.    { R200_PP_TRI_PERF, "R200_PP_TRI_PERF" },
  501.    { R200_PP_PERF_CNTL, "R200_PP_PERF_CNTL" },
  502.    { R200_PP_TXCBLEND_8, "R200_PP_TXCBLEND_8" },
  503.    { R200_PP_TXCBLEND2_8, "R200_PP_TXCBLEND2_8" },
  504.    { R200_PP_TXABLEND_8, "R200_PP_TXABLEND_8" },
  505.    { R200_PP_TXABLEND2_8, "R200_PP_TXABLEND2_8" },
  506.    { R200_PP_TXCBLEND_9, "R200_PP_TXCBLEND_9" },
  507.    { R200_PP_TXCBLEND2_9, "R200_PP_TXCBLEND2_9" },
  508.    { R200_PP_TXABLEND_9, "R200_PP_TXABLEND_9" },
  509.    { R200_PP_TXABLEND2_9, "R200_PP_TXABLEND2_9" },
  510.    { R200_PP_TXCBLEND_10, "R200_PP_TXCBLEND_10" },
  511.    { R200_PP_TXCBLEND2_10, "R200_PP_TXCBLEND2_10" },
  512.    { R200_PP_TXABLEND_10, "R200_PP_TXABLEND_10" },
  513.    { R200_PP_TXABLEND2_10, "R200_PP_TXABLEND2_10" },
  514.    { R200_PP_TXCBLEND_11, "R200_PP_TXCBLEND_11" },
  515.    { R200_PP_TXCBLEND2_11, "R200_PP_TXCBLEND2_11" },
  516.    { R200_PP_TXABLEND_11, "R200_PP_TXABLEND_11" },
  517.    { R200_PP_TXABLEND2_11, "R200_PP_TXABLEND2_11" },
  518.    { R200_PP_TXCBLEND_12, "R200_PP_TXCBLEND_12" },
  519.    { R200_PP_TXCBLEND2_12, "R200_PP_TXCBLEND2_12" },
  520.    { R200_PP_TXABLEND_12, "R200_PP_TXABLEND_12" },
  521.    { R200_PP_TXABLEND2_12, "R200_PP_TXABLEND2_12" },
  522.    { R200_PP_TXCBLEND_13, "R200_PP_TXCBLEND_13" },
  523.    { R200_PP_TXCBLEND2_13, "R200_PP_TXCBLEND2_13" },
  524.    { R200_PP_TXABLEND_13, "R200_PP_TXABLEND_13" },
  525.    { R200_PP_TXABLEND2_13, "R200_PP_TXABLEND2_13" },
  526.    { R200_PP_TXCBLEND_14, "R200_PP_TXCBLEND_14" },
  527.    { R200_PP_TXCBLEND2_14, "R200_PP_TXCBLEND2_14" },
  528.    { R200_PP_TXABLEND_14, "R200_PP_TXABLEND_14" },
  529.    { R200_PP_TXABLEND2_14, "R200_PP_TXABLEND2_14" },
  530.    { R200_PP_TXCBLEND_15, "R200_PP_TXCBLEND_15" },
  531.    { R200_PP_TXCBLEND2_15, "R200_PP_TXCBLEND2_15" },
  532.    { R200_PP_TXABLEND_15, "R200_PP_TXABLEND_15" },
  533.    { R200_PP_TXABLEND2_15, "R200_PP_TXABLEND2_15" },
  534.    { R200_VAP_PVS_CNTL_1, "R200_VAP_PVS_CNTL_1" },
  535.    { R200_VAP_PVS_CNTL_2, "R200_VAP_PVS_CNTL_2" },
  536. };
  537.  
  538. static struct reg_names scalar_names[] = {
  539.    { R200_SS_LIGHT_DCD_ADDR, "R200_SS_LIGHT_DCD_ADDR" },
  540.    { R200_SS_LIGHT_DCM_ADDR, "R200_SS_LIGHT_DCM_ADDR" },
  541.    { R200_SS_LIGHT_SPOT_EXPONENT_ADDR, "R200_SS_LIGHT_SPOT_EXPONENT_ADDR" },
  542.    { R200_SS_LIGHT_SPOT_CUTOFF_ADDR, "R200_SS_LIGHT_SPOT_CUTOFF_ADDR" },
  543.    { R200_SS_LIGHT_SPECULAR_THRESH_ADDR, "R200_SS_LIGHT_SPECULAR_THRESH_ADDR" },
  544.    { R200_SS_LIGHT_RANGE_CUTOFF_SQRD, "R200_SS_LIGHT_RANGE_CUTOFF_SQRD" },
  545.    { R200_SS_LIGHT_RANGE_ATT_CONST, "R200_SS_LIGHT_RANGE_ATT_CONST" },
  546.    { R200_SS_VERT_GUARD_CLIP_ADJ_ADDR, "R200_SS_VERT_GUARD_CLIP_ADJ_ADDR" },
  547.    { R200_SS_VERT_GUARD_DISCARD_ADJ_ADDR, "R200_SS_VERT_GUARD_DISCARD_ADJ_ADDR" },
  548.    { R200_SS_HORZ_GUARD_CLIP_ADJ_ADDR, "R200_SS_HORZ_GUARD_CLIP_ADJ_ADDR" },
  549.    { R200_SS_HORZ_GUARD_DISCARD_ADJ_ADDR, "R200_SS_HORZ_GUARD_DISCARD_ADJ_ADDR" },
  550.    { R200_SS_MAT_0_SHININESS, "R200_SS_MAT_0_SHININESS" },
  551.    { R200_SS_MAT_1_SHININESS, "R200_SS_MAT_1_SHININESS" },
  552.    { 1000, "" },
  553. };
  554.  
  555. /* Puff these out to make them look like normal (dword) registers.
  556.  */
  557. static struct reg_names vector_names[] = {
  558.    { 0, "start" },
  559.    { R200_VS_LIGHT_AMBIENT_ADDR, "R200_VS_LIGHT_AMBIENT_ADDR" },
  560.    { R200_VS_LIGHT_DIFFUSE_ADDR, "R200_VS_LIGHT_DIFFUSE_ADDR" },
  561.    { R200_VS_LIGHT_SPECULAR_ADDR, "R200_VS_LIGHT_SPECULAR_ADDR" },
  562.    { R200_VS_LIGHT_DIRPOS_ADDR, "R200_VS_LIGHT_DIRPOS_ADDR" },
  563.    { R200_VS_LIGHT_HWVSPOT_ADDR, "R200_VS_LIGHT_HWVSPOT_ADDR" },
  564.    { R200_VS_LIGHT_ATTENUATION_ADDR, "R200_VS_LIGHT_ATTENUATION_ADDR" },
  565.    { R200_VS_SPOT_DUAL_CONE, "R200_VS_SPOT_DUAL_CONE" },
  566.    { R200_VS_GLOBAL_AMBIENT_ADDR, "R200_VS_GLOBAL_AMBIENT_ADDR" },
  567.    { R200_VS_FOG_PARAM_ADDR, "R200_VS_FOG_PARAM_ADDR" },
  568.    { R200_VS_EYE_VECTOR_ADDR, "R200_VS_EYE_VECTOR_ADDR" },
  569.    { R200_VS_UCP_ADDR, "R200_VS_UCP_ADDR" },
  570.    { R200_VS_PNT_SPRITE_VPORT_SCALE, "R200_VS_PNT_SPRITE_VPORT_SCALE" },
  571.    { R200_VS_MATRIX_0_MV, "R200_VS_MATRIX_0_MV" },
  572.    { R200_VS_MATRIX_1_INV_MV, "R200_VS_MATRIX_1_INV_MV" },
  573.    { R200_VS_MATRIX_2_MVP, "R200_VS_MATRIX_2_MVP" },
  574.    { R200_VS_MATRIX_3_TEX0, "R200_VS_MATRIX_3_TEX0" },
  575.    { R200_VS_MATRIX_4_TEX1, "R200_VS_MATRIX_4_TEX1" },
  576.    { R200_VS_MATRIX_5_TEX2, "R200_VS_MATRIX_5_TEX2" },
  577.    { R200_VS_MATRIX_6_TEX3, "R200_VS_MATRIX_6_TEX3" },
  578.    { R200_VS_MATRIX_7_TEX4, "R200_VS_MATRIX_7_TEX4" },
  579.    { R200_VS_MATRIX_8_TEX5, "R200_VS_MATRIX_8_TEX5" },
  580.    { R200_VS_MAT_0_EMISS, "R200_VS_MAT_0_EMISS" },
  581.    { R200_VS_MAT_0_AMB, "R200_VS_MAT_0_AMB" },
  582.    { R200_VS_MAT_0_DIF, "R200_VS_MAT_0_DIF" },
  583.    { R200_VS_MAT_0_SPEC, "R200_VS_MAT_0_SPEC" },
  584.    { R200_VS_MAT_1_EMISS, "R200_VS_MAT_1_EMISS" },
  585.    { R200_VS_MAT_1_AMB, "R200_VS_MAT_1_AMB" },
  586.    { R200_VS_MAT_1_DIF, "R200_VS_MAT_1_DIF" },
  587.    { R200_VS_MAT_1_SPEC, "R200_VS_MAT_1_SPEC" },
  588.    { R200_VS_EYE2CLIP_MTX, "R200_VS_EYE2CLIP_MTX" },
  589.    { R200_VS_PNT_SPRITE_ATT_CONST, "R200_VS_PNT_SPRITE_ATT_CONST" },
  590.    { R200_VS_PNT_SPRITE_EYE_IN_MODEL, "R200_VS_PNT_SPRITE_EYE_IN_MODEL" },
  591.    { R200_VS_PNT_SPRITE_CLAMP, "R200_VS_PNT_SPRITE_CLAMP" },
  592.    { R200_VS_MAX, "R200_VS_MAX" },
  593.    { 1000, "" },
  594. };
  595.  
  596. union fi { float f; int i; };
  597.  
  598. #define ISVEC   1
  599. #define ISFLOAT 2
  600. #define TOUCHED 4
  601.  
  602. struct reg {
  603.    int idx;
  604.    struct reg_names *closest;
  605.    int flags;
  606.    union fi current;
  607.    union fi *values;
  608.    int nvalues;
  609.    int nalloc;
  610.    float vmin, vmax;
  611. };
  612.  
  613.  
  614. static struct reg regs[Elements(reg_names)+1];
  615. static struct reg scalars[512+1];
  616. static struct reg vectors[512*4+1];
  617.  
  618. static int total, total_changed, bufs;
  619.  
  620. static void init_regs( void )
  621. {
  622.    struct reg_names *tmp;
  623.    int i;
  624.  
  625.    for (i = 0 ; i < Elements(regs) ; i++) {
  626.       regs[i].idx = reg_names[i].idx;
  627.       regs[i].closest = &reg_names[i];
  628.       regs[i].flags = 0;
  629.    }
  630.  
  631.    for (i = 0, tmp = scalar_names ; i < Elements(scalars) ; i++) {
  632.       if (tmp[1].idx == i) tmp++;
  633.       scalars[i].idx = i;
  634.       scalars[i].closest = tmp;
  635.       scalars[i].flags = ISFLOAT;
  636.    }
  637.  
  638.    for (i = 0, tmp = vector_names ; i < Elements(vectors) ; i++) {
  639.       if (tmp[1].idx*4 == i) tmp++;
  640.       vectors[i].idx = i;
  641.       vectors[i].closest = tmp;
  642.       vectors[i].flags = ISFLOAT|ISVEC;
  643.    }
  644.  
  645.    regs[Elements(regs)-1].idx = -1;
  646.    scalars[Elements(scalars)-1].idx = -1;
  647.    vectors[Elements(vectors)-1].idx = -1;
  648. }
  649.  
  650. static int find_or_add_value( struct reg *reg, int val )
  651. {
  652.    int j;
  653.  
  654.    for ( j = 0 ; j < reg->nvalues ; j++)
  655.       if ( val == reg->values[j].i )
  656.          return 1;
  657.  
  658.    if (j == reg->nalloc) {
  659.       reg->nalloc += 5;
  660.       reg->nalloc *= 2;
  661.       reg->values = realloc( reg->values, reg->nalloc * sizeof(union fi) );
  662.    }
  663.  
  664.    reg->values[reg->nvalues++].i = val;
  665.    return 0;
  666. }
  667.  
  668. static struct reg *lookup_reg( struct reg *tab, int reg )
  669. {
  670.    int i;
  671.  
  672.    for (i = 0 ; tab[i].idx != -1 ; i++) {
  673.       if (tab[i].idx == reg)
  674.          return &tab[i];
  675.    }
  676.  
  677.    fprintf(stderr, "*** unknown reg 0x%x\n", reg);
  678.    return NULL;
  679. }
  680.  
  681.  
  682. static const char *get_reg_name( struct reg *reg )
  683. {
  684.    static char tmp[80];
  685.  
  686.    if (reg->idx == reg->closest->idx)
  687.       return reg->closest->name;
  688.  
  689.    
  690.    if (reg->flags & ISVEC) {
  691.       if (reg->idx/4 != reg->closest->idx)
  692.          sprintf(tmp, "%s+%d[%d]",
  693.                  reg->closest->name,
  694.                  (reg->idx/4) - reg->closest->idx,
  695.                  reg->idx%4);
  696.       else
  697.          sprintf(tmp, "%s[%d]", reg->closest->name, reg->idx%4);
  698.    }
  699.    else {
  700.       if (reg->idx != reg->closest->idx)
  701.          sprintf(tmp, "%s+%d", reg->closest->name, reg->idx - reg->closest->idx);
  702.       else
  703.          sprintf(tmp, "%s", reg->closest->name);
  704.    }
  705.  
  706.    return tmp;
  707. }
  708.  
  709. static int print_int_reg_assignment( struct reg *reg, int data )
  710. {
  711.    int changed = (reg->current.i != data);
  712.    int ever_seen = find_or_add_value( reg, data );
  713.    
  714.    if (VERBOSE || (NORMAL && (changed || !ever_seen)))
  715.        fprintf(stderr, "   %s <-- 0x%x", get_reg_name(reg), data);
  716.        
  717.    if (NORMAL) {
  718.       if (!ever_seen)
  719.          fprintf(stderr, " *** BRAND NEW VALUE");
  720.       else if (changed)
  721.          fprintf(stderr, " *** CHANGED");
  722.    }
  723.    
  724.    reg->current.i = data;
  725.  
  726.    if (VERBOSE || (NORMAL && (changed || !ever_seen)))
  727.       fprintf(stderr, "\n");
  728.  
  729.    return changed;
  730. }
  731.  
  732.  
  733. static int print_float_reg_assignment( struct reg *reg, float data )
  734. {
  735.    int changed = (reg->current.f != data);
  736.    int newmin = (data < reg->vmin);
  737.    int newmax = (data > reg->vmax);
  738.  
  739.    if (VERBOSE || (NORMAL && (newmin || newmax || changed)))
  740.       fprintf(stderr, "   %s <-- %.3f", get_reg_name(reg), data);
  741.  
  742.    if (NORMAL) {
  743.       if (newmin) {
  744.          fprintf(stderr, " *** NEW MIN (prev %.3f)", reg->vmin);
  745.          reg->vmin = data;
  746.       }
  747.       else if (newmax) {
  748.          fprintf(stderr, " *** NEW MAX (prev %.3f)", reg->vmax);
  749.          reg->vmax = data;
  750.       }
  751.       else if (changed) {
  752.          fprintf(stderr, " *** CHANGED");
  753.       }
  754.    }
  755.  
  756.    reg->current.f = data;
  757.  
  758.    if (VERBOSE || (NORMAL && (newmin || newmax || changed)))
  759.       fprintf(stderr, "\n");
  760.  
  761.    return changed;
  762. }
  763.  
  764. static int print_reg_assignment( struct reg *reg, int data )
  765. {
  766.    float_ui32_type datau;
  767.    datau.ui32 = data;
  768.    reg->flags |= TOUCHED;
  769.    if (reg->flags & ISFLOAT)
  770.       return print_float_reg_assignment( reg, datau.f );
  771.    else
  772.       return print_int_reg_assignment( reg, data );
  773. }
  774.  
  775. static void print_reg( struct reg *reg )
  776. {
  777.    if (reg->flags & TOUCHED) {
  778.       if (reg->flags & ISFLOAT) {
  779.          fprintf(stderr, "   %s == %f\n", get_reg_name(reg), reg->current.f);
  780.       } else {
  781.          fprintf(stderr, "   %s == 0x%x\n", get_reg_name(reg), reg->current.i);
  782.       }
  783.    }
  784. }
  785.  
  786.  
  787. static void dump_state( void )
  788. {
  789.    int i;
  790.  
  791.    for (i = 0 ; i < Elements(regs) ; i++)
  792.       print_reg( &regs[i] );
  793.  
  794.    for (i = 0 ; i < Elements(scalars) ; i++)
  795.       print_reg( &scalars[i] );
  796.  
  797.    for (i = 0 ; i < Elements(vectors) ; i++)
  798.       print_reg( &vectors[i] );
  799. }
  800.  
  801.  
  802.  
  803. static int radeon_emit_packets(
  804.    drm_radeon_cmd_header_t header,
  805.    drm_radeon_cmd_buffer_t *cmdbuf )
  806. {
  807.    int id = (int)header.packet.packet_id;
  808.    int sz = packet[id].len;
  809.    int *data = (int *)cmdbuf->buf;
  810.    int i;
  811.    
  812.    if (sz * sizeof(int) > cmdbuf->bufsz) {
  813.       fprintf(stderr, "Packet overflows cmdbuf\n");      
  814.       return -EINVAL;
  815.    }
  816.  
  817.    if (!packet[id].name) {
  818.       fprintf(stderr, "*** Unknown packet 0 nr %d\n", id );
  819.       return -EINVAL;
  820.    }
  821.  
  822.    
  823.    if (VERBOSE)
  824.       fprintf(stderr, "Packet 0 reg %s nr %d\n", packet[id].name, sz );
  825.  
  826.    for ( i = 0 ; i < sz ; i++) {
  827.       struct reg *reg = lookup_reg( regs, packet[id].start + i*4 );
  828.       if (print_reg_assignment( reg, data[i] ))
  829.          total_changed++;
  830.       total++;
  831.    }
  832.  
  833.    cmdbuf->buf += sz * sizeof(int);
  834.    cmdbuf->bufsz -= sz * sizeof(int);
  835.    return 0;
  836. }
  837.  
  838.  
  839. static int radeon_emit_scalars(
  840.    drm_radeon_cmd_header_t header,
  841.    drm_radeon_cmd_buffer_t *cmdbuf )
  842. {
  843.    int sz = header.scalars.count;
  844.    int *data = (int *)cmdbuf->buf;
  845.    int start = header.scalars.offset;
  846.    int stride = header.scalars.stride;
  847.    int i;
  848.  
  849.    if (VERBOSE)
  850.       fprintf(stderr, "emit scalars, start %d stride %d nr %d (end %d)\n",
  851.               start, stride, sz, start + stride * sz);
  852.  
  853.  
  854.    for (i = 0 ; i < sz ; i++, start += stride) {
  855.       struct reg *reg = lookup_reg( scalars, start );
  856.       if (print_reg_assignment( reg, data[i] ))
  857.          total_changed++;
  858.       total++;
  859.    }
  860.          
  861.    cmdbuf->buf += sz * sizeof(int);
  862.    cmdbuf->bufsz -= sz * sizeof(int);
  863.    return 0;
  864. }
  865.  
  866.  
  867. static int radeon_emit_scalars2(
  868.    drm_radeon_cmd_header_t header,
  869.    drm_radeon_cmd_buffer_t *cmdbuf )
  870. {
  871.    int sz = header.scalars.count;
  872.    int *data = (int *)cmdbuf->buf;
  873.    int start = header.scalars.offset + 0x100;
  874.    int stride = header.scalars.stride;
  875.    int i;
  876.  
  877.    if (VERBOSE)
  878.       fprintf(stderr, "emit scalars2, start %d stride %d nr %d (end %d)\n",
  879.               start, stride, sz, start + stride * sz);
  880.  
  881.    if (start + stride * sz > 258) {
  882.       fprintf(stderr, "emit scalars OVERFLOW %d/%d/%d\n", start, stride, sz);
  883.       return -1;
  884.    }
  885.  
  886.    for (i = 0 ; i < sz ; i++, start += stride) {
  887.       struct reg *reg = lookup_reg( scalars, start );
  888.       if (print_reg_assignment( reg, data[i] ))
  889.          total_changed++;
  890.       total++;
  891.    }
  892.          
  893.    cmdbuf->buf += sz * sizeof(int);
  894.    cmdbuf->bufsz -= sz * sizeof(int);
  895.    return 0;
  896. }
  897.  
  898. /* Check: inf/nan/extreme-size?
  899.  * Check: table start, end, nr, etc.
  900.  */
  901. static int radeon_emit_vectors(
  902.    drm_radeon_cmd_header_t header,
  903.    drm_radeon_cmd_buffer_t *cmdbuf )
  904. {
  905.    int sz = header.vectors.count;
  906.    int *data = (int *)cmdbuf->buf;
  907.    int start = header.vectors.offset;
  908.    int stride = header.vectors.stride;
  909.    int i,j;
  910.  
  911.    if (VERBOSE)
  912.       fprintf(stderr, "emit vectors, start %d stride %d nr %d (end %d) (0x%x)\n",
  913.               start, stride, sz, start + stride * sz, header.i);
  914.  
  915. /*    if (start + stride * (sz/4) > 128) { */
  916. /*       fprintf(stderr, "emit vectors OVERFLOW %d/%d/%d\n", start, stride, sz); */
  917. /*       return -1; */
  918. /*    } */
  919.  
  920.    for (i = 0 ; i < sz ;  start += stride) {
  921.       int changed = 0;
  922.       for (j = 0 ; j < 4 ; i++,j++) {
  923.          struct reg *reg = lookup_reg( vectors, start*4+j );
  924.          if (print_reg_assignment( reg, data[i] ))
  925.             changed = 1;
  926.       }
  927.       if (changed)
  928.          total_changed += 4;
  929.       total += 4;
  930.    }
  931.          
  932.  
  933.    cmdbuf->buf += sz * sizeof(int);
  934.    cmdbuf->bufsz -= sz * sizeof(int);
  935.    return 0;
  936. }
  937.  
  938. static int radeon_emit_veclinear(
  939.    drm_radeon_cmd_header_t header,
  940.    drm_radeon_cmd_buffer_t *cmdbuf )
  941. {
  942.    int sz = header.veclinear.count * 4;
  943.    int *data = (int *)cmdbuf->buf;
  944.    float *fdata =(float *)cmdbuf->buf;
  945.    int start = header.veclinear.addr_lo | (header.veclinear.addr_hi << 8);
  946.    int i;
  947.  
  948.    if (1||VERBOSE)
  949.       fprintf(stderr, "emit vectors linear, start %d nr %d (end %d) (0x%x)\n",
  950.               start, sz >> 2, start + (sz >> 2), header.i);
  951.  
  952.  
  953.    if (start < 0x60) {
  954.       for (i = 0 ; i < sz ;  i += 4) {
  955.          fprintf(stderr, "R200_VS_PARAM %d 0 %f\n", (i >> 2) + start, fdata[i]);
  956.          fprintf(stderr, "R200_VS_PARAM %d 1 %f\n", (i >> 2) + start, fdata[i+1]);
  957.          fprintf(stderr, "R200_VS_PARAM %d 2 %f\n", (i >> 2) + start, fdata[i+2]);
  958.          fprintf(stderr, "R200_VS_PARAM %d 3 %f\n", (i >> 2) + start, fdata[i+3]);
  959.       }
  960.    }
  961.    else if ((start >= 0x100) && (start < 0x160)) {
  962.       for (i = 0 ; i < sz ;  i += 4) {
  963.          fprintf(stderr, "R200_VS_PARAM %d 0 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i]);
  964.          fprintf(stderr, "R200_VS_PARAM %d 1 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i+1]);
  965.          fprintf(stderr, "R200_VS_PARAM %d 2 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i+2]);
  966.          fprintf(stderr, "R200_VS_PARAM %d 3 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i+3]);
  967.       }
  968.    }
  969.    else if ((start >= 0x80) && (start < 0xc0)) {
  970.       for (i = 0 ; i < sz ;  i += 4) {
  971.          fprintf(stderr, "R200_VS_PROG %d OPDST %08x\n", (i >> 2) + start - 0x80, data[i]);
  972.          fprintf(stderr, "R200_VS_PROG %d SRC1  %08x\n", (i >> 2) + start - 0x80, data[i+1]);
  973.          fprintf(stderr, "R200_VS_PROG %d SRC2  %08x\n", (i >> 2) + start - 0x80, data[i+2]);
  974.          fprintf(stderr, "R200_VS_PROG %d SRC3  %08x\n", (i >> 2) + start - 0x80, data[i+3]);
  975.       }
  976.    }
  977.    else if ((start >= 0x180) && (start < 0x1c0)) {
  978.       for (i = 0 ; i < sz ;  i += 4) {
  979.          fprintf(stderr, "R200_VS_PROG %d OPDST %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i]);
  980.          fprintf(stderr, "R200_VS_PROG %d SRC1  %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i+1]);
  981.          fprintf(stderr, "R200_VS_PROG %d SRC2  %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i+2]);
  982.          fprintf(stderr, "R200_VS_PROG %d SRC3  %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i+3]);
  983.       }
  984.    }
  985.    else {
  986.       fprintf(stderr, "write to unknown vector area\n");
  987.    }
  988.  
  989.    cmdbuf->buf += sz * sizeof(int);
  990.    cmdbuf->bufsz -= sz * sizeof(int);
  991.    return 0;
  992. }
  993.  
  994. #if 0
  995. static int print_vertex_format( int vfmt )
  996. {
  997.    if (NORMAL) {
  998.       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",
  999.               "vertex format",
  1000.               vfmt,
  1001.               "xy,",
  1002.               (vfmt & R200_VTX_Z0) ? "z," : "",
  1003.               (vfmt & R200_VTX_W0) ? "w0," : "",
  1004.               (vfmt & R200_VTX_FPCOLOR) ? "fpcolor," : "",
  1005.               (vfmt & R200_VTX_FPALPHA) ? "fpalpha," : "",
  1006.               (vfmt & R200_VTX_PKCOLOR) ? "pkcolor," : "",
  1007.               (vfmt & R200_VTX_FPSPEC) ? "fpspec," : "",
  1008.               (vfmt & R200_VTX_FPFOG) ? "fpfog," : "",
  1009.               (vfmt & R200_VTX_PKSPEC) ? "pkspec," : "",
  1010.               (vfmt & R200_VTX_ST0) ? "st0," : "",
  1011.               (vfmt & R200_VTX_ST1) ? "st1," : "",
  1012.               (vfmt & R200_VTX_Q1) ? "q1," : "",
  1013.               (vfmt & R200_VTX_ST2) ? "st2," : "",
  1014.               (vfmt & R200_VTX_Q2) ? "q2," : "",
  1015.               (vfmt & R200_VTX_ST3) ? "st3," : "",
  1016.               (vfmt & R200_VTX_Q3) ? "q3," : "",
  1017.               (vfmt & R200_VTX_Q0) ? "q0," : "",
  1018.               (vfmt & R200_VTX_N0) ? "n0," : "",
  1019.               (vfmt & R200_VTX_XY1) ? "xy1," : "",
  1020.               (vfmt & R200_VTX_Z1) ? "z1," : "",
  1021.               (vfmt & R200_VTX_W1) ? "w1," : "",
  1022.               (vfmt & R200_VTX_N1) ? "n1," : "");
  1023.  
  1024.    
  1025.       if (!find_or_add_value( &others[V_VTXFMT], vfmt ))
  1026.          fprintf(stderr, " *** NEW VALUE");
  1027.  
  1028.       fprintf(stderr, "\n");
  1029.    }
  1030.  
  1031.    return 0;
  1032. }
  1033. #endif
  1034.  
  1035. static char *primname[0x10] = {
  1036.    "NONE",
  1037.    "POINTS",
  1038.    "LINES",
  1039.    "LINE_STRIP",
  1040.    "TRIANGLES",
  1041.    "TRIANGLE_FAN",
  1042.    "TRIANGLE_STRIP",
  1043.    "RECT_LIST",
  1044.    NULL,
  1045.    "3VRT_POINTS",
  1046.    "3VRT_LINES",
  1047.    "POINT_SPRITES",
  1048.    "LINE_LOOP",
  1049.    "QUADS",
  1050.    "QUAD_STRIP",
  1051.    "POLYGON",
  1052. };
  1053.  
  1054. static int print_prim_and_flags( int prim )
  1055. {
  1056.    int numverts;
  1057.    
  1058.    if (NORMAL)
  1059.       fprintf(stderr, "   %s(%x): %s%s%s%s%s%s\n",
  1060.               "prim flags",
  1061.               prim,
  1062.               ((prim & 0x30) == R200_VF_PRIM_WALK_IND) ? "IND," : "",
  1063.               ((prim & 0x30) == R200_VF_PRIM_WALK_LIST) ? "LIST," : "",
  1064.               ((prim & 0x30) == R200_VF_PRIM_WALK_RING) ? "RING," : "",
  1065.               (prim & R200_VF_COLOR_ORDER_RGBA) ? "RGBA," : "BGRA, ",
  1066.               (prim & R200_VF_INDEX_SZ_4) ? "INDX-32," : "",
  1067.               (prim & R200_VF_TCL_OUTPUT_VTX_ENABLE) ? "TCL_OUT_VTX," : "");
  1068.  
  1069.    numverts = prim>>16;
  1070.    
  1071.    if (NORMAL)
  1072.       fprintf(stderr, "   prim: %s numverts %d\n", primname[prim&0xf], numverts);
  1073.  
  1074.    switch (prim & 0xf) {
  1075.    case R200_VF_PRIM_NONE:
  1076.    case R200_VF_PRIM_POINTS:
  1077.       if (numverts < 1) {
  1078.          fprintf(stderr, "Bad nr verts for line %d\n", numverts);
  1079.          return -1;
  1080.       }
  1081.       break;
  1082.    case R200_VF_PRIM_LINES:
  1083.    case R200_VF_PRIM_POINT_SPRITES:
  1084.       if ((numverts & 1) || numverts == 0) {
  1085.          fprintf(stderr, "Bad nr verts for line %d\n", numverts);
  1086.          return -1;
  1087.       }
  1088.       break;
  1089.    case R200_VF_PRIM_LINE_STRIP:
  1090.    case R200_VF_PRIM_LINE_LOOP:
  1091.       if (numverts < 2) {
  1092.          fprintf(stderr, "Bad nr verts for line_strip %d\n", numverts);
  1093.          return -1;
  1094.       }
  1095.       break;
  1096.    case R200_VF_PRIM_TRIANGLES:
  1097.    case R200_VF_PRIM_3VRT_POINTS:
  1098.    case R200_VF_PRIM_3VRT_LINES:
  1099.    case R200_VF_PRIM_RECT_LIST:
  1100.       if (numverts % 3 || numverts == 0) {
  1101.          fprintf(stderr, "Bad nr verts for tri %d\n", numverts);
  1102.          return -1;
  1103.       }
  1104.       break;
  1105.    case R200_VF_PRIM_TRIANGLE_FAN:
  1106.    case R200_VF_PRIM_TRIANGLE_STRIP:
  1107.    case R200_VF_PRIM_POLYGON:
  1108.       if (numverts < 3) {
  1109.          fprintf(stderr, "Bad nr verts for strip/fan %d\n", numverts);
  1110.          return -1;
  1111.       }
  1112.       break;
  1113.    case R200_VF_PRIM_QUADS:
  1114.       if (numverts % 4 || numverts == 0) {
  1115.          fprintf(stderr, "Bad nr verts for quad %d\n", numverts);
  1116.          return -1;
  1117.       }
  1118.       break;
  1119.    case R200_VF_PRIM_QUAD_STRIP:
  1120.       if (numverts % 2 || numverts < 4) {
  1121.          fprintf(stderr, "Bad nr verts for quadstrip %d\n", numverts);
  1122.          return -1;
  1123.       }
  1124.       break;
  1125.    default:
  1126.       fprintf(stderr, "Bad primitive\n");
  1127.       return -1;
  1128.    }   
  1129.    return 0;
  1130. }
  1131.  
  1132. /* build in knowledge about each packet type
  1133.  */
  1134. static int radeon_emit_packet3( drm_radeon_cmd_buffer_t *cmdbuf )
  1135. {
  1136.    int cmdsz;
  1137.    int *cmd = (int *)cmdbuf->buf;
  1138.    int *tmp;
  1139.    int i, stride, size, start;
  1140.  
  1141.    cmdsz = 2 + ((cmd[0] & RADEON_CP_PACKET_COUNT_MASK) >> 16);
  1142.  
  1143.    if ((cmd[0] & RADEON_CP_PACKET_MASK) != RADEON_CP_PACKET3 ||
  1144.        cmdsz * 4 > cmdbuf->bufsz ||
  1145.        cmdsz > RADEON_CP_PACKET_MAX_DWORDS) {
  1146.       fprintf(stderr, "Bad packet\n");
  1147.       return -EINVAL;
  1148.    }
  1149.  
  1150.    switch( cmd[0] & ~RADEON_CP_PACKET_COUNT_MASK ) {
  1151.    case R200_CP_CMD_NOP:
  1152.       if (NORMAL)
  1153.          fprintf(stderr, "PACKET3_NOP, %d dwords\n", cmdsz);
  1154.       break;
  1155.    case R200_CP_CMD_NEXT_CHAR:
  1156.       if (NORMAL)
  1157.          fprintf(stderr, "PACKET3_NEXT_CHAR, %d dwords\n", cmdsz);
  1158.       break;
  1159.    case R200_CP_CMD_PLY_NEXTSCAN:
  1160.       if (NORMAL)
  1161.          fprintf(stderr, "PACKET3_PLY_NEXTSCAN, %d dwords\n", cmdsz);
  1162.       break;
  1163.    case R200_CP_CMD_SET_SCISSORS:
  1164.       if (NORMAL)
  1165.          fprintf(stderr, "PACKET3_SET_SCISSORS, %d dwords\n", cmdsz);
  1166.       break;
  1167.    case R200_CP_CMD_LOAD_MICROCODE:
  1168.       if (NORMAL)
  1169.          fprintf(stderr, "PACKET3_LOAD_MICROCODE, %d dwords\n", cmdsz);
  1170.       break;
  1171.    case R200_CP_CMD_WAIT_FOR_IDLE:
  1172.       if (NORMAL)
  1173.          fprintf(stderr, "PACKET3_WAIT_FOR_IDLE, %d dwords\n", cmdsz);
  1174.       break;
  1175.  
  1176.    case R200_CP_CMD_3D_DRAW_VBUF:
  1177.       if (NORMAL)
  1178.          fprintf(stderr, "PACKET3_3D_DRAW_VBUF, %d dwords\n", cmdsz);
  1179. /*       print_vertex_format(cmd[1]); */
  1180.       if (print_prim_and_flags(cmd[2]))
  1181.          return -EINVAL;
  1182.       break;
  1183.  
  1184.    case R200_CP_CMD_3D_DRAW_IMMD:
  1185.       if (NORMAL)
  1186.          fprintf(stderr, "PACKET3_3D_DRAW_IMMD, %d dwords\n", cmdsz);
  1187.       break;
  1188.    case R200_CP_CMD_3D_DRAW_INDX: {
  1189.       int neltdwords;
  1190.       if (NORMAL)
  1191.          fprintf(stderr, "PACKET3_3D_DRAW_INDX, %d dwords\n", cmdsz);
  1192. /*       print_vertex_format(cmd[1]); */
  1193.       if (print_prim_and_flags(cmd[2]))
  1194.          return -EINVAL;
  1195.       neltdwords = cmd[2]>>16;
  1196.       neltdwords += neltdwords & 1;
  1197.       neltdwords /= 2;
  1198.       if (neltdwords + 3 != cmdsz)
  1199.          fprintf(stderr, "Mismatch in DRAW_INDX, %d vs cmdsz %d\n",
  1200.                  neltdwords, cmdsz);
  1201.       break;
  1202.    }
  1203.    case R200_CP_CMD_LOAD_PALETTE:
  1204.       if (NORMAL)
  1205.          fprintf(stderr, "PACKET3_LOAD_PALETTE, %d dwords\n", cmdsz);
  1206.       break;
  1207.    case R200_CP_CMD_3D_LOAD_VBPNTR:
  1208.       if (NORMAL) {
  1209.          fprintf(stderr, "PACKET3_3D_LOAD_VBPNTR, %d dwords\n", cmdsz);
  1210.          fprintf(stderr, "   nr arrays: %d\n", cmd[1]);
  1211.       }
  1212.  
  1213.       if (((cmd[1]/2)*3) + ((cmd[1]%2)*2) != cmdsz - 2) {
  1214.          fprintf(stderr, "  ****** MISMATCH %d/%d *******\n",
  1215.                  ((cmd[1]/2)*3) + ((cmd[1]%2)*2) + 2, cmdsz);
  1216.          return -EINVAL;
  1217.       }
  1218.  
  1219.       if (NORMAL) {
  1220.          tmp = cmd+2;
  1221.          for (i = 0 ; i < cmd[1] ; i++) {
  1222.             if (i & 1) {
  1223.                stride = (tmp[0]>>24) & 0xff;
  1224.                size = (tmp[0]>>16) & 0xff;
  1225.                start = tmp[2];
  1226.                tmp += 3;
  1227.             }
  1228.             else {
  1229.                stride = (tmp[0]>>8) & 0xff;
  1230.                size = (tmp[0]) & 0xff;
  1231.                start = tmp[1];
  1232.             }
  1233.             fprintf(stderr, "   array %d: start 0x%x vsize %d vstride %d\n",
  1234.                     i, start, size, stride );
  1235.          }
  1236.       }
  1237.       break;
  1238.    case R200_CP_CMD_PAINT:
  1239.       if (NORMAL)
  1240.          fprintf(stderr, "PACKET3_CNTL_PAINT, %d dwords\n", cmdsz);
  1241.       break;
  1242.    case R200_CP_CMD_BITBLT:
  1243.       if (NORMAL)
  1244.          fprintf(stderr, "PACKET3_CNTL_BITBLT, %d dwords\n", cmdsz);
  1245.       break;
  1246.    case R200_CP_CMD_SMALLTEXT:
  1247.       if (NORMAL)
  1248.          fprintf(stderr, "PACKET3_CNTL_SMALLTEXT, %d dwords\n", cmdsz);
  1249.       break;
  1250.    case R200_CP_CMD_HOSTDATA_BLT:
  1251.       if (NORMAL)
  1252.          fprintf(stderr, "PACKET3_CNTL_HOSTDATA_BLT, %d dwords\n",
  1253.               cmdsz);
  1254.       break;
  1255.    case R200_CP_CMD_POLYLINE:
  1256.       if (NORMAL)
  1257.          fprintf(stderr, "PACKET3_CNTL_POLYLINE, %d dwords\n", cmdsz);
  1258.       break;
  1259.    case R200_CP_CMD_POLYSCANLINES:
  1260.       if (NORMAL)
  1261.          fprintf(stderr, "PACKET3_CNTL_POLYSCANLINES, %d dwords\n",
  1262.               cmdsz);
  1263.       break;
  1264.    case R200_CP_CMD_PAINT_MULTI:
  1265.       if (NORMAL)
  1266.          fprintf(stderr, "PACKET3_CNTL_PAINT_MULTI, %d dwords\n",
  1267.               cmdsz);
  1268.       break;
  1269.    case R200_CP_CMD_BITBLT_MULTI:
  1270.       if (NORMAL)
  1271.          fprintf(stderr, "PACKET3_CNTL_BITBLT_MULTI, %d dwords\n",
  1272.               cmdsz);
  1273.       break;
  1274.    case R200_CP_CMD_TRANS_BITBLT:
  1275.       if (NORMAL)
  1276.          fprintf(stderr, "PACKET3_CNTL_TRANS_BITBLT, %d dwords\n",
  1277.               cmdsz);
  1278.       break;
  1279.    case R200_CP_CMD_3D_DRAW_VBUF_2:
  1280.       if (NORMAL)
  1281.          fprintf(stderr, "R200_CP_CMD_3D_DRAW_VBUF_2, %d dwords\n",
  1282.               cmdsz);
  1283.       if (print_prim_and_flags(cmd[1]))
  1284.          return -EINVAL;
  1285.       break;
  1286.    case R200_CP_CMD_3D_DRAW_IMMD_2:
  1287.       if (NORMAL)
  1288.          fprintf(stderr, "R200_CP_CMD_3D_DRAW_IMMD_2, %d dwords\n",
  1289.               cmdsz);
  1290.       if (print_prim_and_flags(cmd[1]))
  1291.          return -EINVAL;
  1292.       break;
  1293.    case R200_CP_CMD_3D_DRAW_INDX_2:
  1294.       if (NORMAL)
  1295.          fprintf(stderr, "R200_CP_CMD_3D_DRAW_INDX_2, %d dwords\n",
  1296.               cmdsz);
  1297.       if (print_prim_and_flags(cmd[1]))
  1298.          return -EINVAL;
  1299.       break;
  1300.    default:
  1301.       fprintf(stderr, "UNKNOWN PACKET, %d dwords\n", cmdsz);
  1302.       break;
  1303.    }
  1304.      
  1305.    cmdbuf->buf += cmdsz * 4;
  1306.    cmdbuf->bufsz -= cmdsz * 4;
  1307.    return 0;
  1308. }
  1309.  
  1310.  
  1311. /* Check cliprects for bounds, then pass on to above:
  1312.  */
  1313. static int radeon_emit_packet3_cliprect( drm_radeon_cmd_buffer_t *cmdbuf )
  1314. {  
  1315.    drm_clip_rect_t *boxes = (drm_clip_rect_t *)cmdbuf->boxes;
  1316.    int i = 0;
  1317.  
  1318.    if (VERBOSE && total_changed) {
  1319.       dump_state();
  1320.       total_changed = 0;
  1321.    }
  1322.  
  1323.    if (NORMAL) {
  1324.       do {
  1325.          if ( i < cmdbuf->nbox ) {
  1326.             fprintf(stderr, "Emit box %d/%d %d,%d %d,%d\n",
  1327.                     i, cmdbuf->nbox,
  1328.                     boxes[i].x1, boxes[i].y1, boxes[i].x2, boxes[i].y2);
  1329.          }
  1330.       } while ( ++i < cmdbuf->nbox );
  1331.    }
  1332.  
  1333.    if (cmdbuf->nbox == 1)
  1334.       cmdbuf->nbox = 0;
  1335.  
  1336.    return radeon_emit_packet3( cmdbuf );
  1337. }
  1338.  
  1339.  
  1340. int r200SanityCmdBuffer( r200ContextPtr rmesa,
  1341.                            int nbox,
  1342.                            drm_clip_rect_t *boxes )
  1343. {
  1344.    int idx;
  1345.    drm_radeon_cmd_buffer_t cmdbuf;
  1346.    drm_radeon_cmd_header_t header;
  1347.    static int inited = 0;
  1348.  
  1349.    if (!inited) {
  1350.       init_regs();
  1351.       inited = 1;
  1352.    }
  1353.  
  1354.  
  1355.    cmdbuf.buf = rmesa->store.cmd_buf;
  1356.    cmdbuf.bufsz = rmesa->store.cmd_used;
  1357.    cmdbuf.boxes = (drm_clip_rect_t *)boxes;
  1358.    cmdbuf.nbox = nbox;
  1359.  
  1360.    while ( cmdbuf.bufsz >= sizeof(header) ) {
  1361.                
  1362.       header.i = *(int *)cmdbuf.buf;
  1363.       cmdbuf.buf += sizeof(header);
  1364.       cmdbuf.bufsz -= sizeof(header);
  1365.  
  1366.       switch (header.header.cmd_type) {
  1367.       case RADEON_CMD_PACKET:
  1368.          if (radeon_emit_packets( header, &cmdbuf )) {
  1369.             fprintf(stderr,"radeon_emit_packets failed\n");
  1370.             return -EINVAL;
  1371.          }
  1372.          break;
  1373.  
  1374.       case RADEON_CMD_SCALARS:
  1375.          if (radeon_emit_scalars( header, &cmdbuf )) {
  1376.             fprintf(stderr,"radeon_emit_scalars failed\n");
  1377.             return -EINVAL;
  1378.          }
  1379.          break;
  1380.  
  1381.       case RADEON_CMD_SCALARS2:
  1382.          if (radeon_emit_scalars2( header, &cmdbuf )) {
  1383.             fprintf(stderr,"radeon_emit_scalars failed\n");
  1384.             return -EINVAL;
  1385.          }
  1386.          break;
  1387.  
  1388.       case RADEON_CMD_VECTORS:
  1389.          if (radeon_emit_vectors( header, &cmdbuf )) {
  1390.             fprintf(stderr,"radeon_emit_vectors failed\n");
  1391.             return -EINVAL;
  1392.          }
  1393.          break;
  1394.  
  1395.       case RADEON_CMD_DMA_DISCARD:
  1396.          idx = header.dma.buf_idx;
  1397.          if (NORMAL)
  1398.             fprintf(stderr, "RADEON_CMD_DMA_DISCARD buf %d\n", idx);
  1399.          bufs++;
  1400.          break;
  1401.  
  1402.       case RADEON_CMD_PACKET3:
  1403.          if (radeon_emit_packet3( &cmdbuf )) {
  1404.             fprintf(stderr,"radeon_emit_packet3 failed\n");
  1405.             return -EINVAL;
  1406.          }
  1407.          break;
  1408.  
  1409.       case RADEON_CMD_PACKET3_CLIP:
  1410.          if (radeon_emit_packet3_cliprect( &cmdbuf )) {
  1411.             fprintf(stderr,"radeon_emit_packet3_clip failed\n");
  1412.             return -EINVAL;
  1413.          }
  1414.          break;
  1415.  
  1416.       case RADEON_CMD_WAIT:
  1417.          break;
  1418.  
  1419.       case RADEON_CMD_VECLINEAR:
  1420.          if (radeon_emit_veclinear( header, &cmdbuf )) {
  1421.             fprintf(stderr,"radeon_emit_veclinear failed\n");
  1422.             return -EINVAL;
  1423.          }
  1424.          break;
  1425.  
  1426.       default:
  1427.          fprintf(stderr,"bad cmd_type %d at %p\n",
  1428.                    header.header.cmd_type,
  1429.                    cmdbuf.buf - sizeof(header));
  1430.          return -EINVAL;
  1431.       }
  1432.    }
  1433.  
  1434.    if (0)
  1435.    {
  1436.       static int n = 0;
  1437.       n++;
  1438.       if (n == 10) {
  1439.          fprintf(stderr, "Bufs %d Total emitted %d real changes %d (%.2f%%)\n",
  1440.                  bufs,
  1441.                  total, total_changed,
  1442.                  ((float)total_changed/(float)total*100.0));
  1443.          fprintf(stderr, "Total emitted per buf: %.2f\n",
  1444.                  (float)total/(float)bufs);
  1445.          fprintf(stderr, "Real changes per buf: %.2f\n",
  1446.                  (float)total_changed/(float)bufs);
  1447.  
  1448.          bufs = n = total = total_changed = 0;
  1449.       }
  1450.    }
  1451.  
  1452.    fprintf(stderr, "leaving %s\n\n\n", __FUNCTION__);
  1453.  
  1454.    return 0;
  1455. }
  1456.