1/**************************************************************************
2
3Copyright 2002 ATI Technologies Inc., Ontario, Canada, and
4                     Tungsten Graphics Inc, Cedar Park, TX.
5
6All Rights Reserved.
7
8Permission is hereby granted, free of charge, to any person obtaining a
9copy of this software and associated documentation files (the "Software"),
10to deal in the Software without restriction, including without limitation
11on the rights to use, copy, modify, merge, publish, distribute, sub
12license, and/or sell copies of the Software, and to permit persons to whom
13the Software is furnished to do so, subject to the following conditions:
14
15The above copyright notice and this permission notice (including the next
16paragraph) shall be included in all copies or substantial portions of the
17Software.
18
19THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
22ATI, TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
23DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
24OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
25USE 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 */
62static 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
164struct reg_names {
165   int idx;
166   const char *name;
167};
168
169static 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
538static 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 */
557static 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
596union fi { float f; int i; };
597
598#define ISVEC   1
599#define ISFLOAT 2
600#define TOUCHED 4
601
602struct 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
614static struct reg regs[Elements(reg_names)+1];
615static struct reg scalars[512+1];
616static struct reg vectors[512*4+1];
617
618static int total, total_changed, bufs;
619
620static 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
650static 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 = (union fi *) realloc( reg->values,
662					  reg->nalloc * sizeof(union fi) );
663   }
664
665   reg->values[reg->nvalues++].i = val;
666   return 0;
667}
668
669static struct reg *lookup_reg( struct reg *tab, int reg )
670{
671   int i;
672
673   for (i = 0 ; tab[i].idx != -1 ; i++) {
674      if (tab[i].idx == reg)
675	 return &tab[i];
676   }
677
678   fprintf(stderr, "*** unknown reg 0x%x\n", reg);
679   return NULL;
680}
681
682
683static const char *get_reg_name( struct reg *reg )
684{
685   static char tmp[80];
686
687   if (reg->idx == reg->closest->idx)
688      return reg->closest->name;
689
690
691   if (reg->flags & ISVEC) {
692      if (reg->idx/4 != reg->closest->idx)
693	 sprintf(tmp, "%s+%d[%d]",
694		 reg->closest->name,
695		 (reg->idx/4) - reg->closest->idx,
696		 reg->idx%4);
697      else
698	 sprintf(tmp, "%s[%d]", reg->closest->name, reg->idx%4);
699   }
700   else {
701      if (reg->idx != reg->closest->idx)
702	 sprintf(tmp, "%s+%d", reg->closest->name, reg->idx - reg->closest->idx);
703      else
704	 sprintf(tmp, "%s", reg->closest->name);
705   }
706
707   return tmp;
708}
709
710static int print_int_reg_assignment( struct reg *reg, int data )
711{
712   int changed = (reg->current.i != data);
713   int ever_seen = find_or_add_value( reg, data );
714
715   if (VERBOSE || (NORMAL && (changed || !ever_seen)))
716       fprintf(stderr, "   %s <-- 0x%x", get_reg_name(reg), data);
717
718   if (NORMAL) {
719      if (!ever_seen)
720	 fprintf(stderr, " *** BRAND NEW VALUE");
721      else if (changed)
722	 fprintf(stderr, " *** CHANGED");
723   }
724
725   reg->current.i = data;
726
727   if (VERBOSE || (NORMAL && (changed || !ever_seen)))
728      fprintf(stderr, "\n");
729
730   return changed;
731}
732
733
734static int print_float_reg_assignment( struct reg *reg, float data )
735{
736   int changed = (reg->current.f != data);
737   int newmin = (data < reg->vmin);
738   int newmax = (data > reg->vmax);
739
740   if (VERBOSE || (NORMAL && (newmin || newmax || changed)))
741      fprintf(stderr, "   %s <-- %.3f", get_reg_name(reg), data);
742
743   if (NORMAL) {
744      if (newmin) {
745	 fprintf(stderr, " *** NEW MIN (prev %.3f)", reg->vmin);
746	 reg->vmin = data;
747      }
748      else if (newmax) {
749	 fprintf(stderr, " *** NEW MAX (prev %.3f)", reg->vmax);
750	 reg->vmax = data;
751      }
752      else if (changed) {
753	 fprintf(stderr, " *** CHANGED");
754      }
755   }
756
757   reg->current.f = data;
758
759   if (VERBOSE || (NORMAL && (newmin || newmax || changed)))
760      fprintf(stderr, "\n");
761
762   return changed;
763}
764
765static int print_reg_assignment( struct reg *reg, int data )
766{
767   float_ui32_type datau;
768   datau.ui32 = data;
769   reg->flags |= TOUCHED;
770   if (reg->flags & ISFLOAT)
771      return print_float_reg_assignment( reg, datau.f );
772   else
773      return print_int_reg_assignment( reg, data );
774}
775
776static void print_reg( struct reg *reg )
777{
778   if (reg->flags & TOUCHED) {
779      if (reg->flags & ISFLOAT) {
780	 fprintf(stderr, "   %s == %f\n", get_reg_name(reg), reg->current.f);
781      } else {
782	 fprintf(stderr, "   %s == 0x%x\n", get_reg_name(reg), reg->current.i);
783      }
784   }
785}
786
787
788static void dump_state( void )
789{
790   int i;
791
792   for (i = 0 ; i < Elements(regs) ; i++)
793      print_reg( &regs[i] );
794
795   for (i = 0 ; i < Elements(scalars) ; i++)
796      print_reg( &scalars[i] );
797
798   for (i = 0 ; i < Elements(vectors) ; i++)
799      print_reg( &vectors[i] );
800}
801
802
803
804static int radeon_emit_packets(
805   drm_radeon_cmd_header_t header,
806   drm_radeon_cmd_buffer_t *cmdbuf )
807{
808   int id = (int)header.packet.packet_id;
809   int sz = packet[id].len;
810   int *data = (int *)cmdbuf->buf;
811   int i;
812
813   if (sz * sizeof(int) > cmdbuf->bufsz) {
814      fprintf(stderr, "Packet overflows cmdbuf\n");
815      return -EINVAL;
816   }
817
818   if (!packet[id].name) {
819      fprintf(stderr, "*** Unknown packet 0 nr %d\n", id );
820      return -EINVAL;
821   }
822
823
824   if (VERBOSE)
825      fprintf(stderr, "Packet 0 reg %s nr %d\n", packet[id].name, sz );
826
827   for ( i = 0 ; i < sz ; i++) {
828      struct reg *reg = lookup_reg( regs, packet[id].start + i*4 );
829      if (print_reg_assignment( reg, data[i] ))
830	 total_changed++;
831      total++;
832   }
833
834   cmdbuf->buf += sz * sizeof(int);
835   cmdbuf->bufsz -= sz * sizeof(int);
836   return 0;
837}
838
839
840static int radeon_emit_scalars(
841   drm_radeon_cmd_header_t header,
842   drm_radeon_cmd_buffer_t *cmdbuf )
843{
844   int sz = header.scalars.count;
845   int *data = (int *)cmdbuf->buf;
846   int start = header.scalars.offset;
847   int stride = header.scalars.stride;
848   int i;
849
850   if (VERBOSE)
851      fprintf(stderr, "emit scalars, start %d stride %d nr %d (end %d)\n",
852	      start, stride, sz, start + stride * sz);
853
854
855   for (i = 0 ; i < sz ; i++, start += stride) {
856      struct reg *reg = lookup_reg( scalars, start );
857      if (print_reg_assignment( reg, data[i] ))
858	 total_changed++;
859      total++;
860   }
861
862   cmdbuf->buf += sz * sizeof(int);
863   cmdbuf->bufsz -= sz * sizeof(int);
864   return 0;
865}
866
867
868static int radeon_emit_scalars2(
869   drm_radeon_cmd_header_t header,
870   drm_radeon_cmd_buffer_t *cmdbuf )
871{
872   int sz = header.scalars.count;
873   int *data = (int *)cmdbuf->buf;
874   int start = header.scalars.offset + 0x100;
875   int stride = header.scalars.stride;
876   int i;
877
878   if (VERBOSE)
879      fprintf(stderr, "emit scalars2, start %d stride %d nr %d (end %d)\n",
880	      start, stride, sz, start + stride * sz);
881
882   if (start + stride * sz > 258) {
883      fprintf(stderr, "emit scalars OVERFLOW %d/%d/%d\n", start, stride, sz);
884      return -1;
885   }
886
887   for (i = 0 ; i < sz ; i++, start += stride) {
888      struct reg *reg = lookup_reg( scalars, start );
889      if (print_reg_assignment( reg, data[i] ))
890	 total_changed++;
891      total++;
892   }
893
894   cmdbuf->buf += sz * sizeof(int);
895   cmdbuf->bufsz -= sz * sizeof(int);
896   return 0;
897}
898
899/* Check: inf/nan/extreme-size?
900 * Check: table start, end, nr, etc.
901 */
902static int radeon_emit_vectors(
903   drm_radeon_cmd_header_t header,
904   drm_radeon_cmd_buffer_t *cmdbuf )
905{
906   int sz = header.vectors.count;
907   int *data = (int *)cmdbuf->buf;
908   int start = header.vectors.offset;
909   int stride = header.vectors.stride;
910   int i,j;
911
912   if (VERBOSE)
913      fprintf(stderr, "emit vectors, start %d stride %d nr %d (end %d) (0x%x)\n",
914	      start, stride, sz, start + stride * sz, header.i);
915
916/*    if (start + stride * (sz/4) > 128) { */
917/*       fprintf(stderr, "emit vectors OVERFLOW %d/%d/%d\n", start, stride, sz); */
918/*       return -1; */
919/*    } */
920
921   for (i = 0 ; i < sz ;  start += stride) {
922      int changed = 0;
923      for (j = 0 ; j < 4 ; i++,j++) {
924	 struct reg *reg = lookup_reg( vectors, start*4+j );
925	 if (print_reg_assignment( reg, data[i] ))
926	    changed = 1;
927      }
928      if (changed)
929	 total_changed += 4;
930      total += 4;
931   }
932
933
934   cmdbuf->buf += sz * sizeof(int);
935   cmdbuf->bufsz -= sz * sizeof(int);
936   return 0;
937}
938
939static int radeon_emit_veclinear(
940   drm_radeon_cmd_header_t header,
941   drm_radeon_cmd_buffer_t *cmdbuf )
942{
943   int sz = header.veclinear.count * 4;
944   int *data = (int *)cmdbuf->buf;
945   float *fdata =(float *)cmdbuf->buf;
946   int start = header.veclinear.addr_lo | (header.veclinear.addr_hi << 8);
947   int i;
948
949   if (1||VERBOSE)
950      fprintf(stderr, "emit vectors linear, start %d nr %d (end %d) (0x%x)\n",
951	      start, sz >> 2, start + (sz >> 2), header.i);
952
953
954   if (start < 0x60) {
955      for (i = 0 ; i < sz ;  i += 4) {
956	 fprintf(stderr, "R200_VS_PARAM %d 0 %f\n", (i >> 2) + start, fdata[i]);
957	 fprintf(stderr, "R200_VS_PARAM %d 1 %f\n", (i >> 2) + start, fdata[i+1]);
958	 fprintf(stderr, "R200_VS_PARAM %d 2 %f\n", (i >> 2) + start, fdata[i+2]);
959	 fprintf(stderr, "R200_VS_PARAM %d 3 %f\n", (i >> 2) + start, fdata[i+3]);
960      }
961   }
962   else if ((start >= 0x100) && (start < 0x160)) {
963      for (i = 0 ; i < sz ;  i += 4) {
964	 fprintf(stderr, "R200_VS_PARAM %d 0 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i]);
965	 fprintf(stderr, "R200_VS_PARAM %d 1 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i+1]);
966	 fprintf(stderr, "R200_VS_PARAM %d 2 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i+2]);
967	 fprintf(stderr, "R200_VS_PARAM %d 3 %f\n", (i >> 2) + start - 0x100 + 0x60, fdata[i+3]);
968      }
969   }
970   else if ((start >= 0x80) && (start < 0xc0)) {
971      for (i = 0 ; i < sz ;  i += 4) {
972	 fprintf(stderr, "R200_VS_PROG %d OPDST %08x\n", (i >> 2) + start - 0x80, data[i]);
973	 fprintf(stderr, "R200_VS_PROG %d SRC1  %08x\n", (i >> 2) + start - 0x80, data[i+1]);
974	 fprintf(stderr, "R200_VS_PROG %d SRC2  %08x\n", (i >> 2) + start - 0x80, data[i+2]);
975	 fprintf(stderr, "R200_VS_PROG %d SRC3  %08x\n", (i >> 2) + start - 0x80, data[i+3]);
976      }
977   }
978   else if ((start >= 0x180) && (start < 0x1c0)) {
979      for (i = 0 ; i < sz ;  i += 4) {
980	 fprintf(stderr, "R200_VS_PROG %d OPDST %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i]);
981	 fprintf(stderr, "R200_VS_PROG %d SRC1  %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i+1]);
982	 fprintf(stderr, "R200_VS_PROG %d SRC2  %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i+2]);
983	 fprintf(stderr, "R200_VS_PROG %d SRC3  %08x\n", (i >> 2) + start - 0x180 + 0x40, data[i+3]);
984      }
985   }
986   else {
987      fprintf(stderr, "write to unknown vector area\n");
988   }
989
990   cmdbuf->buf += sz * sizeof(int);
991   cmdbuf->bufsz -= sz * sizeof(int);
992   return 0;
993}
994
995#if 0
996static int print_vertex_format( int vfmt )
997{
998   if (NORMAL) {
999      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",
1000	      "vertex format",
1001	      vfmt,
1002	      "xy,",
1003	      (vfmt & R200_VTX_Z0) ? "z," : "",
1004	      (vfmt & R200_VTX_W0) ? "w0," : "",
1005	      (vfmt & R200_VTX_FPCOLOR) ? "fpcolor," : "",
1006	      (vfmt & R200_VTX_FPALPHA) ? "fpalpha," : "",
1007	      (vfmt & R200_VTX_PKCOLOR) ? "pkcolor," : "",
1008	      (vfmt & R200_VTX_FPSPEC) ? "fpspec," : "",
1009	      (vfmt & R200_VTX_FPFOG) ? "fpfog," : "",
1010	      (vfmt & R200_VTX_PKSPEC) ? "pkspec," : "",
1011	      (vfmt & R200_VTX_ST0) ? "st0," : "",
1012	      (vfmt & R200_VTX_ST1) ? "st1," : "",
1013	      (vfmt & R200_VTX_Q1) ? "q1," : "",
1014	      (vfmt & R200_VTX_ST2) ? "st2," : "",
1015	      (vfmt & R200_VTX_Q2) ? "q2," : "",
1016	      (vfmt & R200_VTX_ST3) ? "st3," : "",
1017	      (vfmt & R200_VTX_Q3) ? "q3," : "",
1018	      (vfmt & R200_VTX_Q0) ? "q0," : "",
1019	      (vfmt & R200_VTX_N0) ? "n0," : "",
1020	      (vfmt & R200_VTX_XY1) ? "xy1," : "",
1021	      (vfmt & R200_VTX_Z1) ? "z1," : "",
1022	      (vfmt & R200_VTX_W1) ? "w1," : "",
1023	      (vfmt & R200_VTX_N1) ? "n1," : "");
1024
1025
1026      if (!find_or_add_value( &others[V_VTXFMT], vfmt ))
1027	 fprintf(stderr, " *** NEW VALUE");
1028
1029      fprintf(stderr, "\n");
1030   }
1031
1032   return 0;
1033}
1034#endif
1035
1036static char *primname[0x10] = {
1037   "NONE",
1038   "POINTS",
1039   "LINES",
1040   "LINE_STRIP",
1041   "TRIANGLES",
1042   "TRIANGLE_FAN",
1043   "TRIANGLE_STRIP",
1044   "RECT_LIST",
1045   NULL,
1046   "3VRT_POINTS",
1047   "3VRT_LINES",
1048   "POINT_SPRITES",
1049   "LINE_LOOP",
1050   "QUADS",
1051   "QUAD_STRIP",
1052   "POLYGON",
1053};
1054
1055static int print_prim_and_flags( int prim )
1056{
1057   int numverts;
1058
1059   if (NORMAL)
1060      fprintf(stderr, "   %s(%x): %s%s%s%s%s%s\n",
1061	      "prim flags",
1062	      prim,
1063	      ((prim & 0x30) == R200_VF_PRIM_WALK_IND) ? "IND," : "",
1064	      ((prim & 0x30) == R200_VF_PRIM_WALK_LIST) ? "LIST," : "",
1065	      ((prim & 0x30) == R200_VF_PRIM_WALK_RING) ? "RING," : "",
1066	      (prim & R200_VF_COLOR_ORDER_RGBA) ? "RGBA," : "BGRA, ",
1067	      (prim & R200_VF_INDEX_SZ_4) ? "INDX-32," : "",
1068	      (prim & R200_VF_TCL_OUTPUT_VTX_ENABLE) ? "TCL_OUT_VTX," : "");
1069
1070   numverts = prim>>16;
1071
1072   if (NORMAL)
1073      fprintf(stderr, "   prim: %s numverts %d\n", primname[prim&0xf], numverts);
1074
1075   switch (prim & 0xf) {
1076   case R200_VF_PRIM_NONE:
1077   case R200_VF_PRIM_POINTS:
1078      if (numverts < 1) {
1079	 fprintf(stderr, "Bad nr verts for line %d\n", numverts);
1080	 return -1;
1081      }
1082      break;
1083   case R200_VF_PRIM_LINES:
1084   case R200_VF_PRIM_POINT_SPRITES:
1085      if ((numverts & 1) || numverts == 0) {
1086	 fprintf(stderr, "Bad nr verts for line %d\n", numverts);
1087	 return -1;
1088      }
1089      break;
1090   case R200_VF_PRIM_LINE_STRIP:
1091   case R200_VF_PRIM_LINE_LOOP:
1092      if (numverts < 2) {
1093	 fprintf(stderr, "Bad nr verts for line_strip %d\n", numverts);
1094	 return -1;
1095      }
1096      break;
1097   case R200_VF_PRIM_TRIANGLES:
1098   case R200_VF_PRIM_3VRT_POINTS:
1099   case R200_VF_PRIM_3VRT_LINES:
1100   case R200_VF_PRIM_RECT_LIST:
1101      if (numverts % 3 || numverts == 0) {
1102	 fprintf(stderr, "Bad nr verts for tri %d\n", numverts);
1103	 return -1;
1104      }
1105      break;
1106   case R200_VF_PRIM_TRIANGLE_FAN:
1107   case R200_VF_PRIM_TRIANGLE_STRIP:
1108   case R200_VF_PRIM_POLYGON:
1109      if (numverts < 3) {
1110	 fprintf(stderr, "Bad nr verts for strip/fan %d\n", numverts);
1111	 return -1;
1112      }
1113      break;
1114   case R200_VF_PRIM_QUADS:
1115      if (numverts % 4 || numverts == 0) {
1116	 fprintf(stderr, "Bad nr verts for quad %d\n", numverts);
1117	 return -1;
1118      }
1119      break;
1120   case R200_VF_PRIM_QUAD_STRIP:
1121      if (numverts % 2 || numverts < 4) {
1122	 fprintf(stderr, "Bad nr verts for quadstrip %d\n", numverts);
1123	 return -1;
1124      }
1125      break;
1126   default:
1127      fprintf(stderr, "Bad primitive\n");
1128      return -1;
1129   }
1130   return 0;
1131}
1132
1133/* build in knowledge about each packet type
1134 */
1135static int radeon_emit_packet3( drm_radeon_cmd_buffer_t *cmdbuf )
1136{
1137   int cmdsz;
1138   int *cmd = (int *)cmdbuf->buf;
1139   int *tmp;
1140   int i, stride, size, start;
1141
1142   cmdsz = 2 + ((cmd[0] & RADEON_CP_PACKET_COUNT_MASK) >> 16);
1143
1144   if ((cmd[0] & RADEON_CP_PACKET_MASK) != RADEON_CP_PACKET3 ||
1145       cmdsz * 4 > cmdbuf->bufsz ||
1146       cmdsz > RADEON_CP_PACKET_MAX_DWORDS) {
1147      fprintf(stderr, "Bad packet\n");
1148      return -EINVAL;
1149   }
1150
1151   switch( cmd[0] & ~RADEON_CP_PACKET_COUNT_MASK ) {
1152   case R200_CP_CMD_NOP:
1153      if (NORMAL)
1154	 fprintf(stderr, "PACKET3_NOP, %d dwords\n", cmdsz);
1155      break;
1156   case R200_CP_CMD_NEXT_CHAR:
1157      if (NORMAL)
1158	 fprintf(stderr, "PACKET3_NEXT_CHAR, %d dwords\n", cmdsz);
1159      break;
1160   case R200_CP_CMD_PLY_NEXTSCAN:
1161      if (NORMAL)
1162	 fprintf(stderr, "PACKET3_PLY_NEXTSCAN, %d dwords\n", cmdsz);
1163      break;
1164   case R200_CP_CMD_SET_SCISSORS:
1165      if (NORMAL)
1166	 fprintf(stderr, "PACKET3_SET_SCISSORS, %d dwords\n", cmdsz);
1167      break;
1168   case R200_CP_CMD_LOAD_MICROCODE:
1169      if (NORMAL)
1170	 fprintf(stderr, "PACKET3_LOAD_MICROCODE, %d dwords\n", cmdsz);
1171      break;
1172   case R200_CP_CMD_WAIT_FOR_IDLE:
1173      if (NORMAL)
1174	 fprintf(stderr, "PACKET3_WAIT_FOR_IDLE, %d dwords\n", cmdsz);
1175      break;
1176
1177   case R200_CP_CMD_3D_DRAW_VBUF:
1178      if (NORMAL)
1179	 fprintf(stderr, "PACKET3_3D_DRAW_VBUF, %d dwords\n", cmdsz);
1180/*       print_vertex_format(cmd[1]); */
1181      if (print_prim_and_flags(cmd[2]))
1182	 return -EINVAL;
1183      break;
1184
1185   case R200_CP_CMD_3D_DRAW_IMMD:
1186      if (NORMAL)
1187	 fprintf(stderr, "PACKET3_3D_DRAW_IMMD, %d dwords\n", cmdsz);
1188      break;
1189   case R200_CP_CMD_3D_DRAW_INDX: {
1190      int neltdwords;
1191      if (NORMAL)
1192	 fprintf(stderr, "PACKET3_3D_DRAW_INDX, %d dwords\n", cmdsz);
1193/*       print_vertex_format(cmd[1]); */
1194      if (print_prim_and_flags(cmd[2]))
1195	 return -EINVAL;
1196      neltdwords = cmd[2]>>16;
1197      neltdwords += neltdwords & 1;
1198      neltdwords /= 2;
1199      if (neltdwords + 3 != cmdsz)
1200	 fprintf(stderr, "Mismatch in DRAW_INDX, %d vs cmdsz %d\n",
1201		 neltdwords, cmdsz);
1202      break;
1203   }
1204   case R200_CP_CMD_LOAD_PALETTE:
1205      if (NORMAL)
1206	 fprintf(stderr, "PACKET3_LOAD_PALETTE, %d dwords\n", cmdsz);
1207      break;
1208   case R200_CP_CMD_3D_LOAD_VBPNTR:
1209      if (NORMAL) {
1210	 fprintf(stderr, "PACKET3_3D_LOAD_VBPNTR, %d dwords\n", cmdsz);
1211	 fprintf(stderr, "   nr arrays: %d\n", cmd[1]);
1212      }
1213
1214      if (((cmd[1]/2)*3) + ((cmd[1]%2)*2) != cmdsz - 2) {
1215	 fprintf(stderr, "  ****** MISMATCH %d/%d *******\n",
1216		 ((cmd[1]/2)*3) + ((cmd[1]%2)*2) + 2, cmdsz);
1217	 return -EINVAL;
1218      }
1219
1220      if (NORMAL) {
1221	 tmp = cmd+2;
1222	 for (i = 0 ; i < cmd[1] ; i++) {
1223	    if (i & 1) {
1224	       stride = (tmp[0]>>24) & 0xff;
1225	       size = (tmp[0]>>16) & 0xff;
1226	       start = tmp[2];
1227	       tmp += 3;
1228	    }
1229	    else {
1230	       stride = (tmp[0]>>8) & 0xff;
1231	       size = (tmp[0]) & 0xff;
1232	       start = tmp[1];
1233	    }
1234	    fprintf(stderr, "   array %d: start 0x%x vsize %d vstride %d\n",
1235		    i, start, size, stride );
1236	 }
1237      }
1238      break;
1239   case R200_CP_CMD_PAINT:
1240      if (NORMAL)
1241	 fprintf(stderr, "PACKET3_CNTL_PAINT, %d dwords\n", cmdsz);
1242      break;
1243   case R200_CP_CMD_BITBLT:
1244      if (NORMAL)
1245	 fprintf(stderr, "PACKET3_CNTL_BITBLT, %d dwords\n", cmdsz);
1246      break;
1247   case R200_CP_CMD_SMALLTEXT:
1248      if (NORMAL)
1249	 fprintf(stderr, "PACKET3_CNTL_SMALLTEXT, %d dwords\n", cmdsz);
1250      break;
1251   case R200_CP_CMD_HOSTDATA_BLT:
1252      if (NORMAL)
1253	 fprintf(stderr, "PACKET3_CNTL_HOSTDATA_BLT, %d dwords\n",
1254	      cmdsz);
1255      break;
1256   case R200_CP_CMD_POLYLINE:
1257      if (NORMAL)
1258	 fprintf(stderr, "PACKET3_CNTL_POLYLINE, %d dwords\n", cmdsz);
1259      break;
1260   case R200_CP_CMD_POLYSCANLINES:
1261      if (NORMAL)
1262	 fprintf(stderr, "PACKET3_CNTL_POLYSCANLINES, %d dwords\n",
1263	      cmdsz);
1264      break;
1265   case R200_CP_CMD_PAINT_MULTI:
1266      if (NORMAL)
1267	 fprintf(stderr, "PACKET3_CNTL_PAINT_MULTI, %d dwords\n",
1268	      cmdsz);
1269      break;
1270   case R200_CP_CMD_BITBLT_MULTI:
1271      if (NORMAL)
1272	 fprintf(stderr, "PACKET3_CNTL_BITBLT_MULTI, %d dwords\n",
1273	      cmdsz);
1274      break;
1275   case R200_CP_CMD_TRANS_BITBLT:
1276      if (NORMAL)
1277	 fprintf(stderr, "PACKET3_CNTL_TRANS_BITBLT, %d dwords\n",
1278	      cmdsz);
1279      break;
1280   case R200_CP_CMD_3D_DRAW_VBUF_2:
1281      if (NORMAL)
1282	 fprintf(stderr, "R200_CP_CMD_3D_DRAW_VBUF_2, %d dwords\n",
1283	      cmdsz);
1284      if (print_prim_and_flags(cmd[1]))
1285	 return -EINVAL;
1286      break;
1287   case R200_CP_CMD_3D_DRAW_IMMD_2:
1288      if (NORMAL)
1289	 fprintf(stderr, "R200_CP_CMD_3D_DRAW_IMMD_2, %d dwords\n",
1290	      cmdsz);
1291      if (print_prim_and_flags(cmd[1]))
1292	 return -EINVAL;
1293      break;
1294   case R200_CP_CMD_3D_DRAW_INDX_2:
1295      if (NORMAL)
1296	 fprintf(stderr, "R200_CP_CMD_3D_DRAW_INDX_2, %d dwords\n",
1297	      cmdsz);
1298      if (print_prim_and_flags(cmd[1]))
1299	 return -EINVAL;
1300      break;
1301   default:
1302      fprintf(stderr, "UNKNOWN PACKET, %d dwords\n", cmdsz);
1303      break;
1304   }
1305
1306   cmdbuf->buf += cmdsz * 4;
1307   cmdbuf->bufsz -= cmdsz * 4;
1308   return 0;
1309}
1310
1311
1312/* Check cliprects for bounds, then pass on to above:
1313 */
1314static int radeon_emit_packet3_cliprect( drm_radeon_cmd_buffer_t *cmdbuf )
1315{
1316   drm_clip_rect_t *boxes = (drm_clip_rect_t *)cmdbuf->boxes;
1317   int i = 0;
1318
1319   if (VERBOSE && total_changed) {
1320      dump_state();
1321      total_changed = 0;
1322   }
1323
1324   if (NORMAL) {
1325      do {
1326	 if ( i < cmdbuf->nbox ) {
1327	    fprintf(stderr, "Emit box %d/%d %d,%d %d,%d\n",
1328		    i, cmdbuf->nbox,
1329		    boxes[i].x1, boxes[i].y1, boxes[i].x2, boxes[i].y2);
1330	 }
1331      } while ( ++i < cmdbuf->nbox );
1332   }
1333
1334   if (cmdbuf->nbox == 1)
1335      cmdbuf->nbox = 0;
1336
1337   return radeon_emit_packet3( cmdbuf );
1338}
1339
1340
1341int r200SanityCmdBuffer( r200ContextPtr rmesa,
1342			   int nbox,
1343			   drm_clip_rect_t *boxes )
1344{
1345   int idx;
1346   drm_radeon_cmd_buffer_t cmdbuf;
1347   drm_radeon_cmd_header_t header;
1348   static int inited = 0;
1349
1350   if (!inited) {
1351      init_regs();
1352      inited = 1;
1353   }
1354
1355
1356   cmdbuf.buf = rmesa->store.cmd_buf;
1357   cmdbuf.bufsz = rmesa->store.cmd_used;
1358   cmdbuf.boxes = (drm_clip_rect_t *)boxes;
1359   cmdbuf.nbox = nbox;
1360
1361   while ( cmdbuf.bufsz >= sizeof(header) ) {
1362
1363      header.i = *(int *)cmdbuf.buf;
1364      cmdbuf.buf += sizeof(header);
1365      cmdbuf.bufsz -= sizeof(header);
1366
1367      switch (header.header.cmd_type) {
1368      case RADEON_CMD_PACKET:
1369	 if (radeon_emit_packets( header, &cmdbuf )) {
1370	    fprintf(stderr,"radeon_emit_packets failed\n");
1371	    return -EINVAL;
1372	 }
1373	 break;
1374
1375      case RADEON_CMD_SCALARS:
1376	 if (radeon_emit_scalars( header, &cmdbuf )) {
1377	    fprintf(stderr,"radeon_emit_scalars failed\n");
1378	    return -EINVAL;
1379	 }
1380	 break;
1381
1382      case RADEON_CMD_SCALARS2:
1383	 if (radeon_emit_scalars2( header, &cmdbuf )) {
1384	    fprintf(stderr,"radeon_emit_scalars failed\n");
1385	    return -EINVAL;
1386	 }
1387	 break;
1388
1389      case RADEON_CMD_VECTORS:
1390	 if (radeon_emit_vectors( header, &cmdbuf )) {
1391	    fprintf(stderr,"radeon_emit_vectors failed\n");
1392	    return -EINVAL;
1393	 }
1394	 break;
1395
1396      case RADEON_CMD_DMA_DISCARD:
1397	 idx = header.dma.buf_idx;
1398	 if (NORMAL)
1399	    fprintf(stderr, "RADEON_CMD_DMA_DISCARD buf %d\n", idx);
1400	 bufs++;
1401	 break;
1402
1403      case RADEON_CMD_PACKET3:
1404	 if (radeon_emit_packet3( &cmdbuf )) {
1405	    fprintf(stderr,"radeon_emit_packet3 failed\n");
1406	    return -EINVAL;
1407	 }
1408	 break;
1409
1410      case RADEON_CMD_PACKET3_CLIP:
1411	 if (radeon_emit_packet3_cliprect( &cmdbuf )) {
1412	    fprintf(stderr,"radeon_emit_packet3_clip failed\n");
1413	    return -EINVAL;
1414	 }
1415	 break;
1416
1417      case RADEON_CMD_WAIT:
1418	 break;
1419
1420      case RADEON_CMD_VECLINEAR:
1421	 if (radeon_emit_veclinear( header, &cmdbuf )) {
1422	    fprintf(stderr,"radeon_emit_veclinear failed\n");
1423	    return -EINVAL;
1424	 }
1425	 break;
1426
1427      default:
1428	 fprintf(stderr,"bad cmd_type %d at %p\n",
1429		   header.header.cmd_type,
1430		   cmdbuf.buf - sizeof(header));
1431	 return -EINVAL;
1432      }
1433   }
1434
1435   if (0)
1436   {
1437      static int n = 0;
1438      n++;
1439      if (n == 10) {
1440	 fprintf(stderr, "Bufs %d Total emitted %d real changes %d (%.2f%%)\n",
1441		 bufs,
1442		 total, total_changed,
1443		 ((float)total_changed/(float)total*100.0));
1444	 fprintf(stderr, "Total emitted per buf: %.2f\n",
1445		 (float)total/(float)bufs);
1446	 fprintf(stderr, "Real changes per buf: %.2f\n",
1447		 (float)total_changed/(float)bufs);
1448
1449	 bufs = n = total = total_changed = 0;
1450      }
1451   }
1452
1453   fprintf(stderr, "leaving %s\n\n\n", __FUNCTION__);
1454
1455   return 0;
1456}
1457