15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/**************************************************************************
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulCopyright 2002 ATI Technologies Inc., Ontario, Canada, and
4877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca                     VMware, Inc.
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulAll Rights Reserved.
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulPermission is hereby granted, free of charge, to any person obtaining a
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulcopy of this software and associated documentation files (the "Software"),
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulto deal in the Software without restriction, including without limitation
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulon the rights to use, copy, modify, merge, publish, distribute, sub
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paullicense, and/or sell copies of the Software, and to permit persons to whom
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulthe Software is furnished to do so, subject to the following conditions:
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulThe above copyright notice and this permission notice (including the next
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulparagraph) shall be included in all copies or substantial portions of the
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulSoftware.
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulFITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
22877128505431adaf817dc8069172ebe4a1cdf5d8José FonsecaATI, VMWARE AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulDAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulOTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulUSE OR OTHER DEALINGS IN THE SOFTWARE.
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul**************************************************************************/
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Authors:
31877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca *   Keith Whitwell <keithw@vmware.com>
325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul *
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
34bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl#include <errno.h>
355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
36ecadb51bbcb972a79f3ed79e65a7986b9396e757Brian Paul#include "main/glheader.h"
375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_context.h"
395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "radeon_sanity.h"
405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Set this '1' to get more verbiage.
425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define MORE_VERBOSE 1
445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if MORE_VERBOSE
464e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen#define VERBOSE (RADEON_DEBUG & RADEON_VERBOSE)
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define NORMAL  (1)
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#else
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define VERBOSE 0
504e0d99a63588c67a955f797733da32d04e6f4ee6Pauli Nieminen#define NORMAL  (RADEON_DEBUG & RADEON_VERBOSE)
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* New (1.3) state mechanism.  3 commands (packet, scalar, vector) in
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * 1.3 cmdbuffers allow all previous state to be updated as well as
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * the tcl scalar and vector areas.
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct {
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int start;
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int len;
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const char *name;
625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul} packet[RADEON_MAX_STATE_PACKETS] = {
635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_MISC,7,"RADEON_PP_MISC" },
645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_CNTL,3,"RADEON_PP_CNTL" },
655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_COLORPITCH,1,"RADEON_RB3D_COLORPITCH" },
665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RE_LINE_PATTERN,2,"RADEON_RE_LINE_PATTERN" },
675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_LINE_WIDTH,1,"RADEON_SE_LINE_WIDTH" },
685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_LUM_MATRIX,1,"RADEON_PP_LUM_MATRIX" },
695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_ROT_MATRIX_0,2,"RADEON_PP_ROT_MATRIX_0" },
705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_STENCILREFMASK,3,"RADEON_RB3D_STENCILREFMASK" },
715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_VPORT_XSCALE,6,"RADEON_SE_VPORT_XSCALE" },
725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_CNTL,2,"RADEON_SE_CNTL" },
735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_CNTL_STATUS,1,"RADEON_SE_CNTL_STATUS" },
745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RE_MISC,1,"RADEON_RE_MISC" },
755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXFILTER_0,6,"RADEON_PP_TXFILTER_0" },
765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_BORDER_COLOR_0,1,"RADEON_PP_BORDER_COLOR_0" },
775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXFILTER_1,6,"RADEON_PP_TXFILTER_1" },
785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_BORDER_COLOR_1,1,"RADEON_PP_BORDER_COLOR_1" },
795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXFILTER_2,6,"RADEON_PP_TXFILTER_2" },
805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_BORDER_COLOR_2,1,"RADEON_PP_BORDER_COLOR_2" },
815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_ZBIAS_FACTOR,2,"RADEON_SE_ZBIAS_FACTOR" },
825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_OUTPUT_VTX_FMT,11,"RADEON_SE_TCL_OUTPUT_VTX_FMT" },
835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED,17,"RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED" },
845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 4, "R200_PP_TXCBLEND_0" },
855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 4, "R200_PP_TXCBLEND_1" },
865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 4, "R200_PP_TXCBLEND_2" },
875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 4, "R200_PP_TXCBLEND_3" },
885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 4, "R200_PP_TXCBLEND_4" },
895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 4, "R200_PP_TXCBLEND_5" },
905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 4, "R200_PP_TXCBLEND_6" },
915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 4, "R200_PP_TXCBLEND_7" },
925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 6, "R200_SE_TCL_LIGHT_MODEL_CTL_0" },
935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 6, "R200_PP_TFACTOR_0" },
945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 4, "R200_SE_VTX_FMT_0" },
955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_SE_VAP_CNTL" },
965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 5, "R200_SE_TCL_MATRIX_SEL_0" },
975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 5, "R200_SE_TCL_TEX_PROC_CTL_2" },
985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_SE_TCL_UCP_VERT_BLEND_CTL" },
995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 6, "R200_PP_TXFILTER_0" },
1005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 6, "R200_PP_TXFILTER_1" },
1015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 6, "R200_PP_TXFILTER_2" },
1025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 6, "R200_PP_TXFILTER_3" },
1035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 6, "R200_PP_TXFILTER_4" },
1045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 6, "R200_PP_TXFILTER_5" },
1055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_TXOFFSET_0" },
1065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_TXOFFSET_1" },
1075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_TXOFFSET_2" },
1085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_TXOFFSET_3" },
1095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_TXOFFSET_4" },
1105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_TXOFFSET_5" },
1115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_SE_VTE_CNTL" },
1125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_SE_TCL_OUTPUT_VTX_COMP_SEL" },
1135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_TAM_DEBUG3" },
1145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_CNTL_X" },
1155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_RB3D_DEPTHXY_OFFSET" },
1165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_RE_AUX_SCISSOR_CNTL" },
1175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 2, "R200_RE_SCISSOR_TL_0" },
1185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 2, "R200_RE_SCISSOR_TL_1" },
1195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 2, "R200_RE_SCISSOR_TL_2" },
1205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_SE_VAP_CNTL_STATUS" },
1215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_SE_VTX_STATE_CNTL" },
1225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_RE_POINTSIZE" },
1235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 4, "R200_SE_TCL_INPUT_VTX_VECTOR_ADDR_0" },
1245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_CUBIC_FACES_0" }, /* 61 */
1255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_0" }, /* 62 */
1265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_CUBIC_FACES_1" },
1275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_1" },
1285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_CUBIC_FACES_2" },
1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_2" },
1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_CUBIC_FACES_3" },
1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_3" },
1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_CUBIC_FACES_4" },
1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_4" },
1345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 1, "R200_PP_CUBIC_FACES_5" },
1355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	{ 0, 5, "R200_PP_CUBIC_OFFSET_F1_5" },
1365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TEX_SIZE_0, 2, "RADEON_PP_TEX_SIZE_0" },
1375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TEX_SIZE_1, 2, "RADEON_PP_TEX_SIZE_1" },
1382ed479784859e01441eeaffc67e916aa6b863defAlan Hourihane   { RADEON_PP_TEX_SIZE_2, 2, "RADEON_PP_TEX_SIZE_2" },
13926755698c8b8981be8778527c4381d69f790e291Roland Scheidegger	{ 0, 3, "R200_RB3D_BLENDCOLOR" },
140b31b7836d6e7abf80dd4feacce333d4b1fe6e4abRoland Scheidegger	{ 0, 1, "R200_SE_TCL_POINT_SPRITE_CNTL" },
14126d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_FACES_0, 1, "RADEON_PP_CUBIC_FACES_0" },
14226d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T0_0, 5, "RADEON_PP_CUBIC_OFFSET_T0_0" },
14326d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_FACES_1, 1, "RADEON_PP_CUBIC_FACES_1" },
14426d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T1_0, 5, "RADEON_PP_CUBIC_OFFSET_T1_0" },
14526d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_FACES_2, 1, "RADEON_PP_CUBIC_FACES_2" },
14626d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T2_0, 5, "RADEON_PP_CUBIC_OFFSET_T2_0" },
147fbe5296d1463e1052590b744f3d62ebb9e5d5dd4Roland Scheidegger   { 0, 2, "R200_PP_TRI_PERF" },
148c53d2d0ca81f4335c3b3bf9870635ba5ec2b3b52Roland Scheidegger   { 0, 32, "R200_PP_AFS_0"},   /* 85 */
149c53d2d0ca81f4335c3b3bf9870635ba5ec2b3b52Roland Scheidegger   { 0, 32, "R200_PP_AFS_1"},
150c53d2d0ca81f4335c3b3bf9870635ba5ec2b3b52Roland Scheidegger   { 0, 8, "R200_ATF_TFACTOR"},
151c53d2d0ca81f4335c3b3bf9870635ba5ec2b3b52Roland Scheidegger   { 0, 8, "R200_PP_TXCTLALL_0"},
152c53d2d0ca81f4335c3b3bf9870635ba5ec2b3b52Roland Scheidegger   { 0, 8, "R200_PP_TXCTLALL_1"},
153c53d2d0ca81f4335c3b3bf9870635ba5ec2b3b52Roland Scheidegger   { 0, 8, "R200_PP_TXCTLALL_2"},
154c53d2d0ca81f4335c3b3bf9870635ba5ec2b3b52Roland Scheidegger   { 0, 8, "R200_PP_TXCTLALL_3"},
155c53d2d0ca81f4335c3b3bf9870635ba5ec2b3b52Roland Scheidegger   { 0, 8, "R200_PP_TXCTLALL_4"},
156c53d2d0ca81f4335c3b3bf9870635ba5ec2b3b52Roland Scheidegger   { 0, 8, "R200_PP_TXCTLALL_5"},
1578a6182105772280e2727de4a00809c8fb7b13c87Roland Scheidegger   { 0, 2, "R200_VAP_PVS_CNTL"},
1585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
1595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct reg_names {
1615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int idx;
1625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   const char *name;
1635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
1645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct reg_names reg_names[] = {
1665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_MISC, "RADEON_PP_MISC" },
1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_FOG_COLOR, "RADEON_PP_FOG_COLOR" },
1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RE_SOLID_COLOR, "RADEON_RE_SOLID_COLOR" },
1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_BLENDCNTL, "RADEON_RB3D_BLENDCNTL" },
1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_DEPTHOFFSET, "RADEON_RB3D_DEPTHOFFSET" },
1715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_DEPTHPITCH, "RADEON_RB3D_DEPTHPITCH" },
1725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_ZSTENCILCNTL, "RADEON_RB3D_ZSTENCILCNTL" },
1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_CNTL, "RADEON_PP_CNTL" },
1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_CNTL, "RADEON_RB3D_CNTL" },
1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_COLOROFFSET, "RADEON_RB3D_COLOROFFSET" },
1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_COLORPITCH, "RADEON_RB3D_COLORPITCH" },
1775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_CNTL, "RADEON_SE_CNTL" },
1785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_COORD_FMT, "RADEON_SE_COORDFMT" },
1795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_CNTL_STATUS, "RADEON_SE_CNTL_STATUS" },
1805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RE_LINE_PATTERN, "RADEON_RE_LINE_PATTERN" },
1815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RE_LINE_STATE, "RADEON_RE_LINE_STATE" },
1825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_LINE_WIDTH, "RADEON_SE_LINE_WIDTH" },
1835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_STENCILREFMASK, "RADEON_RB3D_STENCILREFMASK" },
1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_ROPCNTL, "RADEON_RB3D_ROPCNTL" },
1855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RB3D_PLANEMASK, "RADEON_RB3D_PLANEMASK" },
1865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_VPORT_XSCALE, "RADEON_SE_VPORT_XSCALE" },
1875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_VPORT_XOFFSET, "RADEON_SE_VPORT_XOFFSET" },
1885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_VPORT_YSCALE, "RADEON_SE_VPORT_YSCALE" },
1895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_VPORT_YOFFSET, "RADEON_SE_VPORT_YOFFSET" },
1905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_VPORT_ZSCALE, "RADEON_SE_VPORT_ZSCALE" },
1915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_VPORT_ZOFFSET, "RADEON_SE_VPORT_ZOFFSET" },
1925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_RE_MISC, "RADEON_RE_MISC" },
1935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXFILTER_0, "RADEON_PP_TXFILTER_0" },
1945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXFILTER_1, "RADEON_PP_TXFILTER_1" },
1955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXFILTER_2, "RADEON_PP_TXFILTER_2" },
1965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXFORMAT_0, "RADEON_PP_TXFORMAT_0" },
1975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXFORMAT_1, "RADEON_PP_TXFORMAT_1" },
1982ed479784859e01441eeaffc67e916aa6b863defAlan Hourihane   { RADEON_PP_TXFORMAT_2, "RADEON_PP_TXFORMAT_2" },
1995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXOFFSET_0, "RADEON_PP_TXOFFSET_0" },
2005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXOFFSET_1, "RADEON_PP_TXOFFSET_1" },
2012ed479784859e01441eeaffc67e916aa6b863defAlan Hourihane   { RADEON_PP_TXOFFSET_2, "RADEON_PP_TXOFFSET_2" },
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXCBLEND_0, "RADEON_PP_TXCBLEND_0" },
2035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXCBLEND_1, "RADEON_PP_TXCBLEND_1" },
2042ed479784859e01441eeaffc67e916aa6b863defAlan Hourihane   { RADEON_PP_TXCBLEND_2, "RADEON_PP_TXCBLEND_2" },
2055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXABLEND_0, "RADEON_PP_TXABLEND_0" },
2065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TXABLEND_1, "RADEON_PP_TXABLEND_1" },
2072ed479784859e01441eeaffc67e916aa6b863defAlan Hourihane   { RADEON_PP_TXABLEND_2, "RADEON_PP_TXABLEND_2" },
2085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TFACTOR_0, "RADEON_PP_TFACTOR_0" },
2095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TFACTOR_1, "RADEON_PP_TFACTOR_1" },
2102ed479784859e01441eeaffc67e916aa6b863defAlan Hourihane   { RADEON_PP_TFACTOR_2, "RADEON_PP_TFACTOR_2" },
2115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_BORDER_COLOR_0, "RADEON_PP_BORDER_COLOR_0" },
2125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_BORDER_COLOR_1, "RADEON_PP_BORDER_COLOR_1" },
2132ed479784859e01441eeaffc67e916aa6b863defAlan Hourihane   { RADEON_PP_BORDER_COLOR_2, "RADEON_PP_BORDER_COLOR_2" },
2145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_ZBIAS_FACTOR, "RADEON_SE_ZBIAS_FACTOR" },
2155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_ZBIAS_CONSTANT, "RADEON_SE_ZBIAS_CONSTANT" },
2165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_OUTPUT_VTX_FMT, "RADEON_SE_TCL_OUTPUT_VTXFMT" },
2175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_OUTPUT_VTX_SEL, "RADEON_SE_TCL_OUTPUT_VTXSEL" },
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATRIX_SELECT_0, "RADEON_SE_TCL_MATRIX_SELECT_0" },
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATRIX_SELECT_1, "RADEON_SE_TCL_MATRIX_SELECT_1" },
2205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_UCP_VERT_BLEND_CTL, "RADEON_SE_TCL_UCP_VERT_BLEND_CTL" },
2215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_TEXTURE_PROC_CTL, "RADEON_SE_TCL_TEXTURE_PROC_CTL" },
2225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_LIGHT_MODEL_CTL, "RADEON_SE_TCL_LIGHT_MODEL_CTL" },
2235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_PER_LIGHT_CTL_0, "RADEON_SE_TCL_PER_LIGHT_CTL_0" },
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_PER_LIGHT_CTL_1, "RADEON_SE_TCL_PER_LIGHT_CTL_1" },
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_PER_LIGHT_CTL_2, "RADEON_SE_TCL_PER_LIGHT_CTL_2" },
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_PER_LIGHT_CTL_3, "RADEON_SE_TCL_PER_LIGHT_CTL_3" },
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_EMMISSIVE_RED, "RADEON_SE_TCL_EMMISSIVE_RED" },
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_EMMISSIVE_GREEN, "RADEON_SE_TCL_EMMISSIVE_GREEN" },
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_EMMISSIVE_BLUE, "RADEON_SE_TCL_EMMISSIVE_BLUE" },
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_EMMISSIVE_ALPHA, "RADEON_SE_TCL_EMMISSIVE_ALPHA" },
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_AMBIENT_RED, "RADEON_SE_TCL_AMBIENT_RED" },
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_AMBIENT_GREEN, "RADEON_SE_TCL_AMBIENT_GREEN" },
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_AMBIENT_BLUE, "RADEON_SE_TCL_AMBIENT_BLUE" },
2345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_AMBIENT_ALPHA, "RADEON_SE_TCL_AMBIENT_ALPHA" },
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_DIFFUSE_RED, "RADEON_SE_TCL_DIFFUSE_RED" },
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_DIFFUSE_GREEN, "RADEON_SE_TCL_DIFFUSE_GREEN" },
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_DIFFUSE_BLUE, "RADEON_SE_TCL_DIFFUSE_BLUE" },
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_DIFFUSE_ALPHA, "RADEON_SE_TCL_DIFFUSE_ALPHA" },
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_SPECULAR_RED, "RADEON_SE_TCL_SPECULAR_RED" },
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_SPECULAR_GREEN, "RADEON_SE_TCL_SPECULAR_GREEN" },
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_SPECULAR_BLUE, "RADEON_SE_TCL_SPECULAR_BLUE" },
2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_MATERIAL_SPECULAR_ALPHA, "RADEON_SE_TCL_SPECULAR_ALPHA" },
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_TCL_SHININESS, "RADEON_SE_TCL_SHININESS" },
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SE_COORD_FMT, "RADEON_SE_COORD_FMT" },
2455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TEX_SIZE_0, "RADEON_PP_TEX_SIZE_0" },
2465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TEX_SIZE_1, "RADEON_PP_TEX_SIZE_1" },
2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TEX_SIZE_2, "RADEON_PP_TEX_SIZE_2" },
2485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TEX_SIZE_0+4, "RADEON_PP_TEX_PITCH_0" },
2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TEX_SIZE_1+4, "RADEON_PP_TEX_PITCH_1" },
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_PP_TEX_SIZE_2+4, "RADEON_PP_TEX_PITCH_2" },
25126d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_FACES_0, "RADEON_PP_CUBIC_FACES_0" },
25226d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_FACES_1, "RADEON_PP_CUBIC_FACES_1" },
25326d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_FACES_2, "RADEON_PP_CUBIC_FACES_2" },
25426d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T0_0, "RADEON_PP_CUBIC_OFFSET_T0_0" },
25526d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T0_1, "RADEON_PP_CUBIC_OFFSET_T0_1" },
25626d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T0_2, "RADEON_PP_CUBIC_OFFSET_T0_2" },
25726d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T0_3, "RADEON_PP_CUBIC_OFFSET_T0_3" },
25826d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T0_4, "RADEON_PP_CUBIC_OFFSET_T0_4" },
25926d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T1_0, "RADEON_PP_CUBIC_OFFSET_T1_0" },
26026d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T1_1, "RADEON_PP_CUBIC_OFFSET_T1_1" },
26126d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T1_2, "RADEON_PP_CUBIC_OFFSET_T1_2" },
26226d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T1_3, "RADEON_PP_CUBIC_OFFSET_T1_3" },
26326d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T1_4, "RADEON_PP_CUBIC_OFFSET_T1_4" },
26426d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T2_0, "RADEON_PP_CUBIC_OFFSET_T2_0" },
26526d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T2_1, "RADEON_PP_CUBIC_OFFSET_T2_1" },
26626d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T2_2, "RADEON_PP_CUBIC_OFFSET_T2_2" },
26726d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T2_3, "RADEON_PP_CUBIC_OFFSET_T2_3" },
26826d31591257d575362776972439f614948366dd1Roland Scheidegger   { RADEON_PP_CUBIC_OFFSET_T2_4, "RADEON_PP_CUBIC_OFFSET_T2_4" },
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct reg_names scalar_names[] = {
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SS_LIGHT_DCD_ADDR, "LIGHT_DCD" },
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SS_LIGHT_SPOT_EXPONENT_ADDR, "LIGHT_SPOT_EXPONENT" },
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SS_LIGHT_SPOT_CUTOFF_ADDR, "LIGHT_SPOT_CUTOFF" },
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SS_LIGHT_SPECULAR_THRESH_ADDR, "LIGHT_SPECULAR_THRESH" },
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SS_LIGHT_RANGE_CUTOFF_ADDR, "LIGHT_RANGE_CUTOFF" },
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SS_VERT_GUARD_CLIP_ADJ_ADDR, "VERT_GUARD_CLIP" },
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SS_VERT_GUARD_DISCARD_ADJ_ADDR, "VERT_GUARD_DISCARD" },
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SS_HORZ_GUARD_CLIP_ADJ_ADDR, "HORZ_GUARD_CLIP" },
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SS_HORZ_GUARD_DISCARD_ADJ_ADDR, "HORZ_GUARD_DISCARD" },
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_SS_SHININESS, "SHININESS" },
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { 1000, "" },
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Puff these out to make them look like normal (dword) registers.
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct reg_names vector_names[] = {
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_0_ADDR * 4, "MATRIX_0" },
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_1_ADDR * 4, "MATRIX_1" },
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_2_ADDR * 4, "MATRIX_2" },
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_3_ADDR * 4, "MATRIX_3" },
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_4_ADDR * 4, "MATRIX_4" },
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_5_ADDR * 4, "MATRIX_5" },
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_6_ADDR * 4, "MATRIX_6" },
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_7_ADDR * 4, "MATRIX_7" },
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_8_ADDR * 4, "MATRIX_8" },
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_9_ADDR * 4, "MATRIX_9" },
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_10_ADDR * 4, "MATRIX_10" },
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_11_ADDR * 4, "MATRIX_11" },
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_12_ADDR * 4, "MATRIX_12" },
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_13_ADDR * 4, "MATRIX_13" },
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_14_ADDR * 4, "MATRIX_14" },
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_15_ADDR * 4, "MATRIX_15" },
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_LIGHT_AMBIENT_ADDR * 4, "LIGHT_AMBIENT" },
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_LIGHT_DIFFUSE_ADDR * 4, "LIGHT_DIFFUSE" },
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_LIGHT_SPECULAR_ADDR * 4, "LIGHT_SPECULAR" },
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_LIGHT_DIRPOS_ADDR * 4, "LIGHT_DIRPOS" },
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_LIGHT_HWVSPOT_ADDR * 4, "LIGHT_HWVSPOT" },
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_LIGHT_ATTENUATION_ADDR * 4, "LIGHT_ATTENUATION" },
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_MATRIX_EYE2CLIP_ADDR * 4, "MATRIX_EYE2CLIP" },
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_UCP_ADDR * 4, "UCP" },
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_GLOBAL_AMBIENT_ADDR * 4, "GLOBAL_AMBIENT" },
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_FOG_PARAM_ADDR * 4, "FOG_PARAM" },
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { RADEON_VS_EYE_VECTOR_ADDR * 4, "EYE_VECTOR" },
3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   { 1000, "" },
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ISVEC   1
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define ISFLOAT 2
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#define TOUCHED 4
3215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct reg {
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int idx;
3245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct reg_names *closest;
3255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int flags;
3265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   union fi current;
3275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   union fi *values;
3285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int nvalues;
3295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int nalloc;
3305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   float vmin, vmax;
3315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
3325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3346633271159f99bc86d29a86d7e3802f0b60c7a11Brian Paulstatic struct reg regs[ARRAY_SIZE(reg_names)+1];
3355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct reg scalars[512+1];
3365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct reg vectors[512*4+1];
3375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int total, total_changed, bufs;
3395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void init_regs( void )
3415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   struct reg_names *tmp;
3435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
3445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3456633271159f99bc86d29a86d7e3802f0b60c7a11Brian Paul   for (i = 0 ; i < ARRAY_SIZE(regs)-1 ; i++) {
3465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      regs[i].idx = reg_names[i].idx;
3475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      regs[i].closest = &reg_names[i];
3485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      regs[i].flags = 0;
3495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3516633271159f99bc86d29a86d7e3802f0b60c7a11Brian Paul   for (i = 0, tmp = scalar_names ; i < ARRAY_SIZE(scalars) ; i++) {
3525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (tmp[1].idx == i) tmp++;
3535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      scalars[i].idx = i;
3545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      scalars[i].closest = tmp;
3555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      scalars[i].flags = ISFLOAT;
3565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3586633271159f99bc86d29a86d7e3802f0b60c7a11Brian Paul   for (i = 0, tmp = vector_names ; i < ARRAY_SIZE(vectors) ; i++) {
3595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (tmp[1].idx*4 == i) tmp++;
3605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      vectors[i].idx = i;
3615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      vectors[i].closest = tmp;
3625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      vectors[i].flags = ISFLOAT|ISVEC;
3635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3656633271159f99bc86d29a86d7e3802f0b60c7a11Brian Paul   regs[ARRAY_SIZE(regs)-1].idx = -1;
3666633271159f99bc86d29a86d7e3802f0b60c7a11Brian Paul   scalars[ARRAY_SIZE(scalars)-1].idx = -1;
3676633271159f99bc86d29a86d7e3802f0b60c7a11Brian Paul   vectors[ARRAY_SIZE(vectors)-1].idx = -1;
3685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int find_or_add_value( struct reg *reg, int val )
3715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int j;
3735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( j = 0 ; j < reg->nvalues ; j++)
3755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ( val == reg->values[j].i )
3765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return 1;
3775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (j == reg->nalloc) {
3795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      reg->nalloc += 5;
3805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      reg->nalloc *= 2;
3812b7a972e3f36bfcdc6fbe2b59d7ffdcde49c9405Matt Turner      reg->values = realloc( reg->values, reg->nalloc * sizeof(union fi) );
3825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   reg->values[reg->nvalues++].i = val;
3855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return 0;
3865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic struct reg *lookup_reg( struct reg *tab, int reg )
3895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
3905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
3915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (i = 0 ; tab[i].idx != -1 ; i++) {
3935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (tab[i].idx == reg)
3945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return &tab[i];
3955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
3965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   fprintf(stderr, "*** unknown reg 0x%x\n", reg);
3982c28dd892cfb43445d7e54df8b6a8331192f4e99Brian Paul   return NULL;
3995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic const char *get_reg_name( struct reg *reg )
4035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   static char tmp[80];
4055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (reg->idx == reg->closest->idx)
4075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return reg->closest->name;
4085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (reg->flags & ISVEC) {
4115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (reg->idx/4 != reg->closest->idx)
4125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 sprintf(tmp, "%s+%d[%d]",
4135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 reg->closest->name,
4145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 (reg->idx/4) - reg->closest->idx,
4155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 reg->idx%4);
4165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
4175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 sprintf(tmp, "%s[%d]", reg->closest->name, reg->idx%4);
4185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else {
4205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (reg->idx != reg->closest->idx)
4215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 sprintf(tmp, "%s+%d", reg->closest->name, reg->idx - reg->closest->idx);
4225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else
4235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 sprintf(tmp, "%s", reg->closest->name);
4245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return tmp;
4275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int print_int_reg_assignment( struct reg *reg, int data )
4305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int changed = (reg->current.i != data);
4325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int ever_seen = find_or_add_value( reg, data );
4335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (VERBOSE || (NORMAL && (changed || !ever_seen)))
4355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       fprintf(stderr, "   %s <-- 0x%x", get_reg_name(reg), data);
4365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (NORMAL) {
4385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (!ever_seen)
4395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, " *** BRAND NEW VALUE");
4405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else if (changed)
4415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, " *** CHANGED");
4425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   reg->current.i = data;
4455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (VERBOSE || (NORMAL && (changed || !ever_seen)))
4475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "\n");
4485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return changed;
4505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int print_float_reg_assignment( struct reg *reg, float data )
4545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int changed = (reg->current.f != data);
4565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int newmin = (data < reg->vmin);
4575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int newmax = (data > reg->vmax);
4585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (VERBOSE || (NORMAL && (newmin || newmax || changed)))
4605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "   %s <-- %.3f", get_reg_name(reg), data);
4615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (NORMAL) {
4635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (newmin) {
4645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, " *** NEW MIN (prev %.3f)", reg->vmin);
4655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 reg->vmin = data;
4665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else if (newmax) {
4685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, " *** NEW MAX (prev %.3f)", reg->vmax);
4695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 reg->vmax = data;
4705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      else if (changed) {
4725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, " *** CHANGED");
4735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
4745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
4755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   reg->current.f = data;
4775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (VERBOSE || (NORMAL && (newmin || newmax || changed)))
4795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "\n");
4805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return changed;
4825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int print_reg_assignment( struct reg *reg, int data )
4855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
48608e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   float_ui32_type datau;
48708e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger   datau.ui32 = data;
4885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   reg->flags |= TOUCHED;
4895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (reg->flags & ISFLOAT)
49008e62a147618ac796f5e548bdaa3380342ec2a78Roland Scheidegger      return print_float_reg_assignment( reg, datau.f );
4915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else
4925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return print_int_reg_assignment( reg, data );
4935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
4945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
4955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void print_reg( struct reg *reg )
4965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
4975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (reg->flags & TOUCHED) {
4985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (reg->flags & ISFLOAT) {
4995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "   %s == %f\n", get_reg_name(reg), reg->current.f);
5005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } else {
5015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "   %s == 0x%x\n", get_reg_name(reg), reg->current.i);
5025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
5035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic void dump_state( void )
5085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
5105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5116633271159f99bc86d29a86d7e3802f0b60c7a11Brian Paul   for (i = 0 ; i < ARRAY_SIZE(regs) ; i++)
5125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      print_reg( &regs[i] );
5135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5146633271159f99bc86d29a86d7e3802f0b60c7a11Brian Paul   for (i = 0 ; i < ARRAY_SIZE(scalars) ; i++)
5155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      print_reg( &scalars[i] );
5165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5176633271159f99bc86d29a86d7e3802f0b60c7a11Brian Paul   for (i = 0 ; i < ARRAY_SIZE(vectors) ; i++)
5185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      print_reg( &vectors[i] );
5195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int radeon_emit_packets(
524ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_cmd_header_t header,
525ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_cmd_buffer_t *cmdbuf )
5265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int id = (int)header.packet.packet_id;
5285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int sz = packet[id].len;
5295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int *data = (int *)cmdbuf->buf;
5305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
5315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (sz * sizeof(int) > cmdbuf->bufsz) {
5335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "Packet overflows cmdbuf\n");
5345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return -EINVAL;
5355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (!packet[id].name) {
5385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "*** Unknown packet 0 nr %d\n", id );
5395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return -EINVAL;
5405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (VERBOSE)
5445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "Packet 0 reg %s nr %d\n", packet[id].name, sz );
5455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for ( i = 0 ; i < sz ; i++) {
5475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      struct reg *reg = lookup_reg( regs, packet[id].start + i*4 );
5485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (print_reg_assignment( reg, data[i] ))
5495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 total_changed++;
5505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      total++;
5515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf->buf += sz * sizeof(int);
5545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf->bufsz -= sz * sizeof(int);
5555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return 0;
5565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int radeon_emit_scalars(
560ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_cmd_header_t header,
561ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_cmd_buffer_t *cmdbuf )
5625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int sz = header.scalars.count;
5645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int *data = (int *)cmdbuf->buf;
5655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int start = header.scalars.offset;
5665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int stride = header.scalars.stride;
5675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
5685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (VERBOSE)
5705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "emit scalars, start %d stride %d nr %d (end %d)\n",
5715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      start, stride, sz, start + stride * sz);
5725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (i = 0 ; i < sz ; i++, start += stride) {
5755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      struct reg *reg = lookup_reg( scalars, start );
5765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (print_reg_assignment( reg, data[i] ))
5775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 total_changed++;
5785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      total++;
5795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
5805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf->buf += sz * sizeof(int);
5825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf->bufsz -= sz * sizeof(int);
5835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return 0;
5845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
5855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int radeon_emit_scalars2(
588ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_cmd_header_t header,
589ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_cmd_buffer_t *cmdbuf )
5905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
5915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int sz = header.scalars.count;
5925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int *data = (int *)cmdbuf->buf;
5935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int start = header.scalars.offset + 0x100;
5945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int stride = header.scalars.stride;
5955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i;
5965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
5975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (VERBOSE)
5985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "emit scalars2, start %d stride %d nr %d (end %d)\n",
5995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      start, stride, sz, start + stride * sz);
6005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (start + stride * sz > 257) {
6025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "emit scalars OVERFLOW %d/%d/%d\n", start, stride, sz);
6035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return -1;
6045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (i = 0 ; i < sz ; i++, start += stride) {
6075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      struct reg *reg = lookup_reg( scalars, start );
6085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (print_reg_assignment( reg, data[i] ))
6095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 total_changed++;
6105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      total++;
6115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf->buf += sz * sizeof(int);
6145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf->bufsz -= sz * sizeof(int);
6155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return 0;
6165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Check: inf/nan/extreme-size?
6195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul * Check: table start, end, nr, etc.
6205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
6215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int radeon_emit_vectors(
622ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_cmd_header_t header,
623ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_cmd_buffer_t *cmdbuf )
6245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int sz = header.vectors.count;
6265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int *data = (int *)cmdbuf->buf;
6275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int start = header.vectors.offset;
6285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int stride = header.vectors.stride;
6295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i,j;
6305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (VERBOSE)
6325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "emit vectors, start %d stride %d nr %d (end %d) (0x%x)\n",
6335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      start, stride, sz, start + stride * sz, header.i);
6345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*    if (start + stride * (sz/4) > 128) { */
6365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*       fprintf(stderr, "emit vectors OVERFLOW %d/%d/%d\n", start, stride, sz); */
6375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*       return -1; */
6385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*    } */
6395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   for (i = 0 ; i < sz ;  start += stride) {
6415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int changed = 0;
6425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      for (j = 0 ; j < 4 ; i++,j++) {
6435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 struct reg *reg = lookup_reg( vectors, start*4+j );
6445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (print_reg_assignment( reg, data[i] ))
6455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    changed = 1;
6465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
6475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (changed)
6485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 total_changed += 4;
6495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      total += 4;
6505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf->buf += sz * sizeof(int);
6545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf->bufsz -= sz * sizeof(int);
6555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return 0;
6565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int print_vertex_format( int vfmt )
6605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
6615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (NORMAL) {
6625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      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",
6635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      "vertex format",
6645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      vfmt,
6655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      "xy,",
6665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_Z) ? "z," : "",
6675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_W0) ? "w0," : "",
6685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_FPCOLOR) ? "fpcolor," : "",
6695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_FPALPHA) ? "fpalpha," : "",
6705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_PKCOLOR) ? "pkcolor," : "",
6715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_FPSPEC) ? "fpspec," : "",
6725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_FPFOG) ? "fpfog," : "",
6735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_PKSPEC) ? "pkspec," : "",
6745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_ST0) ? "st0," : "",
6755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_ST1) ? "st1," : "",
6765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_Q1) ? "q1," : "",
6775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_ST2) ? "st2," : "",
6785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_Q2) ? "q2," : "",
6795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_ST3) ? "st3," : "",
6805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_Q3) ? "q3," : "",
6815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_Q0) ? "q0," : "",
6825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_N0) ? "n0," : "",
6835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_XY1) ? "xy1," : "",
6845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_Z1) ? "z1," : "",
6855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_W1) ? "w1," : "",
6865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (vfmt & RADEON_CP_VC_FRMT_N1) ? "n1," : "");
6875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/*       if (!find_or_add_value( &others[V_VTXFMT], vfmt )) */
6905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* 	 fprintf(stderr, " *** NEW VALUE"); */
6915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "\n");
6935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
6945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return 0;
6965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
6975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
6985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic char *primname[0xf] = {
6995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "NONE",
7005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "POINTS",
7015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "LINES",
7025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "LINE_STRIP",
7035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "TRIANGLES",
7045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "TRIANGLE_FAN",
7055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "TRIANGLE_STRIP",
7065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "TRI_TYPE_2",
7075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "RECT_LIST",
7085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "3VRT_POINTS",
7095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   "3VRT_LINES",
7105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul};
7115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstatic int print_prim_and_flags( int prim )
7135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int numverts;
7155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (NORMAL)
7175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "   %s(%x): %s%s%s%s%s%s%s\n",
7185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      "prim flags",
7195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      prim,
7205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      ((prim & 0x30) == RADEON_CP_VC_CNTL_PRIM_WALK_IND) ? "IND," : "",
7215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      ((prim & 0x30) == RADEON_CP_VC_CNTL_PRIM_WALK_LIST) ? "LIST," : "",
7225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      ((prim & 0x30) == RADEON_CP_VC_CNTL_PRIM_WALK_RING) ? "RING," : "",
7235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (prim & RADEON_CP_VC_CNTL_COLOR_ORDER_RGBA) ? "RGBA," : "BGRA, ",
7245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (prim & RADEON_CP_VC_CNTL_MAOS_ENABLE) ? "MAOS," : "",
7255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (prim & RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE) ? "RADEON," : "",
7265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      (prim & RADEON_CP_VC_CNTL_TCL_ENABLE) ? "TCL," : "");
7275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ((prim & 0xf) > RADEON_CP_VC_CNTL_PRIM_TYPE_3VRT_LINE_LIST) {
7295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "   *** Bad primitive: %x\n", prim & 0xf);
7305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return -1;
7315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   numverts = prim>>16;
7345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (NORMAL)
7365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "   prim: %s numverts %d\n", primname[prim&0xf], numverts);
7375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch (prim & 0xf) {
7395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_VC_CNTL_PRIM_TYPE_NONE:
7405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_VC_CNTL_PRIM_TYPE_POINT:
7415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (numverts < 1) {
7425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "Bad nr verts for line %d\n", numverts);
7435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return -1;
7445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
7465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_VC_CNTL_PRIM_TYPE_LINE:
7475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if ((numverts & 1) || numverts == 0) {
7485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "Bad nr verts for line %d\n", numverts);
7495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return -1;
7505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
7525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_VC_CNTL_PRIM_TYPE_LINE_STRIP:
7535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (numverts < 2) {
7545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "Bad nr verts for line_strip %d\n", numverts);
7555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return -1;
7565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
7585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST:
7595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_VC_CNTL_PRIM_TYPE_3VRT_POINT_LIST:
7605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_VC_CNTL_PRIM_TYPE_3VRT_LINE_LIST:
7615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST:
7625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (numverts % 3 || numverts == 0) {
7635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "Bad nr verts for tri %d\n", numverts);
7645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return -1;
7655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
7675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_FAN:
7685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_STRIP:
7695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (numverts < 3) {
7705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "Bad nr verts for strip/fan %d\n", numverts);
7715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return -1;
7725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
7735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
7745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
7755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "Bad primitive\n");
7765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return -1;
7775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return 0;
7795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
7805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* build in knowledge about each packet type
7825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
783ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirlstatic int radeon_emit_packet3( drm_radeon_cmd_buffer_t *cmdbuf )
7845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
7855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int cmdsz;
7865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int *cmd = (int *)cmdbuf->buf;
7875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int *tmp;
7885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i, stride, size, start;
7895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdsz = 2 + ((cmd[0] & RADEON_CP_PACKET_COUNT_MASK) >> 16);
7915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if ((cmd[0] & RADEON_CP_PACKET_MASK) != RADEON_CP_PACKET3 ||
7935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       cmdsz * 4 > cmdbuf->bufsz ||
7945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul       cmdsz > RADEON_CP_PACKET_MAX_DWORDS) {
7955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "Bad packet\n");
7965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      return -EINVAL;
7975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
7985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
7995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   switch( cmd[0] & ~RADEON_CP_PACKET_COUNT_MASK ) {
8005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_NOP:
8015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_NOP, %d dwords\n", cmdsz);
8035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_NEXT_CHAR:
8055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_NEXT_CHAR, %d dwords\n", cmdsz);
8075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_PLY_NEXTSCAN:
8095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_PLY_NEXTSCAN, %d dwords\n", cmdsz);
8115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_SET_SCISSORS:
8135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_SET_SCISSORS, %d dwords\n", cmdsz);
8155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_3D_RNDR_GEN_INDX_PRIM:
8175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_3D_RNDR_GEN_INDX_PRIM, %d dwords\n",
8195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      cmdsz);
8205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_LOAD_MICROCODE:
8225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_LOAD_MICROCODE, %d dwords\n", cmdsz);
8245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_WAIT_FOR_IDLE:
8265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_WAIT_FOR_IDLE, %d dwords\n", cmdsz);
8285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_3D_DRAW_VBUF:
8315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_3D_DRAW_VBUF, %d dwords\n", cmdsz);
8335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      print_vertex_format(cmd[1]);
8345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      print_prim_and_flags(cmd[2]);
8355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_3D_DRAW_IMMD:
8385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_3D_DRAW_IMMD, %d dwords\n", cmdsz);
8405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_3D_DRAW_INDX: {
8425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      int neltdwords;
8435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_3D_DRAW_INDX, %d dwords\n", cmdsz);
8455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      print_vertex_format(cmd[1]);
8465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      print_prim_and_flags(cmd[2]);
8475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      neltdwords = cmd[2]>>16;
8485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      neltdwords += neltdwords & 1;
8495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      neltdwords /= 2;
8505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (neltdwords + 3 != cmdsz)
8515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "Mismatch in DRAW_INDX, %d vs cmdsz %d\n",
8525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 neltdwords, cmdsz);
8535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
8555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_LOAD_PALETTE:
8565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_LOAD_PALETTE, %d dwords\n", cmdsz);
8585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_3D_LOAD_VBPNTR:
8605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL) {
8615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_3D_LOAD_VBPNTR, %d dwords\n", cmdsz);
8625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "   nr arrays: %d\n", cmd[1]);
8635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (cmd[1]/2 + cmd[1]%2 != cmdsz - 3) {
8665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "  ****** MISMATCH %d/%d *******\n",
8675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 cmd[1]/2 + cmd[1]%2 + 3, cmdsz);
8685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return -EINVAL;
8695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
8715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL) {
8725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 tmp = cmd+2;
8735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 for (i = 0 ; i < cmd[1] ; i++) {
8745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    if (i & 1) {
8755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       stride = (tmp[0]>>24) & 0xff;
8765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       size = (tmp[0]>>16) & 0xff;
8775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       start = tmp[2];
8785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       tmp += 3;
8795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
8805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    else {
8815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       stride = (tmp[0]>>8) & 0xff;
8825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       size = (tmp[0]) & 0xff;
8835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	       start = tmp[1];
8845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    }
8855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    fprintf(stderr, "   array %d: start 0x%x vsize %d vstride %d\n",
8865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		    i, start, size, stride );
8875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
8885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
8895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_CNTL_PAINT:
8915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_CNTL_PAINT, %d dwords\n", cmdsz);
8935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_CNTL_BITBLT:
8955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
8965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_CNTL_BITBLT, %d dwords\n", cmdsz);
8975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
8985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_CNTL_SMALLTEXT:
8995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
9005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_CNTL_SMALLTEXT, %d dwords\n", cmdsz);
9015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_CNTL_HOSTDATA_BLT:
9035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
9045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_CNTL_HOSTDATA_BLT, %d dwords\n",
9055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      cmdsz);
9065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_CNTL_POLYLINE:
9085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
9095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_CNTL_POLYLINE, %d dwords\n", cmdsz);
9105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_CNTL_POLYSCANLINES:
9125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
9135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_CNTL_POLYSCANLINES, %d dwords\n",
9145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      cmdsz);
9155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_CNTL_PAINT_MULTI:
9175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
9185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_CNTL_PAINT_MULTI, %d dwords\n",
9195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      cmdsz);
9205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_CNTL_BITBLT_MULTI:
9225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
9235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_CNTL_BITBLT_MULTI, %d dwords\n",
9245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      cmdsz);
9255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   case RADEON_CP_PACKET3_CNTL_TRANS_BITBLT:
9275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (NORMAL)
9285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "PACKET3_CNTL_TRANS_BITBLT, %d dwords\n",
9295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	      cmdsz);
9305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   default:
9325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      fprintf(stderr, "UNKNOWN PACKET, %d dwords\n", cmdsz);
9335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      break;
9345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf->buf += cmdsz * 4;
9375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf->bufsz -= cmdsz * 4;
9385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return 0;
9395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
9405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul/* Check cliprects for bounds, then pass on to above:
9435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul */
944ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirlstatic int radeon_emit_packet3_cliprect( drm_radeon_cmd_buffer_t *cmdbuf )
9455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
946ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_clip_rect_t *boxes = cmdbuf->boxes;
9475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int i = 0;
9485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (VERBOSE && total_changed) {
9505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      dump_state();
9515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      total_changed = 0;
9525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   else fprintf(stderr, "total_changed zero\n");
9545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (NORMAL) {
9565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      do {
9575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if ( i < cmdbuf->nbox ) {
9585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    fprintf(stderr, "Emit box %d/%d %d,%d %d,%d\n",
9595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		    i, cmdbuf->nbox,
9605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		    boxes[i].x1, boxes[i].y1, boxes[i].x2, boxes[i].y2);
9615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
9625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      } while ( ++i < cmdbuf->nbox );
9635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (cmdbuf->nbox == 1)
9665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      cmdbuf->nbox = 0;
9675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return radeon_emit_packet3( cmdbuf );
9695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
9705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9724637235183b80963536f2364e4d50fcb894886ddDave Airlieint radeonSanityCmdBuffer( r100ContextPtr rmesa,
9735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul			   int nbox,
974ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl			   drm_clip_rect_t *boxes )
9755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul{
9765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   int idx;
977ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_cmd_buffer_t cmdbuf;
978ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   drm_radeon_cmd_header_t header;
9795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   static int inited = 0;
9805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (!inited) {
9825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      init_regs();
9835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      inited = 1;
9845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
9855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf.buf = rmesa->store.cmd_buf;
9875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf.bufsz = rmesa->store.cmd_used;
988ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl   cmdbuf.boxes = boxes;
9895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   cmdbuf.nbox = nbox;
9905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   while ( cmdbuf.bufsz >= sizeof(header) ) {
9925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      header.i = *(int *)cmdbuf.buf;
9945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      cmdbuf.buf += sizeof(header);
9955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      cmdbuf.bufsz -= sizeof(header);
9965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
9975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      switch (header.header.cmd_type) {
9985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case RADEON_CMD_PACKET:
9995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (radeon_emit_packets( header, &cmdbuf )) {
10005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    fprintf(stderr,"radeon_emit_packets failed\n");
10015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    return -EINVAL;
10025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
10035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
10045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case RADEON_CMD_SCALARS:
10065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (radeon_emit_scalars( header, &cmdbuf )) {
10075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    fprintf(stderr,"radeon_emit_scalars failed\n");
10085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    return -EINVAL;
10095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
10105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
10115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case RADEON_CMD_SCALARS2:
10135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (radeon_emit_scalars2( header, &cmdbuf )) {
10145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    fprintf(stderr,"radeon_emit_scalars failed\n");
10155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    return -EINVAL;
10165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
10175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
10185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case RADEON_CMD_VECTORS:
10205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (radeon_emit_vectors( header, &cmdbuf )) {
10215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    fprintf(stderr,"radeon_emit_vectors failed\n");
10225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    return -EINVAL;
10235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
10245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
10255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case RADEON_CMD_DMA_DISCARD:
10275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 idx = header.dma.buf_idx;
10285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (NORMAL)
10295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    fprintf(stderr, "RADEON_CMD_DMA_DISCARD buf %d\n", idx);
10305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 bufs++;
10315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
10325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case RADEON_CMD_PACKET3:
10345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (radeon_emit_packet3( &cmdbuf )) {
10355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    fprintf(stderr,"radeon_emit_packet3 failed\n");
10365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    return -EINVAL;
10375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
10385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
10395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case RADEON_CMD_PACKET3_CLIP:
10415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 if (radeon_emit_packet3_cliprect( &cmdbuf )) {
10425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    fprintf(stderr,"radeon_emit_packet3_clip failed\n");
10435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	    return -EINVAL;
10445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 }
10455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
10465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      case RADEON_CMD_WAIT:
10485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 break;
10495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      default:
10515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr,"bad cmd_type %d at %p\n",
10525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		   header.header.cmd_type,
10535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		   cmdbuf.buf - sizeof(header));
10545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 return -EINVAL;
10555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
10565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   if (0)
10595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   {
10605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      static int n = 0;
10615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      n++;
10625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      if (n == 10) {
10635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "Bufs %d Total emitted %d real changes %d (%.2f%%)\n",
10645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 bufs,
10655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 total, total_changed,
10665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 ((float)total_changed/(float)total*100.0));
10675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "Total emitted per buf: %.2f\n",
10685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 (float)total/(float)bufs);
10695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 fprintf(stderr, "Real changes per buf: %.2f\n",
10705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul		 (float)total_changed/(float)bufs);
10715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul	 bufs = n = total = total_changed = 0;
10735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul      }
10745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   }
10755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
10765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul   return 0;
10775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1078