13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/**************************************************************************
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgCopyright 2002 ATI Technologies Inc., Ontario, Canada, and
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                     Tungsten Graphics Inc, Cedar Park, TX.
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgAll Rights Reserved.
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgPermission is hereby granted, free of charge, to any person obtaining a
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgcopy of this software and associated documentation files (the "Software"),
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgto deal in the Software without restriction, including without limitation
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgon the rights to use, copy, modify, merge, publish, distribute, sub
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orglicense, and/or sell copies of the Software, and to permit persons to whom
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgthe Software is furnished to do so, subject to the following conditions:
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgThe above copyright notice and this permission notice (including the next
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgparagraph) shall be included in all copies or substantial portions of the
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgSoftware.
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgFITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgATI, TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgUSE OR OTHER DEALINGS IN THE SOFTWARE.
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org**************************************************************************/
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Authors:
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *   Keith Whitwell <keith@tungstengraphics.com>
323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org *
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include <errno.h>
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "main/glheader.h"
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "radeon_context.h"
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "radeon_sanity.h"
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Set this '1' to get more verbiage.
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define MORE_VERBOSE 1
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#if MORE_VERBOSE
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define VERBOSE (RADEON_DEBUG & RADEON_VERBOSE)
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define NORMAL  (1)
483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#else
493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define VERBOSE 0
503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define NORMAL  (RADEON_DEBUG & RADEON_VERBOSE)
513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#endif
523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* New (1.3) state mechanism.  3 commands (packet, scalar, vector) in
553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 1.3 cmdbuffers allow all previous state to be updated as well as
563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the tcl scalar and vector areas.
573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic struct {
593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int start;
603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int len;
613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const char *name;
623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} packet[RADEON_MAX_STATE_PACKETS] = {
633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_MISC,7,"RADEON_PP_MISC" },
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CNTL,3,"RADEON_PP_CNTL" },
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_COLORPITCH,1,"RADEON_RB3D_COLORPITCH" },
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RE_LINE_PATTERN,2,"RADEON_RE_LINE_PATTERN" },
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_LINE_WIDTH,1,"RADEON_SE_LINE_WIDTH" },
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_LUM_MATRIX,1,"RADEON_PP_LUM_MATRIX" },
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_ROT_MATRIX_0,2,"RADEON_PP_ROT_MATRIX_0" },
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_STENCILREFMASK,3,"RADEON_RB3D_STENCILREFMASK" },
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_VPORT_XSCALE,6,"RADEON_SE_VPORT_XSCALE" },
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_CNTL,2,"RADEON_SE_CNTL" },
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_CNTL_STATUS,1,"RADEON_SE_CNTL_STATUS" },
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RE_MISC,1,"RADEON_RE_MISC" },
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXFILTER_0,6,"RADEON_PP_TXFILTER_0" },
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_BORDER_COLOR_0,1,"RADEON_PP_BORDER_COLOR_0" },
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXFILTER_1,6,"RADEON_PP_TXFILTER_1" },
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_BORDER_COLOR_1,1,"RADEON_PP_BORDER_COLOR_1" },
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXFILTER_2,6,"RADEON_PP_TXFILTER_2" },
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_BORDER_COLOR_2,1,"RADEON_PP_BORDER_COLOR_2" },
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_ZBIAS_FACTOR,2,"RADEON_SE_ZBIAS_FACTOR" },
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_OUTPUT_VTX_FMT,11,"RADEON_SE_TCL_OUTPUT_VTX_FMT" },
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED,17,"RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED" },
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 4, "R200_PP_TXCBLEND_0" },
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 4, "R200_PP_TXCBLEND_1" },
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 4, "R200_PP_TXCBLEND_2" },
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 4, "R200_PP_TXCBLEND_3" },
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 4, "R200_PP_TXCBLEND_4" },
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 4, "R200_PP_TXCBLEND_5" },
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 4, "R200_PP_TXCBLEND_6" },
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 4, "R200_PP_TXCBLEND_7" },
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 6, "R200_SE_TCL_LIGHT_MODEL_CTL_0" },
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 6, "R200_PP_TFACTOR_0" },
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 4, "R200_SE_VTX_FMT_0" },
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_SE_VAP_CNTL" },
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 5, "R200_SE_TCL_MATRIX_SEL_0" },
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 5, "R200_SE_TCL_TEX_PROC_CTL_2" },
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_SE_TCL_UCP_VERT_BLEND_CTL" },
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 6, "R200_PP_TXFILTER_0" },
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 6, "R200_PP_TXFILTER_1" },
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 6, "R200_PP_TXFILTER_2" },
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 6, "R200_PP_TXFILTER_3" },
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 6, "R200_PP_TXFILTER_4" },
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 6, "R200_PP_TXFILTER_5" },
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_TXOFFSET_0" },
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_TXOFFSET_1" },
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_TXOFFSET_2" },
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_TXOFFSET_3" },
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_TXOFFSET_4" },
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_TXOFFSET_5" },
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_SE_VTE_CNTL" },
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_SE_TCL_OUTPUT_VTX_COMP_SEL" },
1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_TAM_DEBUG3" },
1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_CNTL_X" },
1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_RB3D_DEPTHXY_OFFSET" },
1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_RE_AUX_SCISSOR_CNTL" },
1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 2, "R200_RE_SCISSOR_TL_0" },
1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 2, "R200_RE_SCISSOR_TL_1" },
1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 2, "R200_RE_SCISSOR_TL_2" },
1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_SE_VAP_CNTL_STATUS" },
1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_SE_VTX_STATE_CNTL" },
1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_RE_POINTSIZE" },
1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 4, "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0" },
1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_CUBIC_FACES_0" }, /* 61 */
1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_0" }, /* 62 */
1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_CUBIC_FACES_1" },
1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_1" },
1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_CUBIC_FACES_2" },
1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_2" },
1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_CUBIC_FACES_3" },
1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_3" },
1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_CUBIC_FACES_4" },
1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_4" },
1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_PP_CUBIC_FACES_5" },
1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_5" },
1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TEX_SIZE_0, 2, "RADEON_PP_TEX_SIZE_0" },
1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TEX_SIZE_1, 2, "RADEON_PP_TEX_SIZE_1" },
1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TEX_SIZE_2, 2, "RADEON_PP_TEX_SIZE_2" },
1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 3, "R200_RB3D_BLENDCOLOR" },
1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	{ 0, 1, "R200_SE_TCL_POINT_SPRITE_CNTL" },
1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_FACES_0, 1, "RADEON_PP_CUBIC_FACES_0" },
1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T0_0, 5, "RADEON_PP_CUBIC_OFFSET_T0_0" },
1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_FACES_1, 1, "RADEON_PP_CUBIC_FACES_1" },
1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T1_0, 5, "RADEON_PP_CUBIC_OFFSET_T1_0" },
1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_FACES_2, 1, "RADEON_PP_CUBIC_FACES_2" },
1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T2_0, 5, "RADEON_PP_CUBIC_OFFSET_T2_0" },
1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 2, "R200_PP_TRI_PERF" },
1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 32, "R200_PP_AFS_0"},   /* 85 */
1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 32, "R200_PP_AFS_1"},
1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 8, "R200_ATF_TFACTOR"},
1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 8, "R200_PP_TXCTLALL_0"},
1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 8, "R200_PP_TXCTLALL_1"},
1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 8, "R200_PP_TXCTLALL_2"},
1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 8, "R200_PP_TXCTLALL_3"},
1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 8, "R200_PP_TXCTLALL_4"},
1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 8, "R200_PP_TXCTLALL_5"},
1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 0, 2, "R200_VAP_PVS_CNTL"},
1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct reg_names {
1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int idx;
1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   const char *name;
1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic struct reg_names reg_names[] = {
1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_MISC, "RADEON_PP_MISC" },
1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_FOG_COLOR, "RADEON_PP_FOG_COLOR" },
1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RE_SOLID_COLOR, "RADEON_RE_SOLID_COLOR" },
1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_BLENDCNTL, "RADEON_RB3D_BLENDCNTL" },
1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_DEPTHOFFSET, "RADEON_RB3D_DEPTHOFFSET" },
1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_DEPTHPITCH, "RADEON_RB3D_DEPTHPITCH" },
1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_ZSTENCILCNTL, "RADEON_RB3D_ZSTENCILCNTL" },
1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CNTL, "RADEON_PP_CNTL" },
1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_CNTL, "RADEON_RB3D_CNTL" },
1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_COLOROFFSET, "RADEON_RB3D_COLOROFFSET" },
1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_COLORPITCH, "RADEON_RB3D_COLORPITCH" },
1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_CNTL, "RADEON_SE_CNTL" },
1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_COORD_FMT, "RADEON_SE_COORDFMT" },
1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_CNTL_STATUS, "RADEON_SE_CNTL_STATUS" },
1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RE_LINE_PATTERN, "RADEON_RE_LINE_PATTERN" },
1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RE_LINE_STATE, "RADEON_RE_LINE_STATE" },
1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_LINE_WIDTH, "RADEON_SE_LINE_WIDTH" },
1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_STENCILREFMASK, "RADEON_RB3D_STENCILREFMASK" },
1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_ROPCNTL, "RADEON_RB3D_ROPCNTL" },
1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RB3D_PLANEMASK, "RADEON_RB3D_PLANEMASK" },
1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_VPORT_XSCALE, "RADEON_SE_VPORT_XSCALE" },
1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_VPORT_XOFFSET, "RADEON_SE_VPORT_XOFFSET" },
1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_VPORT_YSCALE, "RADEON_SE_VPORT_YSCALE" },
1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_VPORT_YOFFSET, "RADEON_SE_VPORT_YOFFSET" },
1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_VPORT_ZSCALE, "RADEON_SE_VPORT_ZSCALE" },
1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_VPORT_ZOFFSET, "RADEON_SE_VPORT_ZOFFSET" },
1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_RE_MISC, "RADEON_RE_MISC" },
1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXFILTER_0, "RADEON_PP_TXFILTER_0" },
1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXFILTER_1, "RADEON_PP_TXFILTER_1" },
1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXFILTER_2, "RADEON_PP_TXFILTER_2" },
1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXFORMAT_0, "RADEON_PP_TXFORMAT_0" },
1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXFORMAT_1, "RADEON_PP_TXFORMAT_1" },
1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXFORMAT_2, "RADEON_PP_TXFORMAT_2" },
1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXOFFSET_0, "RADEON_PP_TXOFFSET_0" },
2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXOFFSET_1, "RADEON_PP_TXOFFSET_1" },
2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXOFFSET_2, "RADEON_PP_TXOFFSET_2" },
2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXCBLEND_0, "RADEON_PP_TXCBLEND_0" },
2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXCBLEND_1, "RADEON_PP_TXCBLEND_1" },
2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXCBLEND_2, "RADEON_PP_TXCBLEND_2" },
2053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXABLEND_0, "RADEON_PP_TXABLEND_0" },
2063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXABLEND_1, "RADEON_PP_TXABLEND_1" },
2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TXABLEND_2, "RADEON_PP_TXABLEND_2" },
2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TFACTOR_0, "RADEON_PP_TFACTOR_0" },
2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TFACTOR_1, "RADEON_PP_TFACTOR_1" },
2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TFACTOR_2, "RADEON_PP_TFACTOR_2" },
2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_BORDER_COLOR_0, "RADEON_PP_BORDER_COLOR_0" },
2123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_BORDER_COLOR_1, "RADEON_PP_BORDER_COLOR_1" },
2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_BORDER_COLOR_2, "RADEON_PP_BORDER_COLOR_2" },
2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_ZBIAS_FACTOR, "RADEON_SE_ZBIAS_FACTOR" },
2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_ZBIAS_CONSTANT, "RADEON_SE_ZBIAS_CONSTANT" },
2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_OUTPUT_VTX_FMT, "RADEON_SE_TCL_OUTPUT_VTXFMT" },
2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_OUTPUT_VTX_SEL, "RADEON_SE_TCL_OUTPUT_VTXSEL" },
2183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATRIX_SELECT_0, "RADEON_SE_TCL_MATRIX_SELECT_0" },
2193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATRIX_SELECT_1, "RADEON_SE_TCL_MATRIX_SELECT_1" },
2203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_UCP_VERT_BLEND_CTL, "RADEON_SE_TCL_UCP_VERT_BLEND_CTL" },
2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_TEXTURE_PROC_CTL, "RADEON_SE_TCL_TEXTURE_PROC_CTL" },
2223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_LIGHT_MODEL_CTL, "RADEON_SE_TCL_LIGHT_MODEL_CTL" },
2233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_PER_LIGHT_CTL_0, "RADEON_SE_TCL_PER_LIGHT_CTL_0" },
2243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_PER_LIGHT_CTL_1, "RADEON_SE_TCL_PER_LIGHT_CTL_1" },
2253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_PER_LIGHT_CTL_2, "RADEON_SE_TCL_PER_LIGHT_CTL_2" },
2263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_PER_LIGHT_CTL_3, "RADEON_SE_TCL_PER_LIGHT_CTL_3" },
2273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED, "RADEON_SE_TCL_EMMISSIVE_RED" },
2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_EMMISSIVE_GREEN, "RADEON_SE_TCL_EMMISSIVE_GREEN" },
2293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_EMMISSIVE_BLUE, "RADEON_SE_TCL_EMMISSIVE_BLUE" },
2303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_EMMISSIVE_ALPHA, "RADEON_SE_TCL_EMMISSIVE_ALPHA" },
2313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_AMBIENT_RED, "RADEON_SE_TCL_AMBIENT_RED" },
2323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_AMBIENT_GREEN, "RADEON_SE_TCL_AMBIENT_GREEN" },
2333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_AMBIENT_BLUE, "RADEON_SE_TCL_AMBIENT_BLUE" },
2343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_AMBIENT_ALPHA, "RADEON_SE_TCL_AMBIENT_ALPHA" },
2353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_DIFFUSE_RED, "RADEON_SE_TCL_DIFFUSE_RED" },
2363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_DIFFUSE_GREEN, "RADEON_SE_TCL_DIFFUSE_GREEN" },
2373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_DIFFUSE_BLUE, "RADEON_SE_TCL_DIFFUSE_BLUE" },
2383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_DIFFUSE_ALPHA, "RADEON_SE_TCL_DIFFUSE_ALPHA" },
2393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_SPECULAR_RED, "RADEON_SE_TCL_SPECULAR_RED" },
2403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_SPECULAR_GREEN, "RADEON_SE_TCL_SPECULAR_GREEN" },
2413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_SPECULAR_BLUE, "RADEON_SE_TCL_SPECULAR_BLUE" },
2423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_MATERIAL_SPECULAR_ALPHA, "RADEON_SE_TCL_SPECULAR_ALPHA" },
2433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_TCL_SHININESS, "RADEON_SE_TCL_SHININESS" },
2443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SE_COORD_FMT, "RADEON_SE_COORD_FMT" },
2453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TEX_SIZE_0, "RADEON_PP_TEX_SIZE_0" },
2463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TEX_SIZE_1, "RADEON_PP_TEX_SIZE_1" },
2473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TEX_SIZE_2, "RADEON_PP_TEX_SIZE_2" },
2483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TEX_SIZE_0+4, "RADEON_PP_TEX_PITCH_0" },
2493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TEX_SIZE_1+4, "RADEON_PP_TEX_PITCH_1" },
2503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_TEX_SIZE_2+4, "RADEON_PP_TEX_PITCH_2" },
2513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_FACES_0, "RADEON_PP_CUBIC_FACES_0" },
2523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_FACES_1, "RADEON_PP_CUBIC_FACES_1" },
2533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_FACES_2, "RADEON_PP_CUBIC_FACES_2" },
2543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T0_0, "RADEON_PP_CUBIC_OFFSET_T0_0" },
2553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T0_1, "RADEON_PP_CUBIC_OFFSET_T0_1" },
2563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T0_2, "RADEON_PP_CUBIC_OFFSET_T0_2" },
2573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T0_3, "RADEON_PP_CUBIC_OFFSET_T0_3" },
2583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T0_4, "RADEON_PP_CUBIC_OFFSET_T0_4" },
2593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T1_0, "RADEON_PP_CUBIC_OFFSET_T1_0" },
2603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T1_1, "RADEON_PP_CUBIC_OFFSET_T1_1" },
2613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T1_2, "RADEON_PP_CUBIC_OFFSET_T1_2" },
2623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T1_3, "RADEON_PP_CUBIC_OFFSET_T1_3" },
2633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T1_4, "RADEON_PP_CUBIC_OFFSET_T1_4" },
2643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T2_0, "RADEON_PP_CUBIC_OFFSET_T2_0" },
2653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T2_1, "RADEON_PP_CUBIC_OFFSET_T2_1" },
2663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T2_2, "RADEON_PP_CUBIC_OFFSET_T2_2" },
2673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T2_3, "RADEON_PP_CUBIC_OFFSET_T2_3" },
2683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_PP_CUBIC_OFFSET_T2_4, "RADEON_PP_CUBIC_OFFSET_T2_4" },
2693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
2703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic struct reg_names scalar_names[] = {
2723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SS_LIGHT_DCD_ADDR, "LIGHT_DCD" },
2733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SS_LIGHT_SPOT_EXPONENT_ADDR, "LIGHT_SPOT_EXPONENT" },
2743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SS_LIGHT_SPOT_CUTOFF_ADDR, "LIGHT_SPOT_CUTOFF" },
2753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SS_LIGHT_SPECULAR_THRESH_ADDR, "LIGHT_SPECULAR_THRESH" },
2763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SS_LIGHT_RANGE_CUTOFF_ADDR, "LIGHT_RANGE_CUTOFF" },
2773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SS_VERT_GUARD_CLIP_ADJ_ADDR, "VERT_GUARD_CLIP" },
2783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SS_VERT_GUARD_DISCARD_ADJ_ADDR, "VERT_GUARD_DISCARD" },
2793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SS_HORZ_GUARD_CLIP_ADJ_ADDR, "HORZ_GUARD_CLIP" },
2803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SS_HORZ_GUARD_DISCARD_ADJ_ADDR, "HORZ_GUARD_DISCARD" },
2813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_SS_SHININESS, "SHININESS" },
2823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 1000, "" },
2833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
2843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Puff these out to make them look like normal (dword) registers.
2863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
2873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic struct reg_names vector_names[] = {
2883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_0_ADDR * 4, "MATRIX_0" },
2893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_1_ADDR * 4, "MATRIX_1" },
2903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_2_ADDR * 4, "MATRIX_2" },
2913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_3_ADDR * 4, "MATRIX_3" },
2923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_4_ADDR * 4, "MATRIX_4" },
2933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_5_ADDR * 4, "MATRIX_5" },
2943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_6_ADDR * 4, "MATRIX_6" },
2953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_7_ADDR * 4, "MATRIX_7" },
2963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_8_ADDR * 4, "MATRIX_8" },
2973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_9_ADDR * 4, "MATRIX_9" },
2983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_10_ADDR * 4, "MATRIX_10" },
2993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_11_ADDR * 4, "MATRIX_11" },
3003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_12_ADDR * 4, "MATRIX_12" },
3013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_13_ADDR * 4, "MATRIX_13" },
3023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_14_ADDR * 4, "MATRIX_14" },
3033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_15_ADDR * 4, "MATRIX_15" },
3043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_LIGHT_AMBIENT_ADDR * 4, "LIGHT_AMBIENT" },
3053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_LIGHT_DIFFUSE_ADDR * 4, "LIGHT_DIFFUSE" },
3063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_LIGHT_SPECULAR_ADDR * 4, "LIGHT_SPECULAR" },
3073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_LIGHT_DIRPOS_ADDR * 4, "LIGHT_DIRPOS" },
3083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_LIGHT_HWVSPOT_ADDR * 4, "LIGHT_HWVSPOT" },
3093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_LIGHT_ATTENUATION_ADDR * 4, "LIGHT_ATTENUATION" },
3103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_MATRIX_EYE2CLIP_ADDR * 4, "MATRIX_EYE2CLIP" },
3113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_UCP_ADDR * 4, "UCP" },
3123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_GLOBAL_AMBIENT_ADDR * 4, "GLOBAL_AMBIENT" },
3133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_FOG_PARAM_ADDR * 4, "FOG_PARAM" },
3143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { RADEON_VS_EYE_VECTOR_ADDR * 4, "EYE_VECTOR" },
3153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   { 1000, "" },
3163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
3173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgunion fi { float f; int i; };
3193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define ISVEC   1
3213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define ISFLOAT 2
3223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define TOUCHED 4
3233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct reg {
3253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int idx;
3263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct reg_names *closest;
3273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int flags;
3283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   union fi current;
3293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   union fi *values;
3303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int nvalues;
3313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int nalloc;
3323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float vmin, vmax;
3333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
3343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic struct reg regs[Elements(reg_names)+1];
3373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic struct reg scalars[512+1];
3383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic struct reg vectors[512*4+1];
3393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int total, total_changed, bufs;
3413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void init_regs( void )
3433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   struct reg_names *tmp;
3453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i;
3463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0 ; i < Elements(regs)-1 ; i++) {
3483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      regs[i].idx = reg_names[i].idx;
3493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      regs[i].closest = &reg_names[i];
3503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      regs[i].flags = 0;
3513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0, tmp = scalar_names ; i < Elements(scalars) ; i++) {
3543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (tmp[1].idx == i) tmp++;
3553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      scalars[i].idx = i;
3563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      scalars[i].closest = tmp;
3573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      scalars[i].flags = ISFLOAT;
3583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0, tmp = vector_names ; i < Elements(vectors) ; i++) {
3613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (tmp[1].idx*4 == i) tmp++;
3623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      vectors[i].idx = i;
3633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      vectors[i].closest = tmp;
3643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      vectors[i].flags = ISFLOAT|ISVEC;
3653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   regs[Elements(regs)-1].idx = -1;
3683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   scalars[Elements(scalars)-1].idx = -1;
3693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   vectors[Elements(vectors)-1].idx = -1;
3703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int find_or_add_value( struct reg *reg, int val )
3733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int j;
3753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for ( j = 0 ; j < reg->nvalues ; j++)
3773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if ( val == reg->values[j].i )
3783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 return 1;
3793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (j == reg->nalloc) {
3813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      reg->nalloc += 5;
3823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      reg->nalloc *= 2;
3833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      reg->values = (union fi *) realloc( reg->values,
3843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org					  reg->nalloc * sizeof(union fi) );
3853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   reg->values[reg->nvalues++].i = val;
3883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 0;
3893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
3903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic struct reg *lookup_reg( struct reg *tab, int reg )
3923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
3933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i;
3943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
3953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0 ; tab[i].idx != -1 ; i++) {
3963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (tab[i].idx == reg)
3973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 return &tab[i];
3983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
3993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   fprintf(stderr, "*** unknown reg 0x%x\n", reg);
4013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return NULL;
4023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
4033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic const char *get_reg_name( struct reg *reg )
4063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
4073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   static char tmp[80];
4083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (reg->idx == reg->closest->idx)
4103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return reg->closest->name;
4113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (reg->flags & ISVEC) {
4143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (reg->idx/4 != reg->closest->idx)
4153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 sprintf(tmp, "%s+%d[%d]",
4163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 reg->closest->name,
4173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 (reg->idx/4) - reg->closest->idx,
4183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 reg->idx%4);
4193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else
4203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 sprintf(tmp, "%s[%d]", reg->closest->name, reg->idx%4);
4213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
4223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else {
4233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (reg->idx != reg->closest->idx)
4243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 sprintf(tmp, "%s+%d", reg->closest->name, reg->idx - reg->closest->idx);
4253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else
4263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 sprintf(tmp, "%s", reg->closest->name);
4273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
4283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return tmp;
4303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
4313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int print_int_reg_assignment( struct reg *reg, int data )
4333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
4343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int changed = (reg->current.i != data);
4353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int ever_seen = find_or_add_value( reg, data );
4363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (VERBOSE || (NORMAL && (changed || !ever_seen)))
4383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       fprintf(stderr, "   %s <-- 0x%x", get_reg_name(reg), data);
4393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (NORMAL) {
4413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (!ever_seen)
4423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, " *** BRAND NEW VALUE");
4433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else if (changed)
4443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, " *** CHANGED");
4453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
4463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   reg->current.i = data;
4483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (VERBOSE || (NORMAL && (changed || !ever_seen)))
4503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "\n");
4513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return changed;
4533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
4543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int print_float_reg_assignment( struct reg *reg, float data )
4573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
4583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int changed = (reg->current.f != data);
4593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int newmin = (data < reg->vmin);
4603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int newmax = (data > reg->vmax);
4613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (VERBOSE || (NORMAL && (newmin || newmax || changed)))
4633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "   %s <-- %.3f", get_reg_name(reg), data);
4643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (NORMAL) {
4663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (newmin) {
4673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, " *** NEW MIN (prev %.3f)", reg->vmin);
4683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 reg->vmin = data;
4693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
4703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else if (newmax) {
4713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, " *** NEW MAX (prev %.3f)", reg->vmax);
4723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 reg->vmax = data;
4733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
4743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      else if (changed) {
4753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, " *** CHANGED");
4763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
4773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
4783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   reg->current.f = data;
4803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (VERBOSE || (NORMAL && (newmin || newmax || changed)))
4823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "\n");
4833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return changed;
4853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
4863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int print_reg_assignment( struct reg *reg, int data )
4883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
4893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   float_ui32_type datau;
4903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   datau.ui32 = data;
4913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   reg->flags |= TOUCHED;
4923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (reg->flags & ISFLOAT)
4933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return print_float_reg_assignment( reg, datau.f );
4943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else
4953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return print_int_reg_assignment( reg, data );
4963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
4973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
4983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void print_reg( struct reg *reg )
4993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
5003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (reg->flags & TOUCHED) {
5013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (reg->flags & ISFLOAT) {
5023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "   %s == %f\n", get_reg_name(reg), reg->current.f);
5033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      } else {
5043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "   %s == 0x%x\n", get_reg_name(reg), reg->current.i);
5053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
5063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
5083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void dump_state( void )
5113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
5123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i;
5133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0 ; i < Elements(regs) ; i++)
5153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      print_reg( &regs[i] );
5163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0 ; i < Elements(scalars) ; i++)
5183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      print_reg( &scalars[i] );
5193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0 ; i < Elements(vectors) ; i++)
5213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      print_reg( &vectors[i] );
5223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
5233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int radeon_emit_packets(
5273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_radeon_cmd_header_t header,
5283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_radeon_cmd_buffer_t *cmdbuf )
5293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
5303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int id = (int)header.packet.packet_id;
5313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int sz = packet[id].len;
5323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int *data = (int *)cmdbuf->buf;
5333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i;
5343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (sz * sizeof(int) > cmdbuf->bufsz) {
5363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "Packet overflows cmdbuf\n");
5373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return -EINVAL;
5383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (!packet[id].name) {
5413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "*** Unknown packet 0 nr %d\n", id );
5423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return -EINVAL;
5433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (VERBOSE)
5473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "Packet 0 reg %s nr %d\n", packet[id].name, sz );
5483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for ( i = 0 ; i < sz ; i++) {
5503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      struct reg *reg = lookup_reg( regs, packet[id].start + i*4 );
5513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (print_reg_assignment( reg, data[i] ))
5523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 total_changed++;
5533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      total++;
5543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf->buf += sz * sizeof(int);
5573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf->bufsz -= sz * sizeof(int);
5583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 0;
5593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
5603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int radeon_emit_scalars(
5633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_radeon_cmd_header_t header,
5643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_radeon_cmd_buffer_t *cmdbuf )
5653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
5663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int sz = header.scalars.count;
5673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int *data = (int *)cmdbuf->buf;
5683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int start = header.scalars.offset;
5693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int stride = header.scalars.stride;
5703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i;
5713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (VERBOSE)
5733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "emit scalars, start %d stride %d nr %d (end %d)\n",
5743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      start, stride, sz, start + stride * sz);
5753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0 ; i < sz ; i++, start += stride) {
5783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      struct reg *reg = lookup_reg( scalars, start );
5793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (print_reg_assignment( reg, data[i] ))
5803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 total_changed++;
5813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      total++;
5823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
5833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf->buf += sz * sizeof(int);
5853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf->bufsz -= sz * sizeof(int);
5863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 0;
5873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
5883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
5903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int radeon_emit_scalars2(
5913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_radeon_cmd_header_t header,
5923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_radeon_cmd_buffer_t *cmdbuf )
5933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
5943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int sz = header.scalars.count;
5953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int *data = (int *)cmdbuf->buf;
5963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int start = header.scalars.offset + 0x100;
5973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int stride = header.scalars.stride;
5983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i;
5993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (VERBOSE)
6013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "emit scalars2, start %d stride %d nr %d (end %d)\n",
6023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      start, stride, sz, start + stride * sz);
6033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (start + stride * sz > 257) {
6053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "emit scalars OVERFLOW %d/%d/%d\n", start, stride, sz);
6063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return -1;
6073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
6083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0 ; i < sz ; i++, start += stride) {
6103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      struct reg *reg = lookup_reg( scalars, start );
6113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (print_reg_assignment( reg, data[i] ))
6123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 total_changed++;
6133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      total++;
6143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
6153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf->buf += sz * sizeof(int);
6173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf->bufsz -= sz * sizeof(int);
6183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 0;
6193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
6203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Check: inf/nan/extreme-size?
6223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Check: table start, end, nr, etc.
6233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
6243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int radeon_emit_vectors(
6253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_radeon_cmd_header_t header,
6263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_radeon_cmd_buffer_t *cmdbuf )
6273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
6283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int sz = header.vectors.count;
6293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int *data = (int *)cmdbuf->buf;
6303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int start = header.vectors.offset;
6313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int stride = header.vectors.stride;
6323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i,j;
6333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (VERBOSE)
6353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "emit vectors, start %d stride %d nr %d (end %d) (0x%x)\n",
6363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      start, stride, sz, start + stride * sz, header.i);
6373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*    if (start + stride * (sz/4) > 128) { */
6393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*       fprintf(stderr, "emit vectors OVERFLOW %d/%d/%d\n", start, stride, sz); */
6403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*       return -1; */
6413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*    } */
6423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   for (i = 0 ; i < sz ;  start += stride) {
6443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      int changed = 0;
6453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      for (j = 0 ; j < 4 ; i++,j++) {
6463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 struct reg *reg = lookup_reg( vectors, start*4+j );
6473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 if (print_reg_assignment( reg, data[i] ))
6483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    changed = 1;
6493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
6503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (changed)
6513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 total_changed += 4;
6523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      total += 4;
6533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
6543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf->buf += sz * sizeof(int);
6573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf->bufsz -= sz * sizeof(int);
6583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 0;
6593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
6603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int print_vertex_format( int vfmt )
6633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
6643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (NORMAL) {
6653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      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",
6663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      "vertex format",
6673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      vfmt,
6683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      "xy,",
6693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_Z) ? "z," : "",
6703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_W0) ? "w0," : "",
6713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_FPCOLOR) ? "fpcolor," : "",
6723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_FPALPHA) ? "fpalpha," : "",
6733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_PKCOLOR) ? "pkcolor," : "",
6743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_FPSPEC) ? "fpspec," : "",
6753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_FPFOG) ? "fpfog," : "",
6763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_PKSPEC) ? "pkspec," : "",
6773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_ST0) ? "st0," : "",
6783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_ST1) ? "st1," : "",
6793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_Q1) ? "q1," : "",
6803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_ST2) ? "st2," : "",
6813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_Q2) ? "q2," : "",
6823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_ST3) ? "st3," : "",
6833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_Q3) ? "q3," : "",
6843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_Q0) ? "q0," : "",
6853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_N0) ? "n0," : "",
6863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_XY1) ? "xy1," : "",
6873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_Z1) ? "z1," : "",
6883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_W1) ? "w1," : "",
6893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (vfmt & RADEON_CP_VC_FRMT_N1) ? "n1," : "");
6903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/*       if (!find_or_add_value( &others[V_VTXFMT], vfmt )) */
6933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* 	 fprintf(stderr, " *** NEW VALUE"); */
6943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "\n");
6963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
6973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
6983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 0;
6993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
7003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
7013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic char *primname[0xf] = {
7023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "NONE",
7033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "POINTS",
7043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "LINES",
7053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "LINE_STRIP",
7063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "TRIANGLES",
7073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "TRIANGLE_FAN",
7083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "TRIANGLE_STRIP",
7093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "TRI_TYPE_2",
7103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "RECT_LIST",
7113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "3VRT_POINTS",
7123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   "3VRT_LINES",
7133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org};
7143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
7153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int print_prim_and_flags( int prim )
7163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
7173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int numverts;
7183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
7193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (NORMAL)
7203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "   %s(%x): %s%s%s%s%s%s%s\n",
7213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      "prim flags",
7223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      prim,
7233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      ((prim & 0x30) == RADEON_CP_VC_CNTL_PRIM_WALK_IND) ? "IND," : "",
7243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      ((prim & 0x30) == RADEON_CP_VC_CNTL_PRIM_WALK_LIST) ? "LIST," : "",
7253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      ((prim & 0x30) == RADEON_CP_VC_CNTL_PRIM_WALK_RING) ? "RING," : "",
7263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (prim & RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA) ? "RGBA," : "BGRA, ",
7273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (prim & RADEON_CP_VC_CNTL_MAOS_ENABLE) ? "MAOS," : "",
7283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (prim & RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE) ? "RADEON," : "",
7293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      (prim & RADEON_CP_VC_CNTL_TCL_ENABLE) ? "TCL," : "");
7303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
7313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if ((prim & 0xf) > RADEON_CP_VC_CNTL_PRIM_TYPE_3VRT_LINE_LIST) {
7323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "   *** Bad primitive: %x\n", prim & 0xf);
7333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return -1;
7343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
7353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
7363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   numverts = prim>>16;
7373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
7383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (NORMAL)
7393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "   prim: %s numverts %d\n", primname[prim&0xf], numverts);
7403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
7413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   switch (prim & 0xf) {
7423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_VC_CNTL_PRIM_TYPE_NONE:
7433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_VC_CNTL_PRIM_TYPE_POINT:
7443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (numverts < 1) {
7453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "Bad nr verts for line %d\n", numverts);
7463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 return -1;
7473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
7483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
7493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_VC_CNTL_PRIM_TYPE_LINE:
7503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if ((numverts & 1) || numverts == 0) {
7513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "Bad nr verts for line %d\n", numverts);
7523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 return -1;
7533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
7543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
7553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_VC_CNTL_PRIM_TYPE_LINE_STRIP:
7563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (numverts < 2) {
7573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "Bad nr verts for line_strip %d\n", numverts);
7583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 return -1;
7593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
7603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
7613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST:
7623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_VC_CNTL_PRIM_TYPE_3VRT_POINT_LIST:
7633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_VC_CNTL_PRIM_TYPE_3VRT_LINE_LIST:
7643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST:
7653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (numverts % 3 || numverts == 0) {
7663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "Bad nr verts for tri %d\n", numverts);
7673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 return -1;
7683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
7693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
7703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_FAN:
7713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_STRIP:
7723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (numverts < 3) {
7733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "Bad nr verts for strip/fan %d\n", numverts);
7743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 return -1;
7753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
7763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
7773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   default:
7783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "Bad primitive\n");
7793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return -1;
7803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
7813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 0;
7823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
7833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
7843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* build in knowledge about each packet type
7853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
7863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int radeon_emit_packet3( drm_radeon_cmd_buffer_t *cmdbuf )
7873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
7883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int cmdsz;
7893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int *cmd = (int *)cmdbuf->buf;
7903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int *tmp;
7913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i, stride, size, start;
7923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
7933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdsz = 2 + ((cmd[0] & RADEON_CP_PACKET_COUNT_MASK) >> 16);
7943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
7953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if ((cmd[0] & RADEON_CP_PACKET_MASK) != RADEON_CP_PACKET3 ||
7963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       cmdsz * 4 > cmdbuf->bufsz ||
7973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       cmdsz > RADEON_CP_PACKET_MAX_DWORDS) {
7983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "Bad packet\n");
7993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      return -EINVAL;
8003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
8013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
8023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   switch( cmd[0] & ~RADEON_CP_PACKET_COUNT_MASK ) {
8033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_NOP:
8043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_NOP, %d dwords\n", cmdsz);
8063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_NEXT_CHAR:
8083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_NEXT_CHAR, %d dwords\n", cmdsz);
8103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_PLY_NEXTSCAN:
8123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_PLY_NEXTSCAN, %d dwords\n", cmdsz);
8143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_SET_SCISSORS:
8163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_SET_SCISSORS, %d dwords\n", cmdsz);
8183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_3D_RNDR_GEN_INDX_PRIM:
8203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_3D_RNDR_GEN_INDX_PRIM, %d dwords\n",
8223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      cmdsz);
8233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_LOAD_MICROCODE:
8253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_LOAD_MICROCODE, %d dwords\n", cmdsz);
8273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_WAIT_FOR_IDLE:
8293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_WAIT_FOR_IDLE, %d dwords\n", cmdsz);
8313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
8333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_3D_DRAW_VBUF:
8343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_3D_DRAW_VBUF, %d dwords\n", cmdsz);
8363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      print_vertex_format(cmd[1]);
8373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      print_prim_and_flags(cmd[2]);
8383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
8403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_3D_DRAW_IMMD:
8413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_3D_DRAW_IMMD, %d dwords\n", cmdsz);
8433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_3D_DRAW_INDX: {
8453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      int neltdwords;
8463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_3D_DRAW_INDX, %d dwords\n", cmdsz);
8483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      print_vertex_format(cmd[1]);
8493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      print_prim_and_flags(cmd[2]);
8503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      neltdwords = cmd[2]>>16;
8513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      neltdwords += neltdwords & 1;
8523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      neltdwords /= 2;
8533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (neltdwords + 3 != cmdsz)
8543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "Mismatch in DRAW_INDX, %d vs cmdsz %d\n",
8553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 neltdwords, cmdsz);
8563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
8583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_LOAD_PALETTE:
8593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_LOAD_PALETTE, %d dwords\n", cmdsz);
8613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_3D_LOAD_VBPNTR:
8633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL) {
8643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_3D_LOAD_VBPNTR, %d dwords\n", cmdsz);
8653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "   nr arrays: %d\n", cmd[1]);
8663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
8673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
8683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (cmd[1]/2 + cmd[1]%2 != cmdsz - 3) {
8693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "  ****** MISMATCH %d/%d *******\n",
8703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 cmd[1]/2 + cmd[1]%2 + 3, cmdsz);
8713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 return -EINVAL;
8723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
8733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
8743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL) {
8753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 tmp = cmd+2;
8763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 for (i = 0 ; i < cmd[1] ; i++) {
8773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    if (i & 1) {
8783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	       stride = (tmp[0]>>24) & 0xff;
8793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	       size = (tmp[0]>>16) & 0xff;
8803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	       start = tmp[2];
8813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	       tmp += 3;
8823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    }
8833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    else {
8843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	       stride = (tmp[0]>>8) & 0xff;
8853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	       size = (tmp[0]) & 0xff;
8863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	       start = tmp[1];
8873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    }
8883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    fprintf(stderr, "   array %d: start 0x%x vsize %d vstride %d\n",
8893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		    i, start, size, stride );
8903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 }
8913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
8923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_CNTL_PAINT:
8943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_CNTL_PAINT, %d dwords\n", cmdsz);
8963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
8973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_CNTL_BITBLT:
8983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
8993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_CNTL_BITBLT, %d dwords\n", cmdsz);
9003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
9013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_CNTL_SMALLTEXT:
9023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
9033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_CNTL_SMALLTEXT, %d dwords\n", cmdsz);
9043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
9053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_CNTL_HOSTDATA_BLT:
9063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
9073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_CNTL_HOSTDATA_BLT, %d dwords\n",
9083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      cmdsz);
9093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
9103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_CNTL_POLYLINE:
9113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
9123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_CNTL_POLYLINE, %d dwords\n", cmdsz);
9133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
9143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_CNTL_POLYSCANLINES:
9153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
9163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_CNTL_POLYSCANLINES, %d dwords\n",
9173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      cmdsz);
9183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
9193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_CNTL_PAINT_MULTI:
9203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
9213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_CNTL_PAINT_MULTI, %d dwords\n",
9223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      cmdsz);
9233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
9243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_CNTL_BITBLT_MULTI:
9253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
9263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_CNTL_BITBLT_MULTI, %d dwords\n",
9273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      cmdsz);
9283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
9293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   case RADEON_CP_PACKET3_CNTL_TRANS_BITBLT:
9303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (NORMAL)
9313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "PACKET3_CNTL_TRANS_BITBLT, %d dwords\n",
9323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	      cmdsz);
9333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
9343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   default:
9353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      fprintf(stderr, "UNKNOWN PACKET, %d dwords\n", cmdsz);
9363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      break;
9373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
9383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf->buf += cmdsz * 4;
9403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf->bufsz -= cmdsz * 4;
9413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 0;
9423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
9433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Check cliprects for bounds, then pass on to above:
9463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */
9473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic int radeon_emit_packet3_cliprect( drm_radeon_cmd_buffer_t *cmdbuf )
9483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
9493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_clip_rect_t *boxes = cmdbuf->boxes;
9503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int i = 0;
9513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (VERBOSE && total_changed) {
9533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      dump_state();
9543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      total_changed = 0;
9553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
9563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   else fprintf(stderr, "total_changed zero\n");
9573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (NORMAL) {
9593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      do {
9603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 if ( i < cmdbuf->nbox ) {
9613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    fprintf(stderr, "Emit box %d/%d %d,%d %d,%d\n",
9623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		    i, cmdbuf->nbox,
9633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		    boxes[i].x1, boxes[i].y1, boxes[i].x2, boxes[i].y2);
9643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 }
9653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      } while ( ++i < cmdbuf->nbox );
9663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
9673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (cmdbuf->nbox == 1)
9693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      cmdbuf->nbox = 0;
9703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return radeon_emit_packet3( cmdbuf );
9723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
9733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgint radeonSanityCmdBuffer( r100ContextPtr rmesa,
9763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			   int nbox,
9773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org			   drm_clip_rect_t *boxes )
9783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{
9793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   int idx;
9803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_radeon_cmd_buffer_t cmdbuf;
9813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   drm_radeon_cmd_header_t header;
9823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   static int inited = 0;
9833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (!inited) {
9853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      init_regs();
9863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      inited = 1;
9873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
9883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf.buf = rmesa->store.cmd_buf;
9903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf.bufsz = rmesa->store.cmd_used;
9913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf.boxes = boxes;
9923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   cmdbuf.nbox = nbox;
9933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   while ( cmdbuf.bufsz >= sizeof(header) ) {
9953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
9963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      header.i = *(int *)cmdbuf.buf;
9973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      cmdbuf.buf += sizeof(header);
9983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      cmdbuf.bufsz -= sizeof(header);
9993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      switch (header.header.cmd_type) {
10013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case RADEON_CMD_PACKET:
10023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 if (radeon_emit_packets( header, &cmdbuf )) {
10033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    fprintf(stderr,"radeon_emit_packets failed\n");
10043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    return -EINVAL;
10053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 }
10063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 break;
10073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case RADEON_CMD_SCALARS:
10093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 if (radeon_emit_scalars( header, &cmdbuf )) {
10103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    fprintf(stderr,"radeon_emit_scalars failed\n");
10113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    return -EINVAL;
10123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 }
10133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 break;
10143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case RADEON_CMD_SCALARS2:
10163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 if (radeon_emit_scalars2( header, &cmdbuf )) {
10173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    fprintf(stderr,"radeon_emit_scalars failed\n");
10183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    return -EINVAL;
10193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 }
10203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 break;
10213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case RADEON_CMD_VECTORS:
10233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 if (radeon_emit_vectors( header, &cmdbuf )) {
10243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    fprintf(stderr,"radeon_emit_vectors failed\n");
10253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    return -EINVAL;
10263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 }
10273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 break;
10283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case RADEON_CMD_DMA_DISCARD:
10303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 idx = header.dma.buf_idx;
10313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 if (NORMAL)
10323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    fprintf(stderr, "RADEON_CMD_DMA_DISCARD buf %d\n", idx);
10333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 bufs++;
10343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 break;
10353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case RADEON_CMD_PACKET3:
10373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 if (radeon_emit_packet3( &cmdbuf )) {
10383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    fprintf(stderr,"radeon_emit_packet3 failed\n");
10393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    return -EINVAL;
10403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 }
10413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 break;
10423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case RADEON_CMD_PACKET3_CLIP:
10443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 if (radeon_emit_packet3_cliprect( &cmdbuf )) {
10453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    fprintf(stderr,"radeon_emit_packet3_clip failed\n");
10463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	    return -EINVAL;
10473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 }
10483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 break;
10493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      case RADEON_CMD_WAIT:
10513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 break;
10523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      default:
10543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr,"bad cmd_type %d at %p\n",
10553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		   header.header.cmd_type,
10563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		   cmdbuf.buf - sizeof(header));
10573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 return -EINVAL;
10583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
10593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
10603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   if (0)
10623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   {
10633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      static int n = 0;
10643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      n++;
10653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      if (n == 10) {
10663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "Bufs %d Total emitted %d real changes %d (%.2f%%)\n",
10673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 bufs,
10683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 total, total_changed,
10693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 ((float)total_changed/(float)total*100.0));
10703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "Total emitted per buf: %.2f\n",
10713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 (float)total/(float)bufs);
10723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 fprintf(stderr, "Real changes per buf: %.2f\n",
10733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org		 (float)total_changed/(float)bufs);
10743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org	 bufs = n = total = total_changed = 0;
10763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org      }
10773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   }
10783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
10793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org   return 0;
10803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}
1081