xref: /linux/drivers/gpu/drm/radeon/r300_reg.h (revision 54f961a628b737f66710eca0b0d95346645dd33e)
1c0e09200SDave Airlie /**************************************************************************
2c0e09200SDave Airlie 
3c0e09200SDave Airlie Copyright (C) 2004-2005 Nicolai Haehnle et al.
4c0e09200SDave Airlie 
5c0e09200SDave Airlie Permission is hereby granted, free of charge, to any person obtaining a
6c0e09200SDave Airlie copy of this software and associated documentation files (the "Software"),
7c0e09200SDave Airlie to deal in the Software without restriction, including without limitation
8c0e09200SDave Airlie on the rights to use, copy, modify, merge, publish, distribute, sub
9c0e09200SDave Airlie license, and/or sell copies of the Software, and to permit persons to whom
10c0e09200SDave Airlie the Software is furnished to do so, subject to the following conditions:
11c0e09200SDave Airlie 
12c0e09200SDave Airlie The above copyright notice and this permission notice (including the next
13c0e09200SDave Airlie paragraph) shall be included in all copies or substantial portions of the
14c0e09200SDave Airlie Software.
15c0e09200SDave Airlie 
16c0e09200SDave Airlie THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17c0e09200SDave Airlie IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18c0e09200SDave Airlie FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19c0e09200SDave Airlie THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20c0e09200SDave Airlie DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21c0e09200SDave Airlie OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22c0e09200SDave Airlie USE OR OTHER DEALINGS IN THE SOFTWARE.
23c0e09200SDave Airlie 
24c0e09200SDave Airlie **************************************************************************/
25c0e09200SDave Airlie 
26c0e09200SDave Airlie #ifndef _R300_REG_H
27c0e09200SDave Airlie #define _R300_REG_H
28c0e09200SDave Airlie 
29c0e09200SDave Airlie #define R300_MC_INIT_MISC_LAT_TIMER	0x180
30c0e09200SDave Airlie #	define R300_MC_MISC__MC_CPR_INIT_LAT_SHIFT	0
31c0e09200SDave Airlie #	define R300_MC_MISC__MC_VF_INIT_LAT_SHIFT	4
32c0e09200SDave Airlie #	define R300_MC_MISC__MC_DISP0R_INIT_LAT_SHIFT	8
33c0e09200SDave Airlie #	define R300_MC_MISC__MC_DISP1R_INIT_LAT_SHIFT	12
34c0e09200SDave Airlie #	define R300_MC_MISC__MC_FIXED_INIT_LAT_SHIFT	16
35c0e09200SDave Airlie #	define R300_MC_MISC__MC_E2R_INIT_LAT_SHIFT	20
36c0e09200SDave Airlie #	define R300_MC_MISC__MC_SAME_PAGE_PRIO_SHIFT	24
37c0e09200SDave Airlie #	define R300_MC_MISC__MC_GLOBW_INIT_LAT_SHIFT	28
38c0e09200SDave Airlie 
39c0e09200SDave Airlie #define R300_MC_INIT_GFX_LAT_TIMER	0x154
40c0e09200SDave Airlie #	define R300_MC_MISC__MC_G3D0R_INIT_LAT_SHIFT	0
41c0e09200SDave Airlie #	define R300_MC_MISC__MC_G3D1R_INIT_LAT_SHIFT	4
42c0e09200SDave Airlie #	define R300_MC_MISC__MC_G3D2R_INIT_LAT_SHIFT	8
43c0e09200SDave Airlie #	define R300_MC_MISC__MC_G3D3R_INIT_LAT_SHIFT	12
44c0e09200SDave Airlie #	define R300_MC_MISC__MC_TX0R_INIT_LAT_SHIFT	16
45c0e09200SDave Airlie #	define R300_MC_MISC__MC_TX1R_INIT_LAT_SHIFT	20
46c0e09200SDave Airlie #	define R300_MC_MISC__MC_GLOBR_INIT_LAT_SHIFT	24
47c0e09200SDave Airlie #	define R300_MC_MISC__MC_GLOBW_FULL_LAT_SHIFT	28
48c0e09200SDave Airlie 
49c0e09200SDave Airlie /*
50c0e09200SDave Airlie  * This file contains registers and constants for the R300. They have been
51c0e09200SDave Airlie  * found mostly by examining command buffers captured using glxtest, as well
52c0e09200SDave Airlie  * as by extrapolating some known registers and constants from the R200.
53c0e09200SDave Airlie  * I am fairly certain that they are correct unless stated otherwise
54c0e09200SDave Airlie  * in comments.
55c0e09200SDave Airlie  */
56c0e09200SDave Airlie 
57c0e09200SDave Airlie #define R300_SE_VPORT_XSCALE                0x1D98
58c0e09200SDave Airlie #define R300_SE_VPORT_XOFFSET               0x1D9C
59c0e09200SDave Airlie #define R300_SE_VPORT_YSCALE                0x1DA0
60c0e09200SDave Airlie #define R300_SE_VPORT_YOFFSET               0x1DA4
61c0e09200SDave Airlie #define R300_SE_VPORT_ZSCALE                0x1DA8
62c0e09200SDave Airlie #define R300_SE_VPORT_ZOFFSET               0x1DAC
63c0e09200SDave Airlie 
64c0e09200SDave Airlie 
65c0e09200SDave Airlie /*
66c0e09200SDave Airlie  * Vertex Array Processing (VAP) Control
67c0e09200SDave Airlie  * Stolen from r200 code from Christoph Brill (It's a guess!)
68c0e09200SDave Airlie  */
69c0e09200SDave Airlie #define R300_VAP_CNTL	0x2080
70c0e09200SDave Airlie 
71c0e09200SDave Airlie /* This register is written directly and also starts data section
72c0e09200SDave Airlie  * in many 3d CP_PACKET3's
73c0e09200SDave Airlie  */
74c0e09200SDave Airlie #define R300_VAP_VF_CNTL	0x2084
75c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__PRIM_TYPE__SHIFT              0
76c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_NONE                     (0<<0)
77c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_POINTS                   (1<<0)
78c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_LINES                    (2<<0)
79c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_LINE_STRIP               (3<<0)
80c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_TRIANGLES                (4<<0)
81c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_TRIANGLE_FAN             (5<<0)
82c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_TRIANGLE_STRIP           (6<<0)
83c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_LINE_LOOP                (12<<0)
84c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_QUADS                    (13<<0)
85c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_QUAD_STRIP               (14<<0)
86c0e09200SDave Airlie #	define  R300_VAP_VF_CNTL__PRIM_POLYGON                  (15<<0)
87c0e09200SDave Airlie 
88c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__PRIM_WALK__SHIFT              4
89c0e09200SDave Airlie 	/* State based - direct writes to registers trigger vertex
90c0e09200SDave Airlie            generation */
91c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__PRIM_WALK_STATE_BASED         (0<<4)
92c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__PRIM_WALK_INDICES             (1<<4)
93c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_LIST         (2<<4)
94c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__PRIM_WALK_VERTEX_EMBEDDED     (3<<4)
95c0e09200SDave Airlie 
96c0e09200SDave Airlie 	/* I don't think I saw these three used.. */
97c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__COLOR_ORDER__SHIFT            6
98c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__TCL_OUTPUT_CTL_ENA__SHIFT     9
99c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__PROG_STREAM_ENA__SHIFT        10
100c0e09200SDave Airlie 
101c0e09200SDave Airlie 	/* index size - when not set the indices are assumed to be 16 bit */
102c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__INDEX_SIZE_32bit              (1<<11)
103c0e09200SDave Airlie 	/* number of vertices */
104c0e09200SDave Airlie #	define	R300_VAP_VF_CNTL__NUM_VERTICES__SHIFT           16
105c0e09200SDave Airlie 
106c0e09200SDave Airlie /* BEGIN: Wild guesses */
107c0e09200SDave Airlie #define R300_VAP_OUTPUT_VTX_FMT_0           0x2090
108c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_0__POS_PRESENT     (1<<0)
109c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_PRESENT   (1<<1)
110c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT (1<<2)  /* GUESS */
111c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_2_PRESENT (1<<3)  /* GUESS */
112c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_0__COLOR_3_PRESENT (1<<4)  /* GUESS */
113c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_0__PT_SIZE_PRESENT (1<<16) /* GUESS */
114c0e09200SDave Airlie 
115c0e09200SDave Airlie #define R300_VAP_OUTPUT_VTX_FMT_1           0x2094
116c0e09200SDave Airlie 	/* each of the following is 3 bits wide, specifies number
117c0e09200SDave Airlie 	   of components */
118c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_1__TEX_0_COMP_CNT_SHIFT 0
119c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_1__TEX_1_COMP_CNT_SHIFT 3
120c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_1__TEX_2_COMP_CNT_SHIFT 6
121c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_1__TEX_3_COMP_CNT_SHIFT 9
122c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_1__TEX_4_COMP_CNT_SHIFT 12
123c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_1__TEX_5_COMP_CNT_SHIFT 15
124c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_1__TEX_6_COMP_CNT_SHIFT 18
125c0e09200SDave Airlie #       define R300_VAP_OUTPUT_VTX_FMT_1__TEX_7_COMP_CNT_SHIFT 21
126c0e09200SDave Airlie /* END: Wild guesses */
127c0e09200SDave Airlie 
128c0e09200SDave Airlie #define R300_SE_VTE_CNTL                  0x20b0
129c0e09200SDave Airlie #	define     R300_VPORT_X_SCALE_ENA                0x00000001
130c0e09200SDave Airlie #	define     R300_VPORT_X_OFFSET_ENA               0x00000002
131c0e09200SDave Airlie #	define     R300_VPORT_Y_SCALE_ENA                0x00000004
132c0e09200SDave Airlie #	define     R300_VPORT_Y_OFFSET_ENA               0x00000008
133c0e09200SDave Airlie #	define     R300_VPORT_Z_SCALE_ENA                0x00000010
134c0e09200SDave Airlie #	define     R300_VPORT_Z_OFFSET_ENA               0x00000020
135c0e09200SDave Airlie #	define     R300_VTX_XY_FMT                       0x00000100
136c0e09200SDave Airlie #	define     R300_VTX_Z_FMT                        0x00000200
137c0e09200SDave Airlie #	define     R300_VTX_W0_FMT                       0x00000400
138c0e09200SDave Airlie #	define     R300_VTX_W0_NORMALIZE                 0x00000800
139c0e09200SDave Airlie #	define     R300_VTX_ST_DENORMALIZED              0x00001000
140c0e09200SDave Airlie 
141c0e09200SDave Airlie /* BEGIN: Vertex data assembly - lots of uncertainties */
142c0e09200SDave Airlie 
143c0e09200SDave Airlie /* gap */
144c0e09200SDave Airlie 
145c0e09200SDave Airlie #define R300_VAP_CNTL_STATUS              0x2140
146c0e09200SDave Airlie #	define R300_VC_NO_SWAP                  (0 << 0)
147c0e09200SDave Airlie #	define R300_VC_16BIT_SWAP               (1 << 0)
148c0e09200SDave Airlie #	define R300_VC_32BIT_SWAP               (2 << 0)
149c0e09200SDave Airlie #	define R300_VAP_TCL_BYPASS		(1 << 8)
150c0e09200SDave Airlie 
151c0e09200SDave Airlie /* gap */
152c0e09200SDave Airlie 
153c0e09200SDave Airlie /* Where do we get our vertex data?
154c0e09200SDave Airlie  *
155c0e09200SDave Airlie  * Vertex data either comes either from immediate mode registers or from
156c0e09200SDave Airlie  * vertex arrays.
157c0e09200SDave Airlie  * There appears to be no mixed mode (though we can force the pitch of
158c0e09200SDave Airlie  * vertex arrays to 0, effectively reusing the same element over and over
159c0e09200SDave Airlie  * again).
160c0e09200SDave Airlie  *
161c0e09200SDave Airlie  * Immediate mode is controlled by the INPUT_CNTL registers. I am not sure
162c0e09200SDave Airlie  * if these registers influence vertex array processing.
163c0e09200SDave Airlie  *
164c0e09200SDave Airlie  * Vertex arrays are controlled via the 3D_LOAD_VBPNTR packet3.
165c0e09200SDave Airlie  *
166c0e09200SDave Airlie  * In both cases, vertex attributes are then passed through INPUT_ROUTE.
167c0e09200SDave Airlie  *
168c0e09200SDave Airlie  * Beginning with INPUT_ROUTE_0_0 is a list of WORDs that route vertex data
169c0e09200SDave Airlie  * into the vertex processor's input registers.
170c0e09200SDave Airlie  * The first word routes the first input, the second word the second, etc.
171c0e09200SDave Airlie  * The corresponding input is routed into the register with the given index.
172c0e09200SDave Airlie  * The list is ended by a word with INPUT_ROUTE_END set.
173c0e09200SDave Airlie  *
174c0e09200SDave Airlie  * Always set COMPONENTS_4 in immediate mode.
175c0e09200SDave Airlie  */
176c0e09200SDave Airlie 
177c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_0            0x2150
178c0e09200SDave Airlie #       define R300_INPUT_ROUTE_COMPONENTS_1     (0 << 0)
179c0e09200SDave Airlie #       define R300_INPUT_ROUTE_COMPONENTS_2     (1 << 0)
180c0e09200SDave Airlie #       define R300_INPUT_ROUTE_COMPONENTS_3     (2 << 0)
181c0e09200SDave Airlie #       define R300_INPUT_ROUTE_COMPONENTS_4     (3 << 0)
182c0e09200SDave Airlie #       define R300_INPUT_ROUTE_COMPONENTS_RGBA  (4 << 0) /* GUESS */
183c0e09200SDave Airlie #       define R300_VAP_INPUT_ROUTE_IDX_SHIFT    8
184c0e09200SDave Airlie #       define R300_VAP_INPUT_ROUTE_IDX_MASK     (31 << 8) /* GUESS */
185c0e09200SDave Airlie #       define R300_VAP_INPUT_ROUTE_END          (1 << 13)
186c0e09200SDave Airlie #       define R300_INPUT_ROUTE_IMMEDIATE_MODE   (0 << 14) /* GUESS */
187c0e09200SDave Airlie #       define R300_INPUT_ROUTE_FLOAT            (1 << 14) /* GUESS */
188c0e09200SDave Airlie #       define R300_INPUT_ROUTE_UNSIGNED_BYTE    (2 << 14) /* GUESS */
189c0e09200SDave Airlie #       define R300_INPUT_ROUTE_FLOAT_COLOR      (3 << 14) /* GUESS */
190c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_1            0x2154
191c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_2            0x2158
192c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_3            0x215C
193c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_4            0x2160
194c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_5            0x2164
195c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_6            0x2168
196c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_0_7            0x216C
197c0e09200SDave Airlie 
198c0e09200SDave Airlie /* gap */
199c0e09200SDave Airlie 
200c0e09200SDave Airlie /* Notes:
201c0e09200SDave Airlie  *  - always set up to produce at least two attributes:
202c0e09200SDave Airlie  *    if vertex program uses only position, fglrx will set normal, too
203c0e09200SDave Airlie  *  - INPUT_CNTL_0_COLOR and INPUT_CNTL_COLOR bits are always equal.
204c0e09200SDave Airlie  */
205c0e09200SDave Airlie #define R300_VAP_INPUT_CNTL_0               0x2180
206c0e09200SDave Airlie #       define R300_INPUT_CNTL_0_COLOR           0x00000001
207c0e09200SDave Airlie #define R300_VAP_INPUT_CNTL_1               0x2184
208c0e09200SDave Airlie #       define R300_INPUT_CNTL_POS               0x00000001
209c0e09200SDave Airlie #       define R300_INPUT_CNTL_NORMAL            0x00000002
210c0e09200SDave Airlie #       define R300_INPUT_CNTL_COLOR             0x00000004
211c0e09200SDave Airlie #       define R300_INPUT_CNTL_TC0               0x00000400
212c0e09200SDave Airlie #       define R300_INPUT_CNTL_TC1               0x00000800
213c0e09200SDave Airlie #       define R300_INPUT_CNTL_TC2               0x00001000 /* GUESS */
214c0e09200SDave Airlie #       define R300_INPUT_CNTL_TC3               0x00002000 /* GUESS */
215c0e09200SDave Airlie #       define R300_INPUT_CNTL_TC4               0x00004000 /* GUESS */
216c0e09200SDave Airlie #       define R300_INPUT_CNTL_TC5               0x00008000 /* GUESS */
217c0e09200SDave Airlie #       define R300_INPUT_CNTL_TC6               0x00010000 /* GUESS */
218c0e09200SDave Airlie #       define R300_INPUT_CNTL_TC7               0x00020000 /* GUESS */
219c0e09200SDave Airlie 
220c0e09200SDave Airlie /* gap */
221c0e09200SDave Airlie 
222c0e09200SDave Airlie /* Words parallel to INPUT_ROUTE_0; All words that are active in INPUT_ROUTE_0
223c0e09200SDave Airlie  * are set to a swizzling bit pattern, other words are 0.
224c0e09200SDave Airlie  *
225c0e09200SDave Airlie  * In immediate mode, the pattern is always set to xyzw. In vertex array
226c0e09200SDave Airlie  * mode, the swizzling pattern is e.g. used to set zw components in texture
227c0e09200SDave Airlie  * coordinates with only tweo components.
228c0e09200SDave Airlie  */
229c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_0            0x21E0
230c0e09200SDave Airlie #       define R300_INPUT_ROUTE_SELECT_X    0
231c0e09200SDave Airlie #       define R300_INPUT_ROUTE_SELECT_Y    1
232c0e09200SDave Airlie #       define R300_INPUT_ROUTE_SELECT_Z    2
233c0e09200SDave Airlie #       define R300_INPUT_ROUTE_SELECT_W    3
234c0e09200SDave Airlie #       define R300_INPUT_ROUTE_SELECT_ZERO 4
235c0e09200SDave Airlie #       define R300_INPUT_ROUTE_SELECT_ONE  5
236c0e09200SDave Airlie #       define R300_INPUT_ROUTE_SELECT_MASK 7
237c0e09200SDave Airlie #       define R300_INPUT_ROUTE_X_SHIFT     0
238c0e09200SDave Airlie #       define R300_INPUT_ROUTE_Y_SHIFT     3
239c0e09200SDave Airlie #       define R300_INPUT_ROUTE_Z_SHIFT     6
240c0e09200SDave Airlie #       define R300_INPUT_ROUTE_W_SHIFT     9
241c0e09200SDave Airlie #       define R300_INPUT_ROUTE_ENABLE      (15 << 12)
242c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_1            0x21E4
243c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_2            0x21E8
244c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_3            0x21EC
245c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_4            0x21F0
246c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_5            0x21F4
247c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_6            0x21F8
248c0e09200SDave Airlie #define R300_VAP_INPUT_ROUTE_1_7            0x21FC
249c0e09200SDave Airlie 
250c0e09200SDave Airlie /* END: Vertex data assembly */
251c0e09200SDave Airlie 
252c0e09200SDave Airlie /* gap */
253c0e09200SDave Airlie 
254c0e09200SDave Airlie /* BEGIN: Upload vertex program and data */
255c0e09200SDave Airlie 
256c0e09200SDave Airlie /*
257c0e09200SDave Airlie  * The programmable vertex shader unit has a memory bank of unknown size
258c0e09200SDave Airlie  * that can be written to in 16 byte units by writing the address into
259c0e09200SDave Airlie  * UPLOAD_ADDRESS, followed by data in UPLOAD_DATA (multiples of 4 DWORDs).
260c0e09200SDave Airlie  *
261c0e09200SDave Airlie  * Pointers into the memory bank are always in multiples of 16 bytes.
262c0e09200SDave Airlie  *
263c0e09200SDave Airlie  * The memory bank is divided into areas with fixed meaning.
264c0e09200SDave Airlie  *
265c0e09200SDave Airlie  * Starting at address UPLOAD_PROGRAM: Vertex program instructions.
266c0e09200SDave Airlie  * Native limits reported by drivers from ATI suggest size 256 (i.e. 4KB),
267c0e09200SDave Airlie  * whereas the difference between known addresses suggests size 512.
268c0e09200SDave Airlie  *
269c0e09200SDave Airlie  * Starting at address UPLOAD_PARAMETERS: Vertex program parameters.
270c0e09200SDave Airlie  * Native reported limits and the VPI layout suggest size 256, whereas
271c0e09200SDave Airlie  * difference between known addresses suggests size 512.
272c0e09200SDave Airlie  *
273c0e09200SDave Airlie  * At address UPLOAD_POINTSIZE is a vector (0, 0, ps, 0), where ps is the
274c0e09200SDave Airlie  * floating point pointsize. The exact purpose of this state is uncertain,
275c0e09200SDave Airlie  * as there is also the R300_RE_POINTSIZE register.
276c0e09200SDave Airlie  *
277c0e09200SDave Airlie  * Multiple vertex programs and parameter sets can be loaded at once,
278c0e09200SDave Airlie  * which could explain the size discrepancy.
279c0e09200SDave Airlie  */
280c0e09200SDave Airlie #define R300_VAP_PVS_UPLOAD_ADDRESS         0x2200
281c0e09200SDave Airlie #       define R300_PVS_UPLOAD_PROGRAM           0x00000000
282c0e09200SDave Airlie #       define R300_PVS_UPLOAD_PARAMETERS        0x00000200
283c0e09200SDave Airlie #       define R300_PVS_UPLOAD_POINTSIZE         0x00000406
284c0e09200SDave Airlie 
285c0e09200SDave Airlie /* gap */
286c0e09200SDave Airlie 
287c0e09200SDave Airlie #define R300_VAP_PVS_UPLOAD_DATA            0x2208
288c0e09200SDave Airlie 
289c0e09200SDave Airlie /* END: Upload vertex program and data */
290c0e09200SDave Airlie 
291c0e09200SDave Airlie /* gap */
292c0e09200SDave Airlie 
293c0e09200SDave Airlie /* I do not know the purpose of this register. However, I do know that
294c0e09200SDave Airlie  * it is set to 221C_CLEAR for clear operations and to 221C_NORMAL
295c0e09200SDave Airlie  * for normal rendering.
296c0e09200SDave Airlie  */
297c0e09200SDave Airlie #define R300_VAP_UNKNOWN_221C               0x221C
298c0e09200SDave Airlie #       define R300_221C_NORMAL                  0x00000000
299c0e09200SDave Airlie #       define R300_221C_CLEAR                   0x0001C000
300c0e09200SDave Airlie 
301c0e09200SDave Airlie /* These seem to be per-pixel and per-vertex X and Y clipping planes. The first
302c0e09200SDave Airlie  * plane is per-pixel and the second plane is per-vertex.
303c0e09200SDave Airlie  *
304c0e09200SDave Airlie  * This was determined by experimentation alone but I believe it is correct.
305c0e09200SDave Airlie  *
306c0e09200SDave Airlie  * These registers are called X_QUAD0_1_FL to X_QUAD0_4_FL by glxtest.
307c0e09200SDave Airlie  */
308c0e09200SDave Airlie #define R300_VAP_CLIP_X_0                   0x2220
309c0e09200SDave Airlie #define R300_VAP_CLIP_X_1                   0x2224
310c0e09200SDave Airlie #define R300_VAP_CLIP_Y_0                   0x2228
311c0e09200SDave Airlie #define R300_VAP_CLIP_Y_1                   0x2230
312c0e09200SDave Airlie 
313c0e09200SDave Airlie /* gap */
314c0e09200SDave Airlie 
315c0e09200SDave Airlie /* Sometimes, END_OF_PKT and 0x2284=0 are the only commands sent between
316c0e09200SDave Airlie  * rendering commands and overwriting vertex program parameters.
317c0e09200SDave Airlie  * Therefore, I suspect writing zero to 0x2284 synchronizes the engine and
318c0e09200SDave Airlie  * avoids bugs caused by still running shaders reading bad data from memory.
319c0e09200SDave Airlie  */
320*54f961a6SJerome Glisse #define R300_VAP_PVS_STATE_FLUSH_REG        0x2284
321c0e09200SDave Airlie 
322c0e09200SDave Airlie /* Absolutely no clue what this register is about. */
323c0e09200SDave Airlie #define R300_VAP_UNKNOWN_2288               0x2288
324c0e09200SDave Airlie #       define R300_2288_R300                    0x00750000 /* -- nh */
325c0e09200SDave Airlie #       define R300_2288_RV350                   0x0000FFFF /* -- Vladimir */
326c0e09200SDave Airlie 
327c0e09200SDave Airlie /* gap */
328c0e09200SDave Airlie 
329c0e09200SDave Airlie /* Addresses are relative to the vertex program instruction area of the
330c0e09200SDave Airlie  * memory bank. PROGRAM_END points to the last instruction of the active
331c0e09200SDave Airlie  * program
332c0e09200SDave Airlie  *
333c0e09200SDave Airlie  * The meaning of the two UNKNOWN fields is obviously not known. However,
334c0e09200SDave Airlie  * experiments so far have shown that both *must* point to an instruction
335c0e09200SDave Airlie  * inside the vertex program, otherwise the GPU locks up.
336c0e09200SDave Airlie  *
337c0e09200SDave Airlie  * fglrx usually sets CNTL_3_UNKNOWN to the end of the program and
338c0e09200SDave Airlie  * R300_PVS_CNTL_1_POS_END_SHIFT points to instruction where last write to
339c0e09200SDave Airlie  * position takes place.
340c0e09200SDave Airlie  *
341c0e09200SDave Airlie  * Most likely this is used to ignore rest of the program in cases
342c0e09200SDave Airlie  * where group of verts arent visible. For some reason this "section"
343c0e09200SDave Airlie  * is sometimes accepted other instruction that have no relationship with
344c0e09200SDave Airlie  * position calculations.
345c0e09200SDave Airlie  */
346c0e09200SDave Airlie #define R300_VAP_PVS_CNTL_1                 0x22D0
347c0e09200SDave Airlie #       define R300_PVS_CNTL_1_PROGRAM_START_SHIFT   0
348c0e09200SDave Airlie #       define R300_PVS_CNTL_1_POS_END_SHIFT         10
349c0e09200SDave Airlie #       define R300_PVS_CNTL_1_PROGRAM_END_SHIFT     20
350c0e09200SDave Airlie /* Addresses are relative the the vertex program parameters area. */
351c0e09200SDave Airlie #define R300_VAP_PVS_CNTL_2                 0x22D4
352c0e09200SDave Airlie #       define R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT 0
353c0e09200SDave Airlie #       define R300_PVS_CNTL_2_PARAM_COUNT_SHIFT  16
354c0e09200SDave Airlie #define R300_VAP_PVS_CNTL_3	           0x22D8
355c0e09200SDave Airlie #       define R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT 10
356c0e09200SDave Airlie #       define R300_PVS_CNTL_3_PROGRAM_UNKNOWN2_SHIFT 0
357c0e09200SDave Airlie 
358c0e09200SDave Airlie /* The entire range from 0x2300 to 0x2AC inclusive seems to be used for
359c0e09200SDave Airlie  * immediate vertices
360c0e09200SDave Airlie  */
361c0e09200SDave Airlie #define R300_VAP_VTX_COLOR_R                0x2464
362c0e09200SDave Airlie #define R300_VAP_VTX_COLOR_G                0x2468
363c0e09200SDave Airlie #define R300_VAP_VTX_COLOR_B                0x246C
364c0e09200SDave Airlie #define R300_VAP_VTX_POS_0_X_1              0x2490 /* used for glVertex2*() */
365c0e09200SDave Airlie #define R300_VAP_VTX_POS_0_Y_1              0x2494
366c0e09200SDave Airlie #define R300_VAP_VTX_COLOR_PKD              0x249C /* RGBA */
367c0e09200SDave Airlie #define R300_VAP_VTX_POS_0_X_2              0x24A0 /* used for glVertex3*() */
368c0e09200SDave Airlie #define R300_VAP_VTX_POS_0_Y_2              0x24A4
369c0e09200SDave Airlie #define R300_VAP_VTX_POS_0_Z_2              0x24A8
370c0e09200SDave Airlie /* write 0 to indicate end of packet? */
371c0e09200SDave Airlie #define R300_VAP_VTX_END_OF_PKT             0x24AC
372c0e09200SDave Airlie 
373c0e09200SDave Airlie /* gap */
374c0e09200SDave Airlie 
375c0e09200SDave Airlie /* These are values from r300_reg/r300_reg.h - they are known to be correct
376c0e09200SDave Airlie  * and are here so we can use one register file instead of several
377c0e09200SDave Airlie  * - Vladimir
378c0e09200SDave Airlie  */
379c0e09200SDave Airlie #define R300_GB_VAP_RASTER_VTX_FMT_0	0x4000
380c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_0__POS_PRESENT	(1<<0)
381c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_0_PRESENT	(1<<1)
382c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_1_PRESENT	(1<<2)
383c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_2_PRESENT	(1<<3)
384c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_3_PRESENT	(1<<4)
385c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_0__COLOR_SPACE	(0xf<<5)
386c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_0__PT_SIZE_PRESENT	(0x1<<16)
387c0e09200SDave Airlie 
388c0e09200SDave Airlie #define R300_GB_VAP_RASTER_VTX_FMT_1	0x4004
389c0e09200SDave Airlie 	/* each of the following is 3 bits wide, specifies number
390c0e09200SDave Airlie 	   of components */
391c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_0_COMP_CNT_SHIFT	0
392c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_1_COMP_CNT_SHIFT	3
393c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_2_COMP_CNT_SHIFT	6
394c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_3_COMP_CNT_SHIFT	9
395c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_4_COMP_CNT_SHIFT	12
396c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_5_COMP_CNT_SHIFT	15
397c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_6_COMP_CNT_SHIFT	18
398c0e09200SDave Airlie #	define R300_GB_VAP_RASTER_VTX_FMT_1__TEX_7_COMP_CNT_SHIFT	21
399c0e09200SDave Airlie 
400c0e09200SDave Airlie /* UNK30 seems to enables point to quad transformation on textures
401c0e09200SDave Airlie  * (or something closely related to that).
402c0e09200SDave Airlie  * This bit is rather fatal at the time being due to lackings at pixel
403c0e09200SDave Airlie  * shader side
404c0e09200SDave Airlie  */
405c0e09200SDave Airlie #define R300_GB_ENABLE	0x4008
406c0e09200SDave Airlie #	define R300_GB_POINT_STUFF_ENABLE	(1<<0)
407c0e09200SDave Airlie #	define R300_GB_LINE_STUFF_ENABLE	(1<<1)
408c0e09200SDave Airlie #	define R300_GB_TRIANGLE_STUFF_ENABLE	(1<<2)
409c0e09200SDave Airlie #	define R300_GB_STENCIL_AUTO_ENABLE	(1<<4)
410c0e09200SDave Airlie #	define R300_GB_UNK31			(1<<31)
411c0e09200SDave Airlie 	/* each of the following is 2 bits wide */
412c0e09200SDave Airlie #define R300_GB_TEX_REPLICATE	0
413c0e09200SDave Airlie #define R300_GB_TEX_ST		1
414c0e09200SDave Airlie #define R300_GB_TEX_STR		2
415c0e09200SDave Airlie #	define R300_GB_TEX0_SOURCE_SHIFT	16
416c0e09200SDave Airlie #	define R300_GB_TEX1_SOURCE_SHIFT	18
417c0e09200SDave Airlie #	define R300_GB_TEX2_SOURCE_SHIFT	20
418c0e09200SDave Airlie #	define R300_GB_TEX3_SOURCE_SHIFT	22
419c0e09200SDave Airlie #	define R300_GB_TEX4_SOURCE_SHIFT	24
420c0e09200SDave Airlie #	define R300_GB_TEX5_SOURCE_SHIFT	26
421c0e09200SDave Airlie #	define R300_GB_TEX6_SOURCE_SHIFT	28
422c0e09200SDave Airlie #	define R300_GB_TEX7_SOURCE_SHIFT	30
423c0e09200SDave Airlie 
424c0e09200SDave Airlie /* MSPOS - positions for multisample antialiasing (?) */
425c0e09200SDave Airlie #define R300_GB_MSPOS0	0x4010
426c0e09200SDave Airlie 	/* shifts - each of the fields is 4 bits */
427c0e09200SDave Airlie #	define R300_GB_MSPOS0__MS_X0_SHIFT	0
428c0e09200SDave Airlie #	define R300_GB_MSPOS0__MS_Y0_SHIFT	4
429c0e09200SDave Airlie #	define R300_GB_MSPOS0__MS_X1_SHIFT	8
430c0e09200SDave Airlie #	define R300_GB_MSPOS0__MS_Y1_SHIFT	12
431c0e09200SDave Airlie #	define R300_GB_MSPOS0__MS_X2_SHIFT	16
432c0e09200SDave Airlie #	define R300_GB_MSPOS0__MS_Y2_SHIFT	20
433c0e09200SDave Airlie #	define R300_GB_MSPOS0__MSBD0_Y		24
434c0e09200SDave Airlie #	define R300_GB_MSPOS0__MSBD0_X		28
435c0e09200SDave Airlie 
436c0e09200SDave Airlie #define R300_GB_MSPOS1	0x4014
437c0e09200SDave Airlie #	define R300_GB_MSPOS1__MS_X3_SHIFT	0
438c0e09200SDave Airlie #	define R300_GB_MSPOS1__MS_Y3_SHIFT	4
439c0e09200SDave Airlie #	define R300_GB_MSPOS1__MS_X4_SHIFT	8
440c0e09200SDave Airlie #	define R300_GB_MSPOS1__MS_Y4_SHIFT	12
441c0e09200SDave Airlie #	define R300_GB_MSPOS1__MS_X5_SHIFT	16
442c0e09200SDave Airlie #	define R300_GB_MSPOS1__MS_Y5_SHIFT	20
443c0e09200SDave Airlie #	define R300_GB_MSPOS1__MSBD1		24
444c0e09200SDave Airlie 
445c0e09200SDave Airlie 
446c0e09200SDave Airlie #define R300_GB_TILE_CONFIG	0x4018
447c0e09200SDave Airlie #	define R300_GB_TILE_ENABLE	(1<<0)
448c0e09200SDave Airlie #	define R300_GB_TILE_PIPE_COUNT_RV300	0
449c0e09200SDave Airlie #	define R300_GB_TILE_PIPE_COUNT_R300	(3<<1)
450c0e09200SDave Airlie #	define R300_GB_TILE_PIPE_COUNT_R420	(7<<1)
451c0e09200SDave Airlie #	define R300_GB_TILE_PIPE_COUNT_RV410	(3<<1)
452c0e09200SDave Airlie #	define R300_GB_TILE_SIZE_8		0
453c0e09200SDave Airlie #	define R300_GB_TILE_SIZE_16		(1<<4)
454c0e09200SDave Airlie #	define R300_GB_TILE_SIZE_32		(2<<4)
455c0e09200SDave Airlie #	define R300_GB_SUPER_SIZE_1		(0<<6)
456c0e09200SDave Airlie #	define R300_GB_SUPER_SIZE_2		(1<<6)
457c0e09200SDave Airlie #	define R300_GB_SUPER_SIZE_4		(2<<6)
458c0e09200SDave Airlie #	define R300_GB_SUPER_SIZE_8		(3<<6)
459c0e09200SDave Airlie #	define R300_GB_SUPER_SIZE_16		(4<<6)
460c0e09200SDave Airlie #	define R300_GB_SUPER_SIZE_32		(5<<6)
461c0e09200SDave Airlie #	define R300_GB_SUPER_SIZE_64		(6<<6)
462c0e09200SDave Airlie #	define R300_GB_SUPER_SIZE_128		(7<<6)
463c0e09200SDave Airlie #	define R300_GB_SUPER_X_SHIFT		9	/* 3 bits wide */
464c0e09200SDave Airlie #	define R300_GB_SUPER_Y_SHIFT		12	/* 3 bits wide */
465c0e09200SDave Airlie #	define R300_GB_SUPER_TILE_A		0
466c0e09200SDave Airlie #	define R300_GB_SUPER_TILE_B		(1<<15)
467c0e09200SDave Airlie #	define R300_GB_SUBPIXEL_1_12		0
468c0e09200SDave Airlie #	define R300_GB_SUBPIXEL_1_16		(1<<16)
469c0e09200SDave Airlie 
470c0e09200SDave Airlie #define R300_GB_FIFO_SIZE	0x4024
471c0e09200SDave Airlie 	/* each of the following is 2 bits wide */
472c0e09200SDave Airlie #define R300_GB_FIFO_SIZE_32	0
473c0e09200SDave Airlie #define R300_GB_FIFO_SIZE_64	1
474c0e09200SDave Airlie #define R300_GB_FIFO_SIZE_128	2
475c0e09200SDave Airlie #define R300_GB_FIFO_SIZE_256	3
476c0e09200SDave Airlie #	define R300_SC_IFIFO_SIZE_SHIFT	0
477c0e09200SDave Airlie #	define R300_SC_TZFIFO_SIZE_SHIFT	2
478c0e09200SDave Airlie #	define R300_SC_BFIFO_SIZE_SHIFT	4
479c0e09200SDave Airlie 
480c0e09200SDave Airlie #	define R300_US_OFIFO_SIZE_SHIFT	12
481c0e09200SDave Airlie #	define R300_US_WFIFO_SIZE_SHIFT	14
482c0e09200SDave Airlie 	/* the following use the same constants as above, but meaning is
483c0e09200SDave Airlie 	   is times 2 (i.e. instead of 32 words it means 64 */
484c0e09200SDave Airlie #	define R300_RS_TFIFO_SIZE_SHIFT	6
485c0e09200SDave Airlie #	define R300_RS_CFIFO_SIZE_SHIFT	8
486c0e09200SDave Airlie #	define R300_US_RAM_SIZE_SHIFT		10
487c0e09200SDave Airlie 	/* watermarks, 3 bits wide */
488c0e09200SDave Airlie #	define R300_RS_HIGHWATER_COL_SHIFT	16
489c0e09200SDave Airlie #	define R300_RS_HIGHWATER_TEX_SHIFT	19
490c0e09200SDave Airlie #	define R300_OFIFO_HIGHWATER_SHIFT	22	/* two bits only */
491c0e09200SDave Airlie #	define R300_CUBE_FIFO_HIGHWATER_COL_SHIFT	24
492c0e09200SDave Airlie 
493c0e09200SDave Airlie #define R300_GB_SELECT	0x401C
494c0e09200SDave Airlie #	define R300_GB_FOG_SELECT_C0A		0
495c0e09200SDave Airlie #	define R300_GB_FOG_SELECT_C1A		1
496c0e09200SDave Airlie #	define R300_GB_FOG_SELECT_C2A		2
497c0e09200SDave Airlie #	define R300_GB_FOG_SELECT_C3A		3
498c0e09200SDave Airlie #	define R300_GB_FOG_SELECT_1_1_W	4
499c0e09200SDave Airlie #	define R300_GB_FOG_SELECT_Z		5
500c0e09200SDave Airlie #	define R300_GB_DEPTH_SELECT_Z		0
501c0e09200SDave Airlie #	define R300_GB_DEPTH_SELECT_1_1_W	(1<<3)
502c0e09200SDave Airlie #	define R300_GB_W_SELECT_1_W		0
503c0e09200SDave Airlie #	define R300_GB_W_SELECT_1		(1<<4)
504c0e09200SDave Airlie 
505c0e09200SDave Airlie #define R300_GB_AA_CONFIG		0x4020
506c0e09200SDave Airlie #	define R300_AA_DISABLE			0x00
507c0e09200SDave Airlie #	define R300_AA_ENABLE			0x01
508c0e09200SDave Airlie #	define R300_AA_SUBSAMPLES_2		0
509c0e09200SDave Airlie #	define R300_AA_SUBSAMPLES_3		(1<<1)
510c0e09200SDave Airlie #	define R300_AA_SUBSAMPLES_4		(2<<1)
511c0e09200SDave Airlie #	define R300_AA_SUBSAMPLES_6		(3<<1)
512c0e09200SDave Airlie 
513c0e09200SDave Airlie /* gap */
514c0e09200SDave Airlie 
515c0e09200SDave Airlie /* Zero to flush caches. */
516*54f961a6SJerome Glisse #define R300_TX_INVALTAGS                   0x4100
517c0e09200SDave Airlie #define R300_TX_FLUSH                       0x0
518c0e09200SDave Airlie 
519c0e09200SDave Airlie /* The upper enable bits are guessed, based on fglrx reported limits. */
520c0e09200SDave Airlie #define R300_TX_ENABLE                      0x4104
521c0e09200SDave Airlie #       define R300_TX_ENABLE_0                  (1 << 0)
522c0e09200SDave Airlie #       define R300_TX_ENABLE_1                  (1 << 1)
523c0e09200SDave Airlie #       define R300_TX_ENABLE_2                  (1 << 2)
524c0e09200SDave Airlie #       define R300_TX_ENABLE_3                  (1 << 3)
525c0e09200SDave Airlie #       define R300_TX_ENABLE_4                  (1 << 4)
526c0e09200SDave Airlie #       define R300_TX_ENABLE_5                  (1 << 5)
527c0e09200SDave Airlie #       define R300_TX_ENABLE_6                  (1 << 6)
528c0e09200SDave Airlie #       define R300_TX_ENABLE_7                  (1 << 7)
529c0e09200SDave Airlie #       define R300_TX_ENABLE_8                  (1 << 8)
530c0e09200SDave Airlie #       define R300_TX_ENABLE_9                  (1 << 9)
531c0e09200SDave Airlie #       define R300_TX_ENABLE_10                 (1 << 10)
532c0e09200SDave Airlie #       define R300_TX_ENABLE_11                 (1 << 11)
533c0e09200SDave Airlie #       define R300_TX_ENABLE_12                 (1 << 12)
534c0e09200SDave Airlie #       define R300_TX_ENABLE_13                 (1 << 13)
535c0e09200SDave Airlie #       define R300_TX_ENABLE_14                 (1 << 14)
536c0e09200SDave Airlie #       define R300_TX_ENABLE_15                 (1 << 15)
537c0e09200SDave Airlie 
538c0e09200SDave Airlie /* The pointsize is given in multiples of 6. The pointsize can be
539c0e09200SDave Airlie  * enormous: Clear() renders a single point that fills the entire
540c0e09200SDave Airlie  * framebuffer.
541c0e09200SDave Airlie  */
542c0e09200SDave Airlie #define R300_RE_POINTSIZE                   0x421C
543c0e09200SDave Airlie #       define R300_POINTSIZE_Y_SHIFT            0
544c0e09200SDave Airlie #       define R300_POINTSIZE_Y_MASK             (0xFFFF << 0) /* GUESS */
545c0e09200SDave Airlie #       define R300_POINTSIZE_X_SHIFT            16
546c0e09200SDave Airlie #       define R300_POINTSIZE_X_MASK             (0xFFFF << 16) /* GUESS */
547c0e09200SDave Airlie #       define R300_POINTSIZE_MAX             (R300_POINTSIZE_Y_MASK / 6)
548c0e09200SDave Airlie 
549c0e09200SDave Airlie /* The line width is given in multiples of 6.
550c0e09200SDave Airlie  * In default mode lines are classified as vertical lines.
551c0e09200SDave Airlie  * HO: horizontal
552c0e09200SDave Airlie  * VE: vertical or horizontal
553c0e09200SDave Airlie  * HO & VE: no classification
554c0e09200SDave Airlie  */
555c0e09200SDave Airlie #define R300_RE_LINE_CNT                      0x4234
556c0e09200SDave Airlie #       define R300_LINESIZE_SHIFT            0
557c0e09200SDave Airlie #       define R300_LINESIZE_MASK             (0xFFFF << 0) /* GUESS */
558c0e09200SDave Airlie #       define R300_LINESIZE_MAX             (R300_LINESIZE_MASK / 6)
559c0e09200SDave Airlie #       define R300_LINE_CNT_HO               (1 << 16)
560c0e09200SDave Airlie #       define R300_LINE_CNT_VE               (1 << 17)
561c0e09200SDave Airlie 
562c0e09200SDave Airlie /* Some sort of scale or clamp value for texcoordless textures. */
563c0e09200SDave Airlie #define R300_RE_UNK4238                       0x4238
564c0e09200SDave Airlie 
565c0e09200SDave Airlie /* Something shade related */
566c0e09200SDave Airlie #define R300_RE_SHADE                         0x4274
567c0e09200SDave Airlie 
568c0e09200SDave Airlie #define R300_RE_SHADE_MODEL                   0x4278
569c0e09200SDave Airlie #	define R300_RE_SHADE_MODEL_SMOOTH     0x3aaaa
570c0e09200SDave Airlie #	define R300_RE_SHADE_MODEL_FLAT       0x39595
571c0e09200SDave Airlie 
572c0e09200SDave Airlie /* Dangerous */
573c0e09200SDave Airlie #define R300_RE_POLYGON_MODE                  0x4288
574c0e09200SDave Airlie #	define R300_PM_ENABLED                (1 << 0)
575c0e09200SDave Airlie #	define R300_PM_FRONT_POINT            (0 << 0)
576c0e09200SDave Airlie #	define R300_PM_BACK_POINT             (0 << 0)
577c0e09200SDave Airlie #	define R300_PM_FRONT_LINE             (1 << 4)
578c0e09200SDave Airlie #	define R300_PM_FRONT_FILL             (1 << 5)
579c0e09200SDave Airlie #	define R300_PM_BACK_LINE              (1 << 7)
580c0e09200SDave Airlie #	define R300_PM_BACK_FILL              (1 << 8)
581c0e09200SDave Airlie 
582c0e09200SDave Airlie /* Fog parameters */
583c0e09200SDave Airlie #define R300_RE_FOG_SCALE                     0x4294
584c0e09200SDave Airlie #define R300_RE_FOG_START                     0x4298
585c0e09200SDave Airlie 
586c0e09200SDave Airlie /* Not sure why there are duplicate of factor and constant values.
587c0e09200SDave Airlie  * My best guess so far is that there are separate zbiases for test and write.
588c0e09200SDave Airlie  * Ordering might be wrong.
589c0e09200SDave Airlie  * Some of the tests indicate that fgl has a fallback implementation of zbias
590c0e09200SDave Airlie  * via pixel shaders.
591c0e09200SDave Airlie  */
592c0e09200SDave Airlie #define R300_RE_ZBIAS_CNTL                    0x42A0 /* GUESS */
593c0e09200SDave Airlie #define R300_RE_ZBIAS_T_FACTOR                0x42A4
594c0e09200SDave Airlie #define R300_RE_ZBIAS_T_CONSTANT              0x42A8
595c0e09200SDave Airlie #define R300_RE_ZBIAS_W_FACTOR                0x42AC
596c0e09200SDave Airlie #define R300_RE_ZBIAS_W_CONSTANT              0x42B0
597c0e09200SDave Airlie 
598c0e09200SDave Airlie /* This register needs to be set to (1<<1) for RV350 to correctly
599c0e09200SDave Airlie  * perform depth test (see --vb-triangles in r300_demo)
600c0e09200SDave Airlie  * Don't know about other chips. - Vladimir
601c0e09200SDave Airlie  * This is set to 3 when GL_POLYGON_OFFSET_FILL is on.
602c0e09200SDave Airlie  * My guess is that there are two bits for each zbias primitive
603c0e09200SDave Airlie  * (FILL, LINE, POINT).
604c0e09200SDave Airlie  *  One to enable depth test and one for depth write.
605c0e09200SDave Airlie  * Yet this doesnt explain why depth writes work ...
606c0e09200SDave Airlie  */
607c0e09200SDave Airlie #define R300_RE_OCCLUSION_CNTL		    0x42B4
608c0e09200SDave Airlie #	define R300_OCCLUSION_ON		(1<<1)
609c0e09200SDave Airlie 
610c0e09200SDave Airlie #define R300_RE_CULL_CNTL                   0x42B8
611c0e09200SDave Airlie #       define R300_CULL_FRONT                   (1 << 0)
612c0e09200SDave Airlie #       define R300_CULL_BACK                    (1 << 1)
613c0e09200SDave Airlie #       define R300_FRONT_FACE_CCW               (0 << 2)
614c0e09200SDave Airlie #       define R300_FRONT_FACE_CW                (1 << 2)
615c0e09200SDave Airlie 
616c0e09200SDave Airlie 
617c0e09200SDave Airlie /* BEGIN: Rasterization / Interpolators - many guesses */
618c0e09200SDave Airlie 
619c0e09200SDave Airlie /* 0_UNKNOWN_18 has always been set except for clear operations.
620c0e09200SDave Airlie  * TC_CNT is the number of incoming texture coordinate sets (i.e. it depends
621c0e09200SDave Airlie  * on the vertex program, *not* the fragment program)
622c0e09200SDave Airlie  */
623c0e09200SDave Airlie #define R300_RS_CNTL_0                      0x4300
624c0e09200SDave Airlie #       define R300_RS_CNTL_TC_CNT_SHIFT         2
625c0e09200SDave Airlie #       define R300_RS_CNTL_TC_CNT_MASK          (7 << 2)
626c0e09200SDave Airlie 	/* number of color interpolators used */
627c0e09200SDave Airlie #	define R300_RS_CNTL_CI_CNT_SHIFT         7
628c0e09200SDave Airlie #       define R300_RS_CNTL_0_UNKNOWN_18         (1 << 18)
629c0e09200SDave Airlie 	/* Guess: RS_CNTL_1 holds the index of the highest used RS_ROUTE_n
630c0e09200SDave Airlie 	   register. */
631c0e09200SDave Airlie #define R300_RS_CNTL_1                      0x4304
632c0e09200SDave Airlie 
633c0e09200SDave Airlie /* gap */
634c0e09200SDave Airlie 
635c0e09200SDave Airlie /* Only used for texture coordinates.
636c0e09200SDave Airlie  * Use the source field to route texture coordinate input from the
637c0e09200SDave Airlie  * vertex program to the desired interpolator. Note that the source
638c0e09200SDave Airlie  * field is relative to the outputs the vertex program *actually*
639c0e09200SDave Airlie  * writes. If a vertex program only writes texcoord[1], this will
640c0e09200SDave Airlie  * be source index 0.
641c0e09200SDave Airlie  * Set INTERP_USED on all interpolators that produce data used by
642c0e09200SDave Airlie  * the fragment program. INTERP_USED looks like a swizzling mask,
643c0e09200SDave Airlie  * but I haven't seen it used that way.
644c0e09200SDave Airlie  *
645c0e09200SDave Airlie  * Note: The _UNKNOWN constants are always set in their respective
646c0e09200SDave Airlie  * register. I don't know if this is necessary.
647c0e09200SDave Airlie  */
648c0e09200SDave Airlie #define R300_RS_INTERP_0                    0x4310
649c0e09200SDave Airlie #define R300_RS_INTERP_1                    0x4314
650c0e09200SDave Airlie #       define R300_RS_INTERP_1_UNKNOWN          0x40
651c0e09200SDave Airlie #define R300_RS_INTERP_2                    0x4318
652c0e09200SDave Airlie #       define R300_RS_INTERP_2_UNKNOWN          0x80
653c0e09200SDave Airlie #define R300_RS_INTERP_3                    0x431C
654c0e09200SDave Airlie #       define R300_RS_INTERP_3_UNKNOWN          0xC0
655c0e09200SDave Airlie #define R300_RS_INTERP_4                    0x4320
656c0e09200SDave Airlie #define R300_RS_INTERP_5                    0x4324
657c0e09200SDave Airlie #define R300_RS_INTERP_6                    0x4328
658c0e09200SDave Airlie #define R300_RS_INTERP_7                    0x432C
659c0e09200SDave Airlie #       define R300_RS_INTERP_SRC_SHIFT          2
660c0e09200SDave Airlie #       define R300_RS_INTERP_SRC_MASK           (7 << 2)
661c0e09200SDave Airlie #       define R300_RS_INTERP_USED               0x00D10000
662c0e09200SDave Airlie 
663c0e09200SDave Airlie /* These DWORDs control how vertex data is routed into fragment program
664c0e09200SDave Airlie  * registers, after interpolators.
665c0e09200SDave Airlie  */
666c0e09200SDave Airlie #define R300_RS_ROUTE_0                     0x4330
667c0e09200SDave Airlie #define R300_RS_ROUTE_1                     0x4334
668c0e09200SDave Airlie #define R300_RS_ROUTE_2                     0x4338
669c0e09200SDave Airlie #define R300_RS_ROUTE_3                     0x433C /* GUESS */
670c0e09200SDave Airlie #define R300_RS_ROUTE_4                     0x4340 /* GUESS */
671c0e09200SDave Airlie #define R300_RS_ROUTE_5                     0x4344 /* GUESS */
672c0e09200SDave Airlie #define R300_RS_ROUTE_6                     0x4348 /* GUESS */
673c0e09200SDave Airlie #define R300_RS_ROUTE_7                     0x434C /* GUESS */
674c0e09200SDave Airlie #       define R300_RS_ROUTE_SOURCE_INTERP_0     0
675c0e09200SDave Airlie #       define R300_RS_ROUTE_SOURCE_INTERP_1     1
676c0e09200SDave Airlie #       define R300_RS_ROUTE_SOURCE_INTERP_2     2
677c0e09200SDave Airlie #       define R300_RS_ROUTE_SOURCE_INTERP_3     3
678c0e09200SDave Airlie #       define R300_RS_ROUTE_SOURCE_INTERP_4     4
679c0e09200SDave Airlie #       define R300_RS_ROUTE_SOURCE_INTERP_5     5 /* GUESS */
680c0e09200SDave Airlie #       define R300_RS_ROUTE_SOURCE_INTERP_6     6 /* GUESS */
681c0e09200SDave Airlie #       define R300_RS_ROUTE_SOURCE_INTERP_7     7 /* GUESS */
682c0e09200SDave Airlie #       define R300_RS_ROUTE_ENABLE              (1 << 3) /* GUESS */
683c0e09200SDave Airlie #       define R300_RS_ROUTE_DEST_SHIFT          6
684c0e09200SDave Airlie #       define R300_RS_ROUTE_DEST_MASK           (31 << 6) /* GUESS */
685c0e09200SDave Airlie 
686c0e09200SDave Airlie /* Special handling for color: When the fragment program uses color,
687c0e09200SDave Airlie  * the ROUTE_0_COLOR bit is set and ROUTE_0_COLOR_DEST contains the
688c0e09200SDave Airlie  * color register index.
689c0e09200SDave Airlie  *
690c0e09200SDave Airlie  * Apperently you may set the R300_RS_ROUTE_0_COLOR bit, but not provide any
691c0e09200SDave Airlie  * R300_RS_ROUTE_0_COLOR_DEST value; this setup is used for clearing the state.
692c0e09200SDave Airlie  * See r300_ioctl.c:r300EmitClearState. I'm not sure if this setup is strictly
693c0e09200SDave Airlie  * correct or not. - Oliver.
694c0e09200SDave Airlie  */
695c0e09200SDave Airlie #       define R300_RS_ROUTE_0_COLOR             (1 << 14)
696c0e09200SDave Airlie #       define R300_RS_ROUTE_0_COLOR_DEST_SHIFT  17
697c0e09200SDave Airlie #       define R300_RS_ROUTE_0_COLOR_DEST_MASK   (31 << 17) /* GUESS */
698c0e09200SDave Airlie /* As above, but for secondary color */
699c0e09200SDave Airlie #		define R300_RS_ROUTE_1_COLOR1            (1 << 14)
700c0e09200SDave Airlie #		define R300_RS_ROUTE_1_COLOR1_DEST_SHIFT 17
701c0e09200SDave Airlie #		define R300_RS_ROUTE_1_COLOR1_DEST_MASK  (31 << 17)
702c0e09200SDave Airlie #		define R300_RS_ROUTE_1_UNKNOWN11         (1 << 11)
703c0e09200SDave Airlie /* END: Rasterization / Interpolators - many guesses */
704c0e09200SDave Airlie 
705c0e09200SDave Airlie /* Hierarchical Z Enable */
706c0e09200SDave Airlie #define R300_SC_HYPERZ                   0x43a4
707c0e09200SDave Airlie #	define R300_SC_HYPERZ_DISABLE     (0 << 0)
708c0e09200SDave Airlie #	define R300_SC_HYPERZ_ENABLE      (1 << 0)
709c0e09200SDave Airlie #	define R300_SC_HYPERZ_MIN         (0 << 1)
710c0e09200SDave Airlie #	define R300_SC_HYPERZ_MAX         (1 << 1)
711c0e09200SDave Airlie #	define R300_SC_HYPERZ_ADJ_256     (0 << 2)
712c0e09200SDave Airlie #	define R300_SC_HYPERZ_ADJ_128     (1 << 2)
713c0e09200SDave Airlie #	define R300_SC_HYPERZ_ADJ_64      (2 << 2)
714c0e09200SDave Airlie #	define R300_SC_HYPERZ_ADJ_32      (3 << 2)
715c0e09200SDave Airlie #	define R300_SC_HYPERZ_ADJ_16      (4 << 2)
716c0e09200SDave Airlie #	define R300_SC_HYPERZ_ADJ_8       (5 << 2)
717c0e09200SDave Airlie #	define R300_SC_HYPERZ_ADJ_4       (6 << 2)
718c0e09200SDave Airlie #	define R300_SC_HYPERZ_ADJ_2       (7 << 2)
719c0e09200SDave Airlie #	define R300_SC_HYPERZ_HZ_Z0MIN_NO (0 << 5)
720c0e09200SDave Airlie #	define R300_SC_HYPERZ_HZ_Z0MIN    (1 << 5)
721c0e09200SDave Airlie #	define R300_SC_HYPERZ_HZ_Z0MAX_NO (0 << 6)
722c0e09200SDave Airlie #	define R300_SC_HYPERZ_HZ_Z0MAX    (1 << 6)
723c0e09200SDave Airlie 
724c0e09200SDave Airlie #define R300_SC_EDGERULE                 0x43a8
725c0e09200SDave Airlie 
726c0e09200SDave Airlie /* BEGIN: Scissors and cliprects */
727c0e09200SDave Airlie 
728c0e09200SDave Airlie /* There are four clipping rectangles. Their corner coordinates are inclusive.
729c0e09200SDave Airlie  * Every pixel is assigned a number from 0 and 15 by setting bits 0-3 depending
730c0e09200SDave Airlie  * on whether the pixel is inside cliprects 0-3, respectively. For example,
731c0e09200SDave Airlie  * if a pixel is inside cliprects 0 and 1, but outside 2 and 3, it is assigned
732c0e09200SDave Airlie  * the number 3 (binary 0011).
733c0e09200SDave Airlie  * Iff the bit corresponding to the pixel's number in RE_CLIPRECT_CNTL is set,
734c0e09200SDave Airlie  * the pixel is rasterized.
735c0e09200SDave Airlie  *
736c0e09200SDave Airlie  * In addition to this, there is a scissors rectangle. Only pixels inside the
737c0e09200SDave Airlie  * scissors rectangle are drawn. (coordinates are inclusive)
738c0e09200SDave Airlie  *
739c0e09200SDave Airlie  * For some reason, the top-left corner of the framebuffer is at (1440, 1440)
740c0e09200SDave Airlie  * for the purpose of clipping and scissors.
741c0e09200SDave Airlie  */
742c0e09200SDave Airlie #define R300_RE_CLIPRECT_TL_0               0x43B0
743c0e09200SDave Airlie #define R300_RE_CLIPRECT_BR_0               0x43B4
744c0e09200SDave Airlie #define R300_RE_CLIPRECT_TL_1               0x43B8
745c0e09200SDave Airlie #define R300_RE_CLIPRECT_BR_1               0x43BC
746c0e09200SDave Airlie #define R300_RE_CLIPRECT_TL_2               0x43C0
747c0e09200SDave Airlie #define R300_RE_CLIPRECT_BR_2               0x43C4
748c0e09200SDave Airlie #define R300_RE_CLIPRECT_TL_3               0x43C8
749c0e09200SDave Airlie #define R300_RE_CLIPRECT_BR_3               0x43CC
750c0e09200SDave Airlie #       define R300_CLIPRECT_OFFSET              1440
751c0e09200SDave Airlie #       define R300_CLIPRECT_MASK                0x1FFF
752c0e09200SDave Airlie #       define R300_CLIPRECT_X_SHIFT             0
753c0e09200SDave Airlie #       define R300_CLIPRECT_X_MASK              (0x1FFF << 0)
754c0e09200SDave Airlie #       define R300_CLIPRECT_Y_SHIFT             13
755c0e09200SDave Airlie #       define R300_CLIPRECT_Y_MASK              (0x1FFF << 13)
756c0e09200SDave Airlie #define R300_RE_CLIPRECT_CNTL               0x43D0
757c0e09200SDave Airlie #       define R300_CLIP_OUT                     (1 << 0)
758c0e09200SDave Airlie #       define R300_CLIP_0                       (1 << 1)
759c0e09200SDave Airlie #       define R300_CLIP_1                       (1 << 2)
760c0e09200SDave Airlie #       define R300_CLIP_10                      (1 << 3)
761c0e09200SDave Airlie #       define R300_CLIP_2                       (1 << 4)
762c0e09200SDave Airlie #       define R300_CLIP_20                      (1 << 5)
763c0e09200SDave Airlie #       define R300_CLIP_21                      (1 << 6)
764c0e09200SDave Airlie #       define R300_CLIP_210                     (1 << 7)
765c0e09200SDave Airlie #       define R300_CLIP_3                       (1 << 8)
766c0e09200SDave Airlie #       define R300_CLIP_30                      (1 << 9)
767c0e09200SDave Airlie #       define R300_CLIP_31                      (1 << 10)
768c0e09200SDave Airlie #       define R300_CLIP_310                     (1 << 11)
769c0e09200SDave Airlie #       define R300_CLIP_32                      (1 << 12)
770c0e09200SDave Airlie #       define R300_CLIP_320                     (1 << 13)
771c0e09200SDave Airlie #       define R300_CLIP_321                     (1 << 14)
772c0e09200SDave Airlie #       define R300_CLIP_3210                    (1 << 15)
773c0e09200SDave Airlie 
774c0e09200SDave Airlie /* gap */
775c0e09200SDave Airlie 
776c0e09200SDave Airlie #define R300_RE_SCISSORS_TL                 0x43E0
777c0e09200SDave Airlie #define R300_RE_SCISSORS_BR                 0x43E4
778c0e09200SDave Airlie #       define R300_SCISSORS_OFFSET              1440
779c0e09200SDave Airlie #       define R300_SCISSORS_X_SHIFT             0
780c0e09200SDave Airlie #       define R300_SCISSORS_X_MASK              (0x1FFF << 0)
781c0e09200SDave Airlie #       define R300_SCISSORS_Y_SHIFT             13
782c0e09200SDave Airlie #       define R300_SCISSORS_Y_MASK              (0x1FFF << 13)
783c0e09200SDave Airlie /* END: Scissors and cliprects */
784c0e09200SDave Airlie 
785c0e09200SDave Airlie /* BEGIN: Texture specification */
786c0e09200SDave Airlie 
787c0e09200SDave Airlie /*
788c0e09200SDave Airlie  * The texture specification dwords are grouped by meaning and not by texture
789c0e09200SDave Airlie  * unit. This means that e.g. the offset for texture image unit N is found in
790c0e09200SDave Airlie  * register TX_OFFSET_0 + (4*N)
791c0e09200SDave Airlie  */
792c0e09200SDave Airlie #define R300_TX_FILTER_0                    0x4400
793c0e09200SDave Airlie #       define R300_TX_REPEAT                    0
794c0e09200SDave Airlie #       define R300_TX_MIRRORED                  1
795c0e09200SDave Airlie #       define R300_TX_CLAMP                     4
796c0e09200SDave Airlie #       define R300_TX_CLAMP_TO_EDGE             2
797c0e09200SDave Airlie #       define R300_TX_CLAMP_TO_BORDER           6
798c0e09200SDave Airlie #       define R300_TX_WRAP_S_SHIFT              0
799c0e09200SDave Airlie #       define R300_TX_WRAP_S_MASK               (7 << 0)
800c0e09200SDave Airlie #       define R300_TX_WRAP_T_SHIFT              3
801c0e09200SDave Airlie #       define R300_TX_WRAP_T_MASK               (7 << 3)
802c0e09200SDave Airlie #       define R300_TX_WRAP_Q_SHIFT              6
803c0e09200SDave Airlie #       define R300_TX_WRAP_Q_MASK               (7 << 6)
804c0e09200SDave Airlie #       define R300_TX_MAG_FILTER_NEAREST        (1 << 9)
805c0e09200SDave Airlie #       define R300_TX_MAG_FILTER_LINEAR         (2 << 9)
806c0e09200SDave Airlie #       define R300_TX_MAG_FILTER_MASK           (3 << 9)
807c0e09200SDave Airlie #       define R300_TX_MIN_FILTER_NEAREST        (1 << 11)
808c0e09200SDave Airlie #       define R300_TX_MIN_FILTER_LINEAR         (2 << 11)
809c0e09200SDave Airlie #	define R300_TX_MIN_FILTER_NEAREST_MIP_NEAREST       (5  <<  11)
810c0e09200SDave Airlie #	define R300_TX_MIN_FILTER_NEAREST_MIP_LINEAR        (9  <<  11)
811c0e09200SDave Airlie #	define R300_TX_MIN_FILTER_LINEAR_MIP_NEAREST        (6  <<  11)
812c0e09200SDave Airlie #	define R300_TX_MIN_FILTER_LINEAR_MIP_LINEAR         (10 <<  11)
813c0e09200SDave Airlie 
814c0e09200SDave Airlie /* NOTE: NEAREST doesnt seem to exist.
815c0e09200SDave Airlie  * Im not seting MAG_FILTER_MASK and (3 << 11) on for all
816c0e09200SDave Airlie  * anisotropy modes because that would void selected mag filter
817c0e09200SDave Airlie  */
818c0e09200SDave Airlie #	define R300_TX_MIN_FILTER_ANISO_NEAREST             (0 << 13)
819c0e09200SDave Airlie #	define R300_TX_MIN_FILTER_ANISO_LINEAR              (0 << 13)
820c0e09200SDave Airlie #	define R300_TX_MIN_FILTER_ANISO_NEAREST_MIP_NEAREST (1 << 13)
821c0e09200SDave Airlie #	define R300_TX_MIN_FILTER_ANISO_NEAREST_MIP_LINEAR  (2 << 13)
822c0e09200SDave Airlie #       define R300_TX_MIN_FILTER_MASK   ( (15 << 11) | (3 << 13) )
823c0e09200SDave Airlie #	define R300_TX_MAX_ANISO_1_TO_1  (0 << 21)
824c0e09200SDave Airlie #	define R300_TX_MAX_ANISO_2_TO_1  (2 << 21)
825c0e09200SDave Airlie #	define R300_TX_MAX_ANISO_4_TO_1  (4 << 21)
826c0e09200SDave Airlie #	define R300_TX_MAX_ANISO_8_TO_1  (6 << 21)
827c0e09200SDave Airlie #	define R300_TX_MAX_ANISO_16_TO_1 (8 << 21)
828c0e09200SDave Airlie #	define R300_TX_MAX_ANISO_MASK    (14 << 21)
829c0e09200SDave Airlie 
830c0e09200SDave Airlie #define R300_TX_FILTER1_0                      0x4440
831c0e09200SDave Airlie #	define R300_CHROMA_KEY_MODE_DISABLE    0
832c0e09200SDave Airlie #	define R300_CHROMA_KEY_FORCE	       1
833c0e09200SDave Airlie #	define R300_CHROMA_KEY_BLEND           2
834c0e09200SDave Airlie #	define R300_MC_ROUND_NORMAL            (0<<2)
835c0e09200SDave Airlie #	define R300_MC_ROUND_MPEG4             (1<<2)
836c0e09200SDave Airlie #	define R300_LOD_BIAS_MASK	    0x1fff
837c0e09200SDave Airlie #	define R300_EDGE_ANISO_EDGE_DIAG       (0<<13)
838c0e09200SDave Airlie #	define R300_EDGE_ANISO_EDGE_ONLY       (1<<13)
839c0e09200SDave Airlie #	define R300_MC_COORD_TRUNCATE_DISABLE  (0<<14)
840c0e09200SDave Airlie #	define R300_MC_COORD_TRUNCATE_MPEG     (1<<14)
841c0e09200SDave Airlie #	define R300_TX_TRI_PERF_0_8            (0<<15)
842c0e09200SDave Airlie #	define R300_TX_TRI_PERF_1_8            (1<<15)
843c0e09200SDave Airlie #	define R300_TX_TRI_PERF_1_4            (2<<15)
844c0e09200SDave Airlie #	define R300_TX_TRI_PERF_3_8            (3<<15)
845c0e09200SDave Airlie #	define R300_ANISO_THRESHOLD_MASK       (7<<17)
846c0e09200SDave Airlie 
847c0e09200SDave Airlie #define R300_TX_SIZE_0                      0x4480
848c0e09200SDave Airlie #       define R300_TX_WIDTHMASK_SHIFT           0
849c0e09200SDave Airlie #       define R300_TX_WIDTHMASK_MASK            (2047 << 0)
850c0e09200SDave Airlie #       define R300_TX_HEIGHTMASK_SHIFT          11
851c0e09200SDave Airlie #       define R300_TX_HEIGHTMASK_MASK           (2047 << 11)
852c0e09200SDave Airlie #       define R300_TX_UNK23                     (1 << 23)
853c0e09200SDave Airlie #       define R300_TX_MAX_MIP_LEVEL_SHIFT       26
854c0e09200SDave Airlie #       define R300_TX_MAX_MIP_LEVEL_MASK        (0xf << 26)
855c0e09200SDave Airlie #       define R300_TX_SIZE_PROJECTED            (1<<30)
856c0e09200SDave Airlie #       define R300_TX_SIZE_TXPITCH_EN           (1<<31)
857c0e09200SDave Airlie #define R300_TX_FORMAT_0                    0x44C0
858c0e09200SDave Airlie 	/* The interpretation of the format word by Wladimir van der Laan */
859c0e09200SDave Airlie 	/* The X, Y, Z and W refer to the layout of the components.
860c0e09200SDave Airlie 	   They are given meanings as R, G, B and Alpha by the swizzle
861c0e09200SDave Airlie 	   specification */
862c0e09200SDave Airlie #	define R300_TX_FORMAT_X8		    0x0
863c0e09200SDave Airlie #	define R300_TX_FORMAT_X16		    0x1
864c0e09200SDave Airlie #	define R300_TX_FORMAT_Y4X4		    0x2
865c0e09200SDave Airlie #	define R300_TX_FORMAT_Y8X8		    0x3
866c0e09200SDave Airlie #	define R300_TX_FORMAT_Y16X16		    0x4
867c0e09200SDave Airlie #	define R300_TX_FORMAT_Z3Y3X2		    0x5
868c0e09200SDave Airlie #	define R300_TX_FORMAT_Z5Y6X5		    0x6
869c0e09200SDave Airlie #	define R300_TX_FORMAT_Z6Y5X5		    0x7
870c0e09200SDave Airlie #	define R300_TX_FORMAT_Z11Y11X10		    0x8
871c0e09200SDave Airlie #	define R300_TX_FORMAT_Z10Y11X11		    0x9
872c0e09200SDave Airlie #	define R300_TX_FORMAT_W4Z4Y4X4		    0xA
873c0e09200SDave Airlie #	define R300_TX_FORMAT_W1Z5Y5X5		    0xB
874c0e09200SDave Airlie #	define R300_TX_FORMAT_W8Z8Y8X8		    0xC
875c0e09200SDave Airlie #	define R300_TX_FORMAT_W2Z10Y10X10	    0xD
876c0e09200SDave Airlie #	define R300_TX_FORMAT_W16Z16Y16X16	    0xE
877c0e09200SDave Airlie #	define R300_TX_FORMAT_DXT1		    0xF
878c0e09200SDave Airlie #	define R300_TX_FORMAT_DXT3		    0x10
879c0e09200SDave Airlie #	define R300_TX_FORMAT_DXT5		    0x11
880c0e09200SDave Airlie #	define R300_TX_FORMAT_D3DMFT_CxV8U8	    0x12     /* no swizzle */
881c0e09200SDave Airlie #	define R300_TX_FORMAT_A8R8G8B8		    0x13     /* no swizzle */
882c0e09200SDave Airlie #	define R300_TX_FORMAT_B8G8_B8G8		    0x14     /* no swizzle */
883c0e09200SDave Airlie #	define R300_TX_FORMAT_G8R8_G8B8		    0x15     /* no swizzle */
884c0e09200SDave Airlie 	/* 0x16 - some 16 bit green format.. ?? */
885c0e09200SDave Airlie #	define R300_TX_FORMAT_UNK25		   (1 << 25) /* no swizzle */
886c0e09200SDave Airlie #	define R300_TX_FORMAT_CUBIC_MAP		   (1 << 26)
887c0e09200SDave Airlie 
888c0e09200SDave Airlie 	/* gap */
889c0e09200SDave Airlie 	/* Floating point formats */
890c0e09200SDave Airlie 	/* Note - hardware supports both 16 and 32 bit floating point */
891c0e09200SDave Airlie #	define R300_TX_FORMAT_FL_I16		    0x18
892c0e09200SDave Airlie #	define R300_TX_FORMAT_FL_I16A16		    0x19
893c0e09200SDave Airlie #	define R300_TX_FORMAT_FL_R16G16B16A16	    0x1A
894c0e09200SDave Airlie #	define R300_TX_FORMAT_FL_I32		    0x1B
895c0e09200SDave Airlie #	define R300_TX_FORMAT_FL_I32A32		    0x1C
896c0e09200SDave Airlie #	define R300_TX_FORMAT_FL_R32G32B32A32	    0x1D
897c0e09200SDave Airlie 	/* alpha modes, convenience mostly */
898c0e09200SDave Airlie 	/* if you have alpha, pick constant appropriate to the
899c0e09200SDave Airlie 	   number of channels (1 for I8, 2 for I8A8, 4 for R8G8B8A8, etc */
900c0e09200SDave Airlie #	define R300_TX_FORMAT_ALPHA_1CH		    0x000
901c0e09200SDave Airlie #	define R300_TX_FORMAT_ALPHA_2CH		    0x200
902c0e09200SDave Airlie #	define R300_TX_FORMAT_ALPHA_4CH		    0x600
903c0e09200SDave Airlie #	define R300_TX_FORMAT_ALPHA_NONE	    0xA00
904c0e09200SDave Airlie 	/* Swizzling */
905c0e09200SDave Airlie 	/* constants */
906c0e09200SDave Airlie #	define R300_TX_FORMAT_X		0
907c0e09200SDave Airlie #	define R300_TX_FORMAT_Y		1
908c0e09200SDave Airlie #	define R300_TX_FORMAT_Z		2
909c0e09200SDave Airlie #	define R300_TX_FORMAT_W		3
910c0e09200SDave Airlie #	define R300_TX_FORMAT_ZERO	4
911c0e09200SDave Airlie #	define R300_TX_FORMAT_ONE	5
912c0e09200SDave Airlie 	/* 2.0*Z, everything above 1.0 is set to 0.0 */
913c0e09200SDave Airlie #	define R300_TX_FORMAT_CUT_Z	6
914c0e09200SDave Airlie 	/* 2.0*W, everything above 1.0 is set to 0.0 */
915c0e09200SDave Airlie #	define R300_TX_FORMAT_CUT_W	7
916c0e09200SDave Airlie 
917c0e09200SDave Airlie #	define R300_TX_FORMAT_B_SHIFT	18
918c0e09200SDave Airlie #	define R300_TX_FORMAT_G_SHIFT	15
919c0e09200SDave Airlie #	define R300_TX_FORMAT_R_SHIFT	12
920c0e09200SDave Airlie #	define R300_TX_FORMAT_A_SHIFT	9
921c0e09200SDave Airlie 	/* Convenience macro to take care of layout and swizzling */
922c0e09200SDave Airlie #	define R300_EASY_TX_FORMAT(B, G, R, A, FMT)	(		\
923c0e09200SDave Airlie 		((R300_TX_FORMAT_##B)<<R300_TX_FORMAT_B_SHIFT)		\
924c0e09200SDave Airlie 		| ((R300_TX_FORMAT_##G)<<R300_TX_FORMAT_G_SHIFT)	\
925c0e09200SDave Airlie 		| ((R300_TX_FORMAT_##R)<<R300_TX_FORMAT_R_SHIFT)	\
926c0e09200SDave Airlie 		| ((R300_TX_FORMAT_##A)<<R300_TX_FORMAT_A_SHIFT)	\
927c0e09200SDave Airlie 		| (R300_TX_FORMAT_##FMT)				\
928c0e09200SDave Airlie 		)
929c0e09200SDave Airlie 	/* These can be ORed with result of R300_EASY_TX_FORMAT()
930c0e09200SDave Airlie 	   We don't really know what they do. Take values from a
931c0e09200SDave Airlie            constant color ? */
932c0e09200SDave Airlie #	define R300_TX_FORMAT_CONST_X		(1<<5)
933c0e09200SDave Airlie #	define R300_TX_FORMAT_CONST_Y		(2<<5)
934c0e09200SDave Airlie #	define R300_TX_FORMAT_CONST_Z		(4<<5)
935c0e09200SDave Airlie #	define R300_TX_FORMAT_CONST_W		(8<<5)
936c0e09200SDave Airlie 
937c0e09200SDave Airlie #	define R300_TX_FORMAT_YUV_MODE		0x00800000
938c0e09200SDave Airlie 
939c0e09200SDave Airlie #define R300_TX_PITCH_0			    0x4500 /* obvious missing in gap */
940c0e09200SDave Airlie #define R300_TX_OFFSET_0                    0x4540
941c0e09200SDave Airlie 	/* BEGIN: Guess from R200 */
942c0e09200SDave Airlie #       define R300_TXO_ENDIAN_NO_SWAP           (0 << 0)
943c0e09200SDave Airlie #       define R300_TXO_ENDIAN_BYTE_SWAP         (1 << 0)
944c0e09200SDave Airlie #       define R300_TXO_ENDIAN_WORD_SWAP         (2 << 0)
945c0e09200SDave Airlie #       define R300_TXO_ENDIAN_HALFDW_SWAP       (3 << 0)
946c0e09200SDave Airlie #       define R300_TXO_MACRO_TILE               (1 << 2)
947c0e09200SDave Airlie #       define R300_TXO_MICRO_TILE               (1 << 3)
948c0e09200SDave Airlie #       define R300_TXO_OFFSET_MASK              0xffffffe0
949c0e09200SDave Airlie #       define R300_TXO_OFFSET_SHIFT             5
950c0e09200SDave Airlie 	/* END: Guess from R200 */
951c0e09200SDave Airlie 
952c0e09200SDave Airlie /* 32 bit chroma key */
953c0e09200SDave Airlie #define R300_TX_CHROMA_KEY_0                      0x4580
954c0e09200SDave Airlie /* ff00ff00 == { 0, 1.0, 0, 1.0 } */
955c0e09200SDave Airlie #define R300_TX_BORDER_COLOR_0              0x45C0
956c0e09200SDave Airlie 
957c0e09200SDave Airlie /* END: Texture specification */
958c0e09200SDave Airlie 
959c0e09200SDave Airlie /* BEGIN: Fragment program instruction set */
960c0e09200SDave Airlie 
961c0e09200SDave Airlie /* Fragment programs are written directly into register space.
962c0e09200SDave Airlie  * There are separate instruction streams for texture instructions and ALU
963c0e09200SDave Airlie  * instructions.
964c0e09200SDave Airlie  * In order to synchronize these streams, the program is divided into up
965c0e09200SDave Airlie  * to 4 nodes. Each node begins with a number of TEX operations, followed
966c0e09200SDave Airlie  * by a number of ALU operations.
967c0e09200SDave Airlie  * The first node can have zero TEX ops, all subsequent nodes must have at
968c0e09200SDave Airlie  * least
969c0e09200SDave Airlie  * one TEX ops.
970c0e09200SDave Airlie  * All nodes must have at least one ALU op.
971c0e09200SDave Airlie  *
972c0e09200SDave Airlie  * The index of the last node is stored in PFS_CNTL_0: A value of 0 means
973c0e09200SDave Airlie  * 1 node, a value of 3 means 4 nodes.
974c0e09200SDave Airlie  * The total amount of instructions is defined in PFS_CNTL_2. The offsets are
975c0e09200SDave Airlie  * offsets into the respective instruction streams, while *_END points to the
976c0e09200SDave Airlie  * last instruction relative to this offset.
977c0e09200SDave Airlie  */
978c0e09200SDave Airlie #define R300_PFS_CNTL_0                     0x4600
979c0e09200SDave Airlie #       define R300_PFS_CNTL_LAST_NODES_SHIFT    0
980c0e09200SDave Airlie #       define R300_PFS_CNTL_LAST_NODES_MASK     (3 << 0)
981c0e09200SDave Airlie #       define R300_PFS_CNTL_FIRST_NODE_HAS_TEX  (1 << 3)
982c0e09200SDave Airlie #define R300_PFS_CNTL_1                     0x4604
983c0e09200SDave Airlie /* There is an unshifted value here which has so far always been equal to the
984c0e09200SDave Airlie  * index of the highest used temporary register.
985c0e09200SDave Airlie  */
986c0e09200SDave Airlie #define R300_PFS_CNTL_2                     0x4608
987c0e09200SDave Airlie #       define R300_PFS_CNTL_ALU_OFFSET_SHIFT    0
988c0e09200SDave Airlie #       define R300_PFS_CNTL_ALU_OFFSET_MASK     (63 << 0)
989c0e09200SDave Airlie #       define R300_PFS_CNTL_ALU_END_SHIFT       6
990c0e09200SDave Airlie #       define R300_PFS_CNTL_ALU_END_MASK        (63 << 6)
991c0e09200SDave Airlie #       define R300_PFS_CNTL_TEX_OFFSET_SHIFT    12
992c0e09200SDave Airlie #       define R300_PFS_CNTL_TEX_OFFSET_MASK     (31 << 12) /* GUESS */
993c0e09200SDave Airlie #       define R300_PFS_CNTL_TEX_END_SHIFT       18
994c0e09200SDave Airlie #       define R300_PFS_CNTL_TEX_END_MASK        (31 << 18) /* GUESS */
995c0e09200SDave Airlie 
996c0e09200SDave Airlie /* gap */
997c0e09200SDave Airlie 
998c0e09200SDave Airlie /* Nodes are stored backwards. The last active node is always stored in
999c0e09200SDave Airlie  * PFS_NODE_3.
1000c0e09200SDave Airlie  * Example: In a 2-node program, NODE_0 and NODE_1 are set to 0. The
1001c0e09200SDave Airlie  * first node is stored in NODE_2, the second node is stored in NODE_3.
1002c0e09200SDave Airlie  *
1003c0e09200SDave Airlie  * Offsets are relative to the master offset from PFS_CNTL_2.
1004c0e09200SDave Airlie  */
1005c0e09200SDave Airlie #define R300_PFS_NODE_0                     0x4610
1006c0e09200SDave Airlie #define R300_PFS_NODE_1                     0x4614
1007c0e09200SDave Airlie #define R300_PFS_NODE_2                     0x4618
1008c0e09200SDave Airlie #define R300_PFS_NODE_3                     0x461C
1009c0e09200SDave Airlie #       define R300_PFS_NODE_ALU_OFFSET_SHIFT    0
1010c0e09200SDave Airlie #       define R300_PFS_NODE_ALU_OFFSET_MASK     (63 << 0)
1011c0e09200SDave Airlie #       define R300_PFS_NODE_ALU_END_SHIFT       6
1012c0e09200SDave Airlie #       define R300_PFS_NODE_ALU_END_MASK        (63 << 6)
1013c0e09200SDave Airlie #       define R300_PFS_NODE_TEX_OFFSET_SHIFT    12
1014c0e09200SDave Airlie #       define R300_PFS_NODE_TEX_OFFSET_MASK     (31 << 12)
1015c0e09200SDave Airlie #       define R300_PFS_NODE_TEX_END_SHIFT       17
1016c0e09200SDave Airlie #       define R300_PFS_NODE_TEX_END_MASK        (31 << 17)
1017c0e09200SDave Airlie #		define R300_PFS_NODE_OUTPUT_COLOR        (1 << 22)
1018c0e09200SDave Airlie #		define R300_PFS_NODE_OUTPUT_DEPTH        (1 << 23)
1019c0e09200SDave Airlie 
1020c0e09200SDave Airlie /* TEX
1021c0e09200SDave Airlie  * As far as I can tell, texture instructions cannot write into output
1022c0e09200SDave Airlie  * registers directly. A subsequent ALU instruction is always necessary,
1023c0e09200SDave Airlie  * even if it's just MAD o0, r0, 1, 0
1024c0e09200SDave Airlie  */
1025c0e09200SDave Airlie #define R300_PFS_TEXI_0                     0x4620
1026c0e09200SDave Airlie #	define R300_FPITX_SRC_SHIFT              0
1027c0e09200SDave Airlie #	define R300_FPITX_SRC_MASK               (31 << 0)
1028c0e09200SDave Airlie 	/* GUESS */
1029c0e09200SDave Airlie #	define R300_FPITX_SRC_CONST              (1 << 5)
1030c0e09200SDave Airlie #	define R300_FPITX_DST_SHIFT              6
1031c0e09200SDave Airlie #	define R300_FPITX_DST_MASK               (31 << 6)
1032c0e09200SDave Airlie #	define R300_FPITX_IMAGE_SHIFT            11
1033c0e09200SDave Airlie 	/* GUESS based on layout and native limits */
1034c0e09200SDave Airlie #       define R300_FPITX_IMAGE_MASK             (15 << 11)
1035c0e09200SDave Airlie /* Unsure if these are opcodes, or some kind of bitfield, but this is how
1036c0e09200SDave Airlie  * they were set when I checked
1037c0e09200SDave Airlie  */
1038c0e09200SDave Airlie #	define R300_FPITX_OPCODE_SHIFT		15
1039c0e09200SDave Airlie #		define R300_FPITX_OP_TEX	1
1040c0e09200SDave Airlie #		define R300_FPITX_OP_KIL	2
1041c0e09200SDave Airlie #		define R300_FPITX_OP_TXP	3
1042c0e09200SDave Airlie #		define R300_FPITX_OP_TXB	4
1043c0e09200SDave Airlie #	define R300_FPITX_OPCODE_MASK           (7 << 15)
1044c0e09200SDave Airlie 
1045c0e09200SDave Airlie /* ALU
1046c0e09200SDave Airlie  * The ALU instructions register blocks are enumerated according to the order
1047c0e09200SDave Airlie  * in which fglrx. I assume there is space for 64 instructions, since
1048c0e09200SDave Airlie  * each block has space for a maximum of 64 DWORDs, and this matches reported
1049c0e09200SDave Airlie  * native limits.
1050c0e09200SDave Airlie  *
1051c0e09200SDave Airlie  * The basic functional block seems to be one MAD for each color and alpha,
1052c0e09200SDave Airlie  * and an adder that adds all components after the MUL.
1053c0e09200SDave Airlie  *  - ADD, MUL, MAD etc.: use MAD with appropriate neutral operands
1054c0e09200SDave Airlie  *  - DP4: Use OUTC_DP4, OUTA_DP4
1055c0e09200SDave Airlie  *  - DP3: Use OUTC_DP3, OUTA_DP4, appropriate alpha operands
1056c0e09200SDave Airlie  *  - DPH: Use OUTC_DP4, OUTA_DP4, appropriate alpha operands
1057c0e09200SDave Airlie  *  - CMPH: If ARG2 > 0.5, return ARG0, else return ARG1
1058c0e09200SDave Airlie  *  - CMP: If ARG2 < 0, return ARG1, else return ARG0
1059c0e09200SDave Airlie  *  - FLR: use FRC+MAD
1060c0e09200SDave Airlie  *  - XPD: use MAD+MAD
1061c0e09200SDave Airlie  *  - SGE, SLT: use MAD+CMP
1062c0e09200SDave Airlie  *  - RSQ: use ABS modifier for argument
1063c0e09200SDave Airlie  *  - Use OUTC_REPL_ALPHA to write results of an alpha-only operation
1064c0e09200SDave Airlie  *    (e.g. RCP) into color register
1065c0e09200SDave Airlie  *  - apparently, there's no quick DST operation
1066c0e09200SDave Airlie  *  - fglrx set FPI2_UNKNOWN_31 on a "MAD fragment.color, tmp0, tmp1, tmp2"
1067c0e09200SDave Airlie  *  - fglrx set FPI2_UNKNOWN_31 on a "MAX r2, r1, c0"
1068c0e09200SDave Airlie  *  - fglrx once set FPI0_UNKNOWN_31 on a "FRC r1, r1"
1069c0e09200SDave Airlie  *
1070c0e09200SDave Airlie  * Operand selection
1071c0e09200SDave Airlie  * First stage selects three sources from the available registers and
1072c0e09200SDave Airlie  * constant parameters. This is defined in INSTR1 (color) and INSTR3 (alpha).
1073c0e09200SDave Airlie  * fglrx sorts the three source fields: Registers before constants,
1074c0e09200SDave Airlie  * lower indices before higher indices; I do not know whether this is
1075c0e09200SDave Airlie  * necessary.
1076c0e09200SDave Airlie  *
1077c0e09200SDave Airlie  * fglrx fills unused sources with "read constant 0"
1078c0e09200SDave Airlie  * According to specs, you cannot select more than two different constants.
1079c0e09200SDave Airlie  *
1080c0e09200SDave Airlie  * Second stage selects the operands from the sources. This is defined in
1081c0e09200SDave Airlie  * INSTR0 (color) and INSTR2 (alpha). You can also select the special constants
1082c0e09200SDave Airlie  * zero and one.
1083c0e09200SDave Airlie  * Swizzling and negation happens in this stage, as well.
1084c0e09200SDave Airlie  *
1085c0e09200SDave Airlie  * Important: Color and alpha seem to be mostly separate, i.e. their sources
1086c0e09200SDave Airlie  * selection appears to be fully independent (the register storage is probably
1087c0e09200SDave Airlie  * physically split into a color and an alpha section).
1088c0e09200SDave Airlie  * However (because of the apparent physical split), there is some interaction
1089c0e09200SDave Airlie  * WRT swizzling. If, for example, you want to load an R component into an
1090c0e09200SDave Airlie  * Alpha operand, this R component is taken from a *color* source, not from
1091c0e09200SDave Airlie  * an alpha source. The corresponding register doesn't even have to appear in
1092c0e09200SDave Airlie  * the alpha sources list. (I hope this all makes sense to you)
1093c0e09200SDave Airlie  *
1094c0e09200SDave Airlie  * Destination selection
1095c0e09200SDave Airlie  * The destination register index is in FPI1 (color) and FPI3 (alpha)
1096c0e09200SDave Airlie  * together with enable bits.
1097c0e09200SDave Airlie  * There are separate enable bits for writing into temporary registers
1098c0e09200SDave Airlie  * (DSTC_REG_* /DSTA_REG) and and program output registers (DSTC_OUTPUT_*
1099c0e09200SDave Airlie  * /DSTA_OUTPUT). You can write to both at once, or not write at all (the
1100c0e09200SDave Airlie  * same index must be used for both).
1101c0e09200SDave Airlie  *
1102c0e09200SDave Airlie  * Note: There is a special form for LRP
1103c0e09200SDave Airlie  *  - Argument order is the same as in ARB_fragment_program.
1104c0e09200SDave Airlie  *  - Operation is MAD
1105c0e09200SDave Airlie  *  - ARG1 is set to ARGC_SRC1C_LRP/ARGC_SRC1A_LRP
1106c0e09200SDave Airlie  *  - Set FPI0/FPI2_SPECIAL_LRP
1107c0e09200SDave Airlie  * Arbitrary LRP (including support for swizzling) requires vanilla MAD+MAD
1108c0e09200SDave Airlie  */
1109c0e09200SDave Airlie #define R300_PFS_INSTR1_0                   0x46C0
1110c0e09200SDave Airlie #       define R300_FPI1_SRC0C_SHIFT             0
1111c0e09200SDave Airlie #       define R300_FPI1_SRC0C_MASK              (31 << 0)
1112c0e09200SDave Airlie #       define R300_FPI1_SRC0C_CONST             (1 << 5)
1113c0e09200SDave Airlie #       define R300_FPI1_SRC1C_SHIFT             6
1114c0e09200SDave Airlie #       define R300_FPI1_SRC1C_MASK              (31 << 6)
1115c0e09200SDave Airlie #       define R300_FPI1_SRC1C_CONST             (1 << 11)
1116c0e09200SDave Airlie #       define R300_FPI1_SRC2C_SHIFT             12
1117c0e09200SDave Airlie #       define R300_FPI1_SRC2C_MASK              (31 << 12)
1118c0e09200SDave Airlie #       define R300_FPI1_SRC2C_CONST             (1 << 17)
1119c0e09200SDave Airlie #       define R300_FPI1_SRC_MASK                0x0003ffff
1120c0e09200SDave Airlie #       define R300_FPI1_DSTC_SHIFT              18
1121c0e09200SDave Airlie #       define R300_FPI1_DSTC_MASK               (31 << 18)
1122c0e09200SDave Airlie #		define R300_FPI1_DSTC_REG_MASK_SHIFT     23
1123c0e09200SDave Airlie #       define R300_FPI1_DSTC_REG_X              (1 << 23)
1124c0e09200SDave Airlie #       define R300_FPI1_DSTC_REG_Y              (1 << 24)
1125c0e09200SDave Airlie #       define R300_FPI1_DSTC_REG_Z              (1 << 25)
1126c0e09200SDave Airlie #		define R300_FPI1_DSTC_OUTPUT_MASK_SHIFT  26
1127c0e09200SDave Airlie #       define R300_FPI1_DSTC_OUTPUT_X           (1 << 26)
1128c0e09200SDave Airlie #       define R300_FPI1_DSTC_OUTPUT_Y           (1 << 27)
1129c0e09200SDave Airlie #       define R300_FPI1_DSTC_OUTPUT_Z           (1 << 28)
1130c0e09200SDave Airlie 
1131c0e09200SDave Airlie #define R300_PFS_INSTR3_0                   0x47C0
1132c0e09200SDave Airlie #       define R300_FPI3_SRC0A_SHIFT             0
1133c0e09200SDave Airlie #       define R300_FPI3_SRC0A_MASK              (31 << 0)
1134c0e09200SDave Airlie #       define R300_FPI3_SRC0A_CONST             (1 << 5)
1135c0e09200SDave Airlie #       define R300_FPI3_SRC1A_SHIFT             6
1136c0e09200SDave Airlie #       define R300_FPI3_SRC1A_MASK              (31 << 6)
1137c0e09200SDave Airlie #       define R300_FPI3_SRC1A_CONST             (1 << 11)
1138c0e09200SDave Airlie #       define R300_FPI3_SRC2A_SHIFT             12
1139c0e09200SDave Airlie #       define R300_FPI3_SRC2A_MASK              (31 << 12)
1140c0e09200SDave Airlie #       define R300_FPI3_SRC2A_CONST             (1 << 17)
1141c0e09200SDave Airlie #       define R300_FPI3_SRC_MASK                0x0003ffff
1142c0e09200SDave Airlie #       define R300_FPI3_DSTA_SHIFT              18
1143c0e09200SDave Airlie #       define R300_FPI3_DSTA_MASK               (31 << 18)
1144c0e09200SDave Airlie #       define R300_FPI3_DSTA_REG                (1 << 23)
1145c0e09200SDave Airlie #       define R300_FPI3_DSTA_OUTPUT             (1 << 24)
1146c0e09200SDave Airlie #		define R300_FPI3_DSTA_DEPTH              (1 << 27)
1147c0e09200SDave Airlie 
1148c0e09200SDave Airlie #define R300_PFS_INSTR0_0                   0x48C0
1149c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC0C_XYZ          0
1150c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC0C_XXX          1
1151c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC0C_YYY          2
1152c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC0C_ZZZ          3
1153c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC1C_XYZ          4
1154c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC1C_XXX          5
1155c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC1C_YYY          6
1156c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC1C_ZZZ          7
1157c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC2C_XYZ          8
1158c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC2C_XXX          9
1159c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC2C_YYY          10
1160c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC2C_ZZZ          11
1161c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC0A              12
1162c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC1A              13
1163c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC2A              14
1164c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC1C_LRP          15
1165c0e09200SDave Airlie #       define R300_FPI0_ARGC_ZERO               20
1166c0e09200SDave Airlie #       define R300_FPI0_ARGC_ONE                21
1167c0e09200SDave Airlie 	/* GUESS */
1168c0e09200SDave Airlie #       define R300_FPI0_ARGC_HALF               22
1169c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC0C_YZX          23
1170c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC1C_YZX          24
1171c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC2C_YZX          25
1172c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC0C_ZXY          26
1173c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC1C_ZXY          27
1174c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC2C_ZXY          28
1175c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC0CA_WZY         29
1176c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC1CA_WZY         30
1177c0e09200SDave Airlie #       define R300_FPI0_ARGC_SRC2CA_WZY         31
1178c0e09200SDave Airlie 
1179c0e09200SDave Airlie #       define R300_FPI0_ARG0C_SHIFT             0
1180c0e09200SDave Airlie #       define R300_FPI0_ARG0C_MASK              (31 << 0)
1181c0e09200SDave Airlie #       define R300_FPI0_ARG0C_NEG               (1 << 5)
1182c0e09200SDave Airlie #       define R300_FPI0_ARG0C_ABS               (1 << 6)
1183c0e09200SDave Airlie #       define R300_FPI0_ARG1C_SHIFT             7
1184c0e09200SDave Airlie #       define R300_FPI0_ARG1C_MASK              (31 << 7)
1185c0e09200SDave Airlie #       define R300_FPI0_ARG1C_NEG               (1 << 12)
1186c0e09200SDave Airlie #       define R300_FPI0_ARG1C_ABS               (1 << 13)
1187c0e09200SDave Airlie #       define R300_FPI0_ARG2C_SHIFT             14
1188c0e09200SDave Airlie #       define R300_FPI0_ARG2C_MASK              (31 << 14)
1189c0e09200SDave Airlie #       define R300_FPI0_ARG2C_NEG               (1 << 19)
1190c0e09200SDave Airlie #       define R300_FPI0_ARG2C_ABS               (1 << 20)
1191c0e09200SDave Airlie #       define R300_FPI0_SPECIAL_LRP             (1 << 21)
1192c0e09200SDave Airlie #       define R300_FPI0_OUTC_MAD                (0 << 23)
1193c0e09200SDave Airlie #       define R300_FPI0_OUTC_DP3                (1 << 23)
1194c0e09200SDave Airlie #       define R300_FPI0_OUTC_DP4                (2 << 23)
1195c0e09200SDave Airlie #       define R300_FPI0_OUTC_MIN                (4 << 23)
1196c0e09200SDave Airlie #       define R300_FPI0_OUTC_MAX                (5 << 23)
1197c0e09200SDave Airlie #       define R300_FPI0_OUTC_CMPH               (7 << 23)
1198c0e09200SDave Airlie #       define R300_FPI0_OUTC_CMP                (8 << 23)
1199c0e09200SDave Airlie #       define R300_FPI0_OUTC_FRC                (9 << 23)
1200c0e09200SDave Airlie #       define R300_FPI0_OUTC_REPL_ALPHA         (10 << 23)
1201c0e09200SDave Airlie #       define R300_FPI0_OUTC_SAT                (1 << 30)
1202c0e09200SDave Airlie #       define R300_FPI0_INSERT_NOP              (1 << 31)
1203c0e09200SDave Airlie 
1204c0e09200SDave Airlie #define R300_PFS_INSTR2_0                   0x49C0
1205c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC0C_X            0
1206c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC0C_Y            1
1207c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC0C_Z            2
1208c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC1C_X            3
1209c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC1C_Y            4
1210c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC1C_Z            5
1211c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC2C_X            6
1212c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC2C_Y            7
1213c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC2C_Z            8
1214c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC0A              9
1215c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC1A              10
1216c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC2A              11
1217c0e09200SDave Airlie #       define R300_FPI2_ARGA_SRC1A_LRP          15
1218c0e09200SDave Airlie #       define R300_FPI2_ARGA_ZERO               16
1219c0e09200SDave Airlie #       define R300_FPI2_ARGA_ONE                17
1220c0e09200SDave Airlie 	/* GUESS */
1221c0e09200SDave Airlie #       define R300_FPI2_ARGA_HALF               18
1222c0e09200SDave Airlie #       define R300_FPI2_ARG0A_SHIFT             0
1223c0e09200SDave Airlie #       define R300_FPI2_ARG0A_MASK              (31 << 0)
1224c0e09200SDave Airlie #       define R300_FPI2_ARG0A_NEG               (1 << 5)
1225c0e09200SDave Airlie 	/* GUESS */
1226c0e09200SDave Airlie #	define R300_FPI2_ARG0A_ABS		 (1 << 6)
1227c0e09200SDave Airlie #       define R300_FPI2_ARG1A_SHIFT             7
1228c0e09200SDave Airlie #       define R300_FPI2_ARG1A_MASK              (31 << 7)
1229c0e09200SDave Airlie #       define R300_FPI2_ARG1A_NEG               (1 << 12)
1230c0e09200SDave Airlie 	/* GUESS */
1231c0e09200SDave Airlie #	define R300_FPI2_ARG1A_ABS		 (1 << 13)
1232c0e09200SDave Airlie #       define R300_FPI2_ARG2A_SHIFT             14
1233c0e09200SDave Airlie #       define R300_FPI2_ARG2A_MASK              (31 << 14)
1234c0e09200SDave Airlie #       define R300_FPI2_ARG2A_NEG               (1 << 19)
1235c0e09200SDave Airlie 	/* GUESS */
1236c0e09200SDave Airlie #	define R300_FPI2_ARG2A_ABS		 (1 << 20)
1237c0e09200SDave Airlie #       define R300_FPI2_SPECIAL_LRP             (1 << 21)
1238c0e09200SDave Airlie #       define R300_FPI2_OUTA_MAD                (0 << 23)
1239c0e09200SDave Airlie #       define R300_FPI2_OUTA_DP4                (1 << 23)
1240c0e09200SDave Airlie #       define R300_FPI2_OUTA_MIN                (2 << 23)
1241c0e09200SDave Airlie #       define R300_FPI2_OUTA_MAX                (3 << 23)
1242c0e09200SDave Airlie #       define R300_FPI2_OUTA_CMP                (6 << 23)
1243c0e09200SDave Airlie #       define R300_FPI2_OUTA_FRC                (7 << 23)
1244c0e09200SDave Airlie #       define R300_FPI2_OUTA_EX2                (8 << 23)
1245c0e09200SDave Airlie #       define R300_FPI2_OUTA_LG2                (9 << 23)
1246c0e09200SDave Airlie #       define R300_FPI2_OUTA_RCP                (10 << 23)
1247c0e09200SDave Airlie #       define R300_FPI2_OUTA_RSQ                (11 << 23)
1248c0e09200SDave Airlie #       define R300_FPI2_OUTA_SAT                (1 << 30)
1249c0e09200SDave Airlie #       define R300_FPI2_UNKNOWN_31              (1 << 31)
1250c0e09200SDave Airlie /* END: Fragment program instruction set */
1251c0e09200SDave Airlie 
1252c0e09200SDave Airlie /* Fog state and color */
1253c0e09200SDave Airlie #define R300_RE_FOG_STATE                   0x4BC0
1254c0e09200SDave Airlie #       define R300_FOG_ENABLE                   (1 << 0)
1255c0e09200SDave Airlie #	define R300_FOG_MODE_LINEAR              (0 << 1)
1256c0e09200SDave Airlie #	define R300_FOG_MODE_EXP                 (1 << 1)
1257c0e09200SDave Airlie #	define R300_FOG_MODE_EXP2                (2 << 1)
1258c0e09200SDave Airlie #	define R300_FOG_MODE_MASK                (3 << 1)
1259c0e09200SDave Airlie #define R300_FOG_COLOR_R                    0x4BC8
1260c0e09200SDave Airlie #define R300_FOG_COLOR_G                    0x4BCC
1261c0e09200SDave Airlie #define R300_FOG_COLOR_B                    0x4BD0
1262c0e09200SDave Airlie 
1263c0e09200SDave Airlie #define R300_PP_ALPHA_TEST                  0x4BD4
1264c0e09200SDave Airlie #       define R300_REF_ALPHA_MASK               0x000000ff
1265c0e09200SDave Airlie #       define R300_ALPHA_TEST_FAIL              (0 << 8)
1266c0e09200SDave Airlie #       define R300_ALPHA_TEST_LESS              (1 << 8)
1267c0e09200SDave Airlie #       define R300_ALPHA_TEST_LEQUAL            (3 << 8)
1268c0e09200SDave Airlie #       define R300_ALPHA_TEST_EQUAL             (2 << 8)
1269c0e09200SDave Airlie #       define R300_ALPHA_TEST_GEQUAL            (6 << 8)
1270c0e09200SDave Airlie #       define R300_ALPHA_TEST_GREATER           (4 << 8)
1271c0e09200SDave Airlie #       define R300_ALPHA_TEST_NEQUAL            (5 << 8)
1272c0e09200SDave Airlie #       define R300_ALPHA_TEST_PASS              (7 << 8)
1273c0e09200SDave Airlie #       define R300_ALPHA_TEST_OP_MASK           (7 << 8)
1274c0e09200SDave Airlie #       define R300_ALPHA_TEST_ENABLE            (1 << 11)
1275c0e09200SDave Airlie 
1276c0e09200SDave Airlie /* gap */
1277c0e09200SDave Airlie 
1278c0e09200SDave Airlie /* Fragment program parameters in 7.16 floating point */
1279c0e09200SDave Airlie #define R300_PFS_PARAM_0_X                  0x4C00
1280c0e09200SDave Airlie #define R300_PFS_PARAM_0_Y                  0x4C04
1281c0e09200SDave Airlie #define R300_PFS_PARAM_0_Z                  0x4C08
1282c0e09200SDave Airlie #define R300_PFS_PARAM_0_W                  0x4C0C
1283c0e09200SDave Airlie /* GUESS: PARAM_31 is last, based on native limits reported by fglrx */
1284c0e09200SDave Airlie #define R300_PFS_PARAM_31_X                 0x4DF0
1285c0e09200SDave Airlie #define R300_PFS_PARAM_31_Y                 0x4DF4
1286c0e09200SDave Airlie #define R300_PFS_PARAM_31_Z                 0x4DF8
1287c0e09200SDave Airlie #define R300_PFS_PARAM_31_W                 0x4DFC
1288c0e09200SDave Airlie 
1289c0e09200SDave Airlie /* Notes:
1290c0e09200SDave Airlie  * - AFAIK fglrx always sets BLEND_UNKNOWN when blending is used in
1291c0e09200SDave Airlie  *   the application
1292c0e09200SDave Airlie  * - AFAIK fglrx always sets BLEND_NO_SEPARATE when CBLEND and ABLEND
1293c0e09200SDave Airlie  *    are set to the same
1294c0e09200SDave Airlie  *   function (both registers are always set up completely in any case)
1295c0e09200SDave Airlie  * - Most blend flags are simply copied from R200 and not tested yet
1296c0e09200SDave Airlie  */
1297c0e09200SDave Airlie #define R300_RB3D_CBLEND                    0x4E04
1298c0e09200SDave Airlie #define R300_RB3D_ABLEND                    0x4E08
1299c0e09200SDave Airlie /* the following only appear in CBLEND */
1300c0e09200SDave Airlie #       define R300_BLEND_ENABLE                     (1 << 0)
1301c0e09200SDave Airlie #       define R300_BLEND_UNKNOWN                    (3 << 1)
1302c0e09200SDave Airlie #       define R300_BLEND_NO_SEPARATE                (1 << 3)
1303c0e09200SDave Airlie /* the following are shared between CBLEND and ABLEND */
1304c0e09200SDave Airlie #       define R300_FCN_MASK                         (3  << 12)
1305c0e09200SDave Airlie #       define R300_COMB_FCN_ADD_CLAMP               (0  << 12)
1306c0e09200SDave Airlie #       define R300_COMB_FCN_ADD_NOCLAMP             (1  << 12)
1307c0e09200SDave Airlie #       define R300_COMB_FCN_SUB_CLAMP               (2  << 12)
1308c0e09200SDave Airlie #       define R300_COMB_FCN_SUB_NOCLAMP             (3  << 12)
1309c0e09200SDave Airlie #       define R300_COMB_FCN_MIN                     (4  << 12)
1310c0e09200SDave Airlie #       define R300_COMB_FCN_MAX                     (5  << 12)
1311c0e09200SDave Airlie #       define R300_COMB_FCN_RSUB_CLAMP              (6  << 12)
1312c0e09200SDave Airlie #       define R300_COMB_FCN_RSUB_NOCLAMP            (7  << 12)
1313c0e09200SDave Airlie #       define R300_BLEND_GL_ZERO                    (32)
1314c0e09200SDave Airlie #       define R300_BLEND_GL_ONE                     (33)
1315c0e09200SDave Airlie #       define R300_BLEND_GL_SRC_COLOR               (34)
1316c0e09200SDave Airlie #       define R300_BLEND_GL_ONE_MINUS_SRC_COLOR     (35)
1317c0e09200SDave Airlie #       define R300_BLEND_GL_DST_COLOR               (36)
1318c0e09200SDave Airlie #       define R300_BLEND_GL_ONE_MINUS_DST_COLOR     (37)
1319c0e09200SDave Airlie #       define R300_BLEND_GL_SRC_ALPHA               (38)
1320c0e09200SDave Airlie #       define R300_BLEND_GL_ONE_MINUS_SRC_ALPHA     (39)
1321c0e09200SDave Airlie #       define R300_BLEND_GL_DST_ALPHA               (40)
1322c0e09200SDave Airlie #       define R300_BLEND_GL_ONE_MINUS_DST_ALPHA     (41)
1323c0e09200SDave Airlie #       define R300_BLEND_GL_SRC_ALPHA_SATURATE      (42)
1324c0e09200SDave Airlie #       define R300_BLEND_GL_CONST_COLOR             (43)
1325c0e09200SDave Airlie #       define R300_BLEND_GL_ONE_MINUS_CONST_COLOR   (44)
1326c0e09200SDave Airlie #       define R300_BLEND_GL_CONST_ALPHA             (45)
1327c0e09200SDave Airlie #       define R300_BLEND_GL_ONE_MINUS_CONST_ALPHA   (46)
1328c0e09200SDave Airlie #       define R300_BLEND_MASK                       (63)
1329c0e09200SDave Airlie #       define R300_SRC_BLEND_SHIFT                  (16)
1330c0e09200SDave Airlie #       define R300_DST_BLEND_SHIFT                  (24)
1331c0e09200SDave Airlie #define R300_RB3D_BLEND_COLOR               0x4E10
1332c0e09200SDave Airlie #define R300_RB3D_COLORMASK                 0x4E0C
1333c0e09200SDave Airlie #       define R300_COLORMASK0_B                 (1<<0)
1334c0e09200SDave Airlie #       define R300_COLORMASK0_G                 (1<<1)
1335c0e09200SDave Airlie #       define R300_COLORMASK0_R                 (1<<2)
1336c0e09200SDave Airlie #       define R300_COLORMASK0_A                 (1<<3)
1337c0e09200SDave Airlie 
1338c0e09200SDave Airlie /* gap */
1339c0e09200SDave Airlie 
1340c0e09200SDave Airlie #define R300_RB3D_COLOROFFSET0              0x4E28
1341c0e09200SDave Airlie #       define R300_COLOROFFSET_MASK             0xFFFFFFF0 /* GUESS */
1342c0e09200SDave Airlie #define R300_RB3D_COLOROFFSET1              0x4E2C /* GUESS */
1343c0e09200SDave Airlie #define R300_RB3D_COLOROFFSET2              0x4E30 /* GUESS */
1344c0e09200SDave Airlie #define R300_RB3D_COLOROFFSET3              0x4E34 /* GUESS */
1345c0e09200SDave Airlie 
1346c0e09200SDave Airlie /* gap */
1347c0e09200SDave Airlie 
1348c0e09200SDave Airlie /* Bit 16: Larger tiles
1349c0e09200SDave Airlie  * Bit 17: 4x2 tiles
1350c0e09200SDave Airlie  * Bit 18: Extremely weird tile like, but some pixels duplicated?
1351c0e09200SDave Airlie  */
1352c0e09200SDave Airlie #define R300_RB3D_COLORPITCH0               0x4E38
1353c0e09200SDave Airlie #       define R300_COLORPITCH_MASK              0x00001FF8 /* GUESS */
1354c0e09200SDave Airlie #       define R300_COLOR_TILE_ENABLE            (1 << 16) /* GUESS */
1355c0e09200SDave Airlie #       define R300_COLOR_MICROTILE_ENABLE       (1 << 17) /* GUESS */
1356c0e09200SDave Airlie #       define R300_COLOR_ENDIAN_NO_SWAP         (0 << 18) /* GUESS */
1357c0e09200SDave Airlie #       define R300_COLOR_ENDIAN_WORD_SWAP       (1 << 18) /* GUESS */
1358c0e09200SDave Airlie #       define R300_COLOR_ENDIAN_DWORD_SWAP      (2 << 18) /* GUESS */
1359c0e09200SDave Airlie #       define R300_COLOR_FORMAT_RGB565          (2 << 22)
1360c0e09200SDave Airlie #       define R300_COLOR_FORMAT_ARGB8888        (3 << 22)
1361c0e09200SDave Airlie #define R300_RB3D_COLORPITCH1               0x4E3C /* GUESS */
1362c0e09200SDave Airlie #define R300_RB3D_COLORPITCH2               0x4E40 /* GUESS */
1363c0e09200SDave Airlie #define R300_RB3D_COLORPITCH3               0x4E44 /* GUESS */
1364c0e09200SDave Airlie 
1365*54f961a6SJerome Glisse #define R300_RB3D_AARESOLVE_CTL             0x4E88
1366c0e09200SDave Airlie /* gap */
1367c0e09200SDave Airlie 
1368c0e09200SDave Airlie /* Guess by Vladimir.
1369c0e09200SDave Airlie  * Set to 0A before 3D operations, set to 02 afterwards.
1370c0e09200SDave Airlie  */
1371c0e09200SDave Airlie /*#define R300_RB3D_DSTCACHE_CTLSTAT          0x4E4C*/
1372c0e09200SDave Airlie #       define R300_RB3D_DSTCACHE_UNKNOWN_02             0x00000002
1373c0e09200SDave Airlie #       define R300_RB3D_DSTCACHE_UNKNOWN_0A             0x0000000A
1374c0e09200SDave Airlie 
1375c0e09200SDave Airlie /* gap */
1376c0e09200SDave Airlie /* There seems to be no "write only" setting, so use Z-test = ALWAYS
1377c0e09200SDave Airlie  * for this.
1378c0e09200SDave Airlie  * Bit (1<<8) is the "test" bit. so plain write is 6  - vd
1379c0e09200SDave Airlie  */
1380c0e09200SDave Airlie #define R300_ZB_CNTL                             0x4F00
1381c0e09200SDave Airlie #	define R300_STENCIL_ENABLE		 (1 << 0)
1382c0e09200SDave Airlie #	define R300_Z_ENABLE		         (1 << 1)
1383c0e09200SDave Airlie #	define R300_Z_WRITE_ENABLE		 (1 << 2)
1384c0e09200SDave Airlie #	define R300_Z_SIGNED_COMPARE		 (1 << 3)
1385c0e09200SDave Airlie #	define R300_STENCIL_FRONT_BACK		 (1 << 4)
1386c0e09200SDave Airlie 
1387c0e09200SDave Airlie #define R300_ZB_ZSTENCILCNTL                   0x4f04
1388c0e09200SDave Airlie 	/* functions */
1389c0e09200SDave Airlie #	define R300_ZS_NEVER			0
1390c0e09200SDave Airlie #	define R300_ZS_LESS			1
1391c0e09200SDave Airlie #	define R300_ZS_LEQUAL			2
1392c0e09200SDave Airlie #	define R300_ZS_EQUAL			3
1393c0e09200SDave Airlie #	define R300_ZS_GEQUAL			4
1394c0e09200SDave Airlie #	define R300_ZS_GREATER			5
1395c0e09200SDave Airlie #	define R300_ZS_NOTEQUAL			6
1396c0e09200SDave Airlie #	define R300_ZS_ALWAYS			7
1397c0e09200SDave Airlie #       define R300_ZS_MASK                     7
1398c0e09200SDave Airlie 	/* operations */
1399c0e09200SDave Airlie #	define R300_ZS_KEEP			0
1400c0e09200SDave Airlie #	define R300_ZS_ZERO			1
1401c0e09200SDave Airlie #	define R300_ZS_REPLACE			2
1402c0e09200SDave Airlie #	define R300_ZS_INCR			3
1403c0e09200SDave Airlie #	define R300_ZS_DECR			4
1404c0e09200SDave Airlie #	define R300_ZS_INVERT			5
1405c0e09200SDave Airlie #	define R300_ZS_INCR_WRAP		6
1406c0e09200SDave Airlie #	define R300_ZS_DECR_WRAP		7
1407c0e09200SDave Airlie #	define R300_Z_FUNC_SHIFT		0
1408c0e09200SDave Airlie 	/* front and back refer to operations done for front
1409c0e09200SDave Airlie 	   and back faces, i.e. separate stencil function support */
1410c0e09200SDave Airlie #	define R300_S_FRONT_FUNC_SHIFT	        3
1411c0e09200SDave Airlie #	define R300_S_FRONT_SFAIL_OP_SHIFT	6
1412c0e09200SDave Airlie #	define R300_S_FRONT_ZPASS_OP_SHIFT	9
1413c0e09200SDave Airlie #	define R300_S_FRONT_ZFAIL_OP_SHIFT      12
1414c0e09200SDave Airlie #	define R300_S_BACK_FUNC_SHIFT           15
1415c0e09200SDave Airlie #	define R300_S_BACK_SFAIL_OP_SHIFT       18
1416c0e09200SDave Airlie #	define R300_S_BACK_ZPASS_OP_SHIFT       21
1417c0e09200SDave Airlie #	define R300_S_BACK_ZFAIL_OP_SHIFT       24
1418c0e09200SDave Airlie 
1419c0e09200SDave Airlie #define R300_ZB_STENCILREFMASK                        0x4f08
1420c0e09200SDave Airlie #	define R300_STENCILREF_SHIFT       0
1421c0e09200SDave Airlie #	define R300_STENCILREF_MASK        0x000000ff
1422c0e09200SDave Airlie #	define R300_STENCILMASK_SHIFT      8
1423c0e09200SDave Airlie #	define R300_STENCILMASK_MASK       0x0000ff00
1424c0e09200SDave Airlie #	define R300_STENCILWRITEMASK_SHIFT 16
1425c0e09200SDave Airlie #	define R300_STENCILWRITEMASK_MASK  0x00ff0000
1426c0e09200SDave Airlie 
1427c0e09200SDave Airlie /* gap */
1428c0e09200SDave Airlie 
1429c0e09200SDave Airlie #define R300_ZB_FORMAT                             0x4f10
1430c0e09200SDave Airlie #	define R300_DEPTHFORMAT_16BIT_INT_Z   (0 << 0)
1431c0e09200SDave Airlie #	define R300_DEPTHFORMAT_16BIT_13E3    (1 << 0)
1432c0e09200SDave Airlie #	define R300_DEPTHFORMAT_24BIT_INT_Z_8BIT_STENCIL   (2 << 0)
1433c0e09200SDave Airlie /* reserved up to (15 << 0) */
1434c0e09200SDave Airlie #	define R300_INVERT_13E3_LEADING_ONES  (0 << 4)
1435c0e09200SDave Airlie #	define R300_INVERT_13E3_LEADING_ZEROS (1 << 4)
1436c0e09200SDave Airlie 
1437c0e09200SDave Airlie #define R300_ZB_ZTOP                             0x4F14
1438c0e09200SDave Airlie #	define R300_ZTOP_DISABLE                 (0 << 0)
1439c0e09200SDave Airlie #	define R300_ZTOP_ENABLE                  (1 << 0)
1440c0e09200SDave Airlie 
1441c0e09200SDave Airlie /* gap */
1442c0e09200SDave Airlie 
1443c0e09200SDave Airlie #define R300_ZB_ZCACHE_CTLSTAT            0x4f18
1444c0e09200SDave Airlie #       define R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_NO_EFFECT      (0 << 0)
1445c0e09200SDave Airlie #       define R300_ZB_ZCACHE_CTLSTAT_ZC_FLUSH_FLUSH_AND_FREE (1 << 0)
1446c0e09200SDave Airlie #       define R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_NO_EFFECT       (0 << 1)
1447c0e09200SDave Airlie #       define R300_ZB_ZCACHE_CTLSTAT_ZC_FREE_FREE            (1 << 1)
1448c0e09200SDave Airlie #       define R300_ZB_ZCACHE_CTLSTAT_ZC_BUSY_IDLE            (0 << 31)
1449c0e09200SDave Airlie #       define R300_ZB_ZCACHE_CTLSTAT_ZC_BUSY_BUSY            (1 << 31)
1450c0e09200SDave Airlie 
1451c0e09200SDave Airlie #define R300_ZB_BW_CNTL                     0x4f1c
1452c0e09200SDave Airlie #	define R300_HIZ_DISABLE                              (0 << 0)
1453c0e09200SDave Airlie #	define R300_HIZ_ENABLE                               (1 << 0)
1454c0e09200SDave Airlie #	define R300_HIZ_MIN                                  (0 << 1)
1455c0e09200SDave Airlie #	define R300_HIZ_MAX                                  (1 << 1)
1456c0e09200SDave Airlie #	define R300_FAST_FILL_DISABLE                        (0 << 2)
1457c0e09200SDave Airlie #	define R300_FAST_FILL_ENABLE                         (1 << 2)
1458c0e09200SDave Airlie #	define R300_RD_COMP_DISABLE                          (0 << 3)
1459c0e09200SDave Airlie #	define R300_RD_COMP_ENABLE                           (1 << 3)
1460c0e09200SDave Airlie #	define R300_WR_COMP_DISABLE                          (0 << 4)
1461c0e09200SDave Airlie #	define R300_WR_COMP_ENABLE                           (1 << 4)
1462c0e09200SDave Airlie #	define R300_ZB_CB_CLEAR_RMW                          (0 << 5)
1463c0e09200SDave Airlie #	define R300_ZB_CB_CLEAR_CACHE_LINEAR                 (1 << 5)
1464c0e09200SDave Airlie #	define R300_FORCE_COMPRESSED_STENCIL_VALUE_DISABLE   (0 << 6)
1465c0e09200SDave Airlie #	define R300_FORCE_COMPRESSED_STENCIL_VALUE_ENABLE    (1 << 6)
1466c0e09200SDave Airlie 
1467c0e09200SDave Airlie #	define R500_ZEQUAL_OPTIMIZE_ENABLE                   (0 << 7)
1468c0e09200SDave Airlie #	define R500_ZEQUAL_OPTIMIZE_DISABLE                  (1 << 7)
1469c0e09200SDave Airlie #	define R500_SEQUAL_OPTIMIZE_ENABLE                   (0 << 8)
1470c0e09200SDave Airlie #	define R500_SEQUAL_OPTIMIZE_DISABLE                  (1 << 8)
1471c0e09200SDave Airlie 
1472c0e09200SDave Airlie #	define R500_BMASK_ENABLE                             (0 << 10)
1473c0e09200SDave Airlie #	define R500_BMASK_DISABLE                            (1 << 10)
1474c0e09200SDave Airlie #	define R500_HIZ_EQUAL_REJECT_DISABLE                 (0 << 11)
1475c0e09200SDave Airlie #	define R500_HIZ_EQUAL_REJECT_ENABLE                  (1 << 11)
1476c0e09200SDave Airlie #	define R500_HIZ_FP_EXP_BITS_DISABLE                  (0 << 12)
1477c0e09200SDave Airlie #	define R500_HIZ_FP_EXP_BITS_1                        (1 << 12)
1478c0e09200SDave Airlie #	define R500_HIZ_FP_EXP_BITS_2                        (2 << 12)
1479c0e09200SDave Airlie #	define R500_HIZ_FP_EXP_BITS_3                        (3 << 12)
1480c0e09200SDave Airlie #	define R500_HIZ_FP_EXP_BITS_4                        (4 << 12)
1481c0e09200SDave Airlie #	define R500_HIZ_FP_EXP_BITS_5                        (5 << 12)
1482c0e09200SDave Airlie #	define R500_HIZ_FP_INVERT_LEADING_ONES               (0 << 15)
1483c0e09200SDave Airlie #	define R500_HIZ_FP_INVERT_LEADING_ZEROS              (1 << 15)
1484c0e09200SDave Airlie #	define R500_TILE_OVERWRITE_RECOMPRESSION_ENABLE      (0 << 16)
1485c0e09200SDave Airlie #	define R500_TILE_OVERWRITE_RECOMPRESSION_DISABLE     (1 << 16)
1486c0e09200SDave Airlie #	define R500_CONTIGUOUS_6XAA_SAMPLES_ENABLE           (0 << 17)
1487c0e09200SDave Airlie #	define R500_CONTIGUOUS_6XAA_SAMPLES_DISABLE          (1 << 17)
1488c0e09200SDave Airlie #	define R500_PEQ_PACKING_DISABLE                      (0 << 18)
1489c0e09200SDave Airlie #	define R500_PEQ_PACKING_ENABLE                       (1 << 18)
1490c0e09200SDave Airlie #	define R500_COVERED_PTR_MASKING_DISABLE              (0 << 18)
1491c0e09200SDave Airlie #	define R500_COVERED_PTR_MASKING_ENABLE               (1 << 18)
1492c0e09200SDave Airlie 
1493c0e09200SDave Airlie 
1494c0e09200SDave Airlie /* gap */
1495c0e09200SDave Airlie 
1496c0e09200SDave Airlie /* Z Buffer Address Offset.
1497c0e09200SDave Airlie  * Bits 31 to 5 are used for aligned Z buffer address offset for macro tiles.
1498c0e09200SDave Airlie  */
1499c0e09200SDave Airlie #define R300_ZB_DEPTHOFFSET               0x4f20
1500c0e09200SDave Airlie 
1501c0e09200SDave Airlie /* Z Buffer Pitch and Endian Control */
1502c0e09200SDave Airlie #define R300_ZB_DEPTHPITCH                0x4f24
1503c0e09200SDave Airlie #       define R300_DEPTHPITCH_MASK              0x00003FFC
1504c0e09200SDave Airlie #       define R300_DEPTHMACROTILE_DISABLE      (0 << 16)
1505c0e09200SDave Airlie #       define R300_DEPTHMACROTILE_ENABLE       (1 << 16)
1506c0e09200SDave Airlie #       define R300_DEPTHMICROTILE_LINEAR       (0 << 17)
1507c0e09200SDave Airlie #       define R300_DEPTHMICROTILE_TILED        (1 << 17)
1508c0e09200SDave Airlie #       define R300_DEPTHMICROTILE_TILED_SQUARE (2 << 17)
1509c0e09200SDave Airlie #       define R300_DEPTHENDIAN_NO_SWAP         (0 << 18)
1510c0e09200SDave Airlie #       define R300_DEPTHENDIAN_WORD_SWAP       (1 << 18)
1511c0e09200SDave Airlie #       define R300_DEPTHENDIAN_DWORD_SWAP      (2 << 18)
1512c0e09200SDave Airlie #       define R300_DEPTHENDIAN_HALF_DWORD_SWAP (3 << 18)
1513c0e09200SDave Airlie 
1514c0e09200SDave Airlie /* Z Buffer Clear Value */
1515c0e09200SDave Airlie #define R300_ZB_DEPTHCLEARVALUE                  0x4f28
1516c0e09200SDave Airlie 
1517c0e09200SDave Airlie #define R300_ZB_ZMASK_OFFSET			 0x4f30
1518c0e09200SDave Airlie #define R300_ZB_ZMASK_PITCH			 0x4f34
1519c0e09200SDave Airlie #define R300_ZB_ZMASK_WRINDEX			 0x4f38
1520c0e09200SDave Airlie #define R300_ZB_ZMASK_DWORD			 0x4f3c
1521c0e09200SDave Airlie #define R300_ZB_ZMASK_RDINDEX			 0x4f40
1522c0e09200SDave Airlie 
1523c0e09200SDave Airlie /* Hierarchical Z Memory Offset */
1524c0e09200SDave Airlie #define R300_ZB_HIZ_OFFSET                       0x4f44
1525c0e09200SDave Airlie 
1526c0e09200SDave Airlie /* Hierarchical Z Write Index */
1527c0e09200SDave Airlie #define R300_ZB_HIZ_WRINDEX                      0x4f48
1528c0e09200SDave Airlie 
1529c0e09200SDave Airlie /* Hierarchical Z Data */
1530c0e09200SDave Airlie #define R300_ZB_HIZ_DWORD                        0x4f4c
1531c0e09200SDave Airlie 
1532c0e09200SDave Airlie /* Hierarchical Z Read Index */
1533c0e09200SDave Airlie #define R300_ZB_HIZ_RDINDEX                      0x4f50
1534c0e09200SDave Airlie 
1535c0e09200SDave Airlie /* Hierarchical Z Pitch */
1536c0e09200SDave Airlie #define R300_ZB_HIZ_PITCH                        0x4f54
1537c0e09200SDave Airlie 
1538c0e09200SDave Airlie /* Z Buffer Z Pass Counter Data */
1539c0e09200SDave Airlie #define R300_ZB_ZPASS_DATA                       0x4f58
1540c0e09200SDave Airlie 
1541c0e09200SDave Airlie /* Z Buffer Z Pass Counter Address */
1542c0e09200SDave Airlie #define R300_ZB_ZPASS_ADDR                       0x4f5c
1543c0e09200SDave Airlie 
1544c0e09200SDave Airlie /* Depth buffer X and Y coordinate offset */
1545c0e09200SDave Airlie #define R300_ZB_DEPTHXY_OFFSET                   0x4f60
1546c0e09200SDave Airlie #	define R300_DEPTHX_OFFSET_SHIFT  1
1547c0e09200SDave Airlie #	define R300_DEPTHX_OFFSET_MASK   0x000007FE
1548c0e09200SDave Airlie #	define R300_DEPTHY_OFFSET_SHIFT  17
1549c0e09200SDave Airlie #	define R300_DEPTHY_OFFSET_MASK   0x07FE0000
1550c0e09200SDave Airlie 
1551c0e09200SDave Airlie /* Sets the fifo sizes */
1552c0e09200SDave Airlie #define R500_ZB_FIFO_SIZE                        0x4fd0
1553c0e09200SDave Airlie #	define R500_OP_FIFO_SIZE_FULL   (0 << 0)
1554c0e09200SDave Airlie #	define R500_OP_FIFO_SIZE_HALF   (1 << 0)
1555c0e09200SDave Airlie #	define R500_OP_FIFO_SIZE_QUATER (2 << 0)
1556c0e09200SDave Airlie #	define R500_OP_FIFO_SIZE_EIGTHS (4 << 0)
1557c0e09200SDave Airlie 
1558c0e09200SDave Airlie /* Stencil Reference Value and Mask for backfacing quads */
1559c0e09200SDave Airlie /* R300_ZB_STENCILREFMASK handles front face */
1560c0e09200SDave Airlie #define R500_ZB_STENCILREFMASK_BF                0x4fd4
1561c0e09200SDave Airlie #	define R500_STENCILREF_SHIFT       0
1562c0e09200SDave Airlie #	define R500_STENCILREF_MASK        0x000000ff
1563c0e09200SDave Airlie #	define R500_STENCILMASK_SHIFT      8
1564c0e09200SDave Airlie #	define R500_STENCILMASK_MASK       0x0000ff00
1565c0e09200SDave Airlie #	define R500_STENCILWRITEMASK_SHIFT 16
1566c0e09200SDave Airlie #	define R500_STENCILWRITEMASK_MASK  0x00ff0000
1567c0e09200SDave Airlie 
1568c0e09200SDave Airlie /* BEGIN: Vertex program instruction set */
1569c0e09200SDave Airlie 
1570c0e09200SDave Airlie /* Every instruction is four dwords long:
1571c0e09200SDave Airlie  *  DWORD 0: output and opcode
1572c0e09200SDave Airlie  *  DWORD 1: first argument
1573c0e09200SDave Airlie  *  DWORD 2: second argument
1574c0e09200SDave Airlie  *  DWORD 3: third argument
1575c0e09200SDave Airlie  *
1576c0e09200SDave Airlie  * Notes:
1577c0e09200SDave Airlie  *  - ABS r, a is implemented as MAX r, a, -a
1578c0e09200SDave Airlie  *  - MOV is implemented as ADD to zero
1579c0e09200SDave Airlie  *  - XPD is implemented as MUL + MAD
1580c0e09200SDave Airlie  *  - FLR is implemented as FRC + ADD
1581c0e09200SDave Airlie  *  - apparently, fglrx tries to schedule instructions so that there is at
1582c0e09200SDave Airlie  *    least one instruction between the write to a temporary and the first
1583c0e09200SDave Airlie  *    read from said temporary; however, violations of this scheduling are
1584c0e09200SDave Airlie  *    allowed
1585c0e09200SDave Airlie  *  - register indices seem to be unrelated with OpenGL aliasing to
1586c0e09200SDave Airlie  *    conventional state
1587c0e09200SDave Airlie  *  - only one attribute and one parameter can be loaded at a time; however,
1588c0e09200SDave Airlie  *    the same attribute/parameter can be used for more than one argument
1589c0e09200SDave Airlie  *  - the second software argument for POW is the third hardware argument
1590c0e09200SDave Airlie  *    (no idea why)
1591c0e09200SDave Airlie  *  - MAD with only temporaries as input seems to use VPI_OUT_SELECT_MAD_2
1592c0e09200SDave Airlie  *
1593c0e09200SDave Airlie  * There is some magic surrounding LIT:
1594c0e09200SDave Airlie  *   The single argument is replicated across all three inputs, but swizzled:
1595c0e09200SDave Airlie  *     First argument: xyzy
1596c0e09200SDave Airlie  *     Second argument: xyzx
1597c0e09200SDave Airlie  *     Third argument: xyzw
1598c0e09200SDave Airlie  *   Whenever the result is used later in the fragment program, fglrx forces
1599c0e09200SDave Airlie  *   x and w to be 1.0 in the input selection; I don't know whether this is
1600c0e09200SDave Airlie  *   strictly necessary
1601c0e09200SDave Airlie  */
1602c0e09200SDave Airlie #define R300_VPI_OUT_OP_DOT                     (1 << 0)
1603c0e09200SDave Airlie #define R300_VPI_OUT_OP_MUL                     (2 << 0)
1604c0e09200SDave Airlie #define R300_VPI_OUT_OP_ADD                     (3 << 0)
1605c0e09200SDave Airlie #define R300_VPI_OUT_OP_MAD                     (4 << 0)
1606c0e09200SDave Airlie #define R300_VPI_OUT_OP_DST                     (5 << 0)
1607c0e09200SDave Airlie #define R300_VPI_OUT_OP_FRC                     (6 << 0)
1608c0e09200SDave Airlie #define R300_VPI_OUT_OP_MAX                     (7 << 0)
1609c0e09200SDave Airlie #define R300_VPI_OUT_OP_MIN                     (8 << 0)
1610c0e09200SDave Airlie #define R300_VPI_OUT_OP_SGE                     (9 << 0)
1611c0e09200SDave Airlie #define R300_VPI_OUT_OP_SLT                     (10 << 0)
1612c0e09200SDave Airlie 	/* Used in GL_POINT_DISTANCE_ATTENUATION_ARB, vector(scalar, vector) */
1613c0e09200SDave Airlie #define R300_VPI_OUT_OP_UNK12                   (12 << 0)
1614c0e09200SDave Airlie #define R300_VPI_OUT_OP_ARL                     (13 << 0)
1615c0e09200SDave Airlie #define R300_VPI_OUT_OP_EXP                     (65 << 0)
1616c0e09200SDave Airlie #define R300_VPI_OUT_OP_LOG                     (66 << 0)
1617c0e09200SDave Airlie 	/* Used in fog computations, scalar(scalar) */
1618c0e09200SDave Airlie #define R300_VPI_OUT_OP_UNK67                   (67 << 0)
1619c0e09200SDave Airlie #define R300_VPI_OUT_OP_LIT                     (68 << 0)
1620c0e09200SDave Airlie #define R300_VPI_OUT_OP_POW                     (69 << 0)
1621c0e09200SDave Airlie #define R300_VPI_OUT_OP_RCP                     (70 << 0)
1622c0e09200SDave Airlie #define R300_VPI_OUT_OP_RSQ                     (72 << 0)
1623c0e09200SDave Airlie 	/* Used in GL_POINT_DISTANCE_ATTENUATION_ARB, scalar(scalar) */
1624c0e09200SDave Airlie #define R300_VPI_OUT_OP_UNK73                   (73 << 0)
1625c0e09200SDave Airlie #define R300_VPI_OUT_OP_EX2                     (75 << 0)
1626c0e09200SDave Airlie #define R300_VPI_OUT_OP_LG2                     (76 << 0)
1627c0e09200SDave Airlie #define R300_VPI_OUT_OP_MAD_2                   (128 << 0)
1628c0e09200SDave Airlie 	/* all temps, vector(scalar, vector, vector) */
1629c0e09200SDave Airlie #define R300_VPI_OUT_OP_UNK129                  (129 << 0)
1630c0e09200SDave Airlie 
1631c0e09200SDave Airlie #define R300_VPI_OUT_REG_CLASS_TEMPORARY        (0 << 8)
1632c0e09200SDave Airlie #define R300_VPI_OUT_REG_CLASS_ADDR             (1 << 8)
1633c0e09200SDave Airlie #define R300_VPI_OUT_REG_CLASS_RESULT           (2 << 8)
1634c0e09200SDave Airlie #define R300_VPI_OUT_REG_CLASS_MASK             (31 << 8)
1635c0e09200SDave Airlie 
1636c0e09200SDave Airlie #define R300_VPI_OUT_REG_INDEX_SHIFT            13
1637c0e09200SDave Airlie 	/* GUESS based on fglrx native limits */
1638c0e09200SDave Airlie #define R300_VPI_OUT_REG_INDEX_MASK             (31 << 13)
1639c0e09200SDave Airlie 
1640c0e09200SDave Airlie #define R300_VPI_OUT_WRITE_X                    (1 << 20)
1641c0e09200SDave Airlie #define R300_VPI_OUT_WRITE_Y                    (1 << 21)
1642c0e09200SDave Airlie #define R300_VPI_OUT_WRITE_Z                    (1 << 22)
1643c0e09200SDave Airlie #define R300_VPI_OUT_WRITE_W                    (1 << 23)
1644c0e09200SDave Airlie 
1645c0e09200SDave Airlie #define R300_VPI_IN_REG_CLASS_TEMPORARY         (0 << 0)
1646c0e09200SDave Airlie #define R300_VPI_IN_REG_CLASS_ATTRIBUTE         (1 << 0)
1647c0e09200SDave Airlie #define R300_VPI_IN_REG_CLASS_PARAMETER         (2 << 0)
1648c0e09200SDave Airlie #define R300_VPI_IN_REG_CLASS_NONE              (9 << 0)
1649c0e09200SDave Airlie #define R300_VPI_IN_REG_CLASS_MASK              (31 << 0)
1650c0e09200SDave Airlie 
1651c0e09200SDave Airlie #define R300_VPI_IN_REG_INDEX_SHIFT             5
1652c0e09200SDave Airlie 	/* GUESS based on fglrx native limits */
1653c0e09200SDave Airlie #define R300_VPI_IN_REG_INDEX_MASK              (255 << 5)
1654c0e09200SDave Airlie 
1655c0e09200SDave Airlie /* The R300 can select components from the input register arbitrarily.
1656c0e09200SDave Airlie  * Use the following constants, shifted by the component shift you
1657c0e09200SDave Airlie  * want to select
1658c0e09200SDave Airlie  */
1659c0e09200SDave Airlie #define R300_VPI_IN_SELECT_X    0
1660c0e09200SDave Airlie #define R300_VPI_IN_SELECT_Y    1
1661c0e09200SDave Airlie #define R300_VPI_IN_SELECT_Z    2
1662c0e09200SDave Airlie #define R300_VPI_IN_SELECT_W    3
1663c0e09200SDave Airlie #define R300_VPI_IN_SELECT_ZERO 4
1664c0e09200SDave Airlie #define R300_VPI_IN_SELECT_ONE  5
1665c0e09200SDave Airlie #define R300_VPI_IN_SELECT_MASK 7
1666c0e09200SDave Airlie 
1667c0e09200SDave Airlie #define R300_VPI_IN_X_SHIFT                     13
1668c0e09200SDave Airlie #define R300_VPI_IN_Y_SHIFT                     16
1669c0e09200SDave Airlie #define R300_VPI_IN_Z_SHIFT                     19
1670c0e09200SDave Airlie #define R300_VPI_IN_W_SHIFT                     22
1671c0e09200SDave Airlie 
1672c0e09200SDave Airlie #define R300_VPI_IN_NEG_X                       (1 << 25)
1673c0e09200SDave Airlie #define R300_VPI_IN_NEG_Y                       (1 << 26)
1674c0e09200SDave Airlie #define R300_VPI_IN_NEG_Z                       (1 << 27)
1675c0e09200SDave Airlie #define R300_VPI_IN_NEG_W                       (1 << 28)
1676c0e09200SDave Airlie /* END: Vertex program instruction set */
1677c0e09200SDave Airlie 
1678c0e09200SDave Airlie /* BEGIN: Packet 3 commands */
1679c0e09200SDave Airlie 
1680c0e09200SDave Airlie /* A primitive emission dword. */
1681c0e09200SDave Airlie #define R300_PRIM_TYPE_NONE                     (0 << 0)
1682c0e09200SDave Airlie #define R300_PRIM_TYPE_POINT                    (1 << 0)
1683c0e09200SDave Airlie #define R300_PRIM_TYPE_LINE                     (2 << 0)
1684c0e09200SDave Airlie #define R300_PRIM_TYPE_LINE_STRIP               (3 << 0)
1685c0e09200SDave Airlie #define R300_PRIM_TYPE_TRI_LIST                 (4 << 0)
1686c0e09200SDave Airlie #define R300_PRIM_TYPE_TRI_FAN                  (5 << 0)
1687c0e09200SDave Airlie #define R300_PRIM_TYPE_TRI_STRIP                (6 << 0)
1688c0e09200SDave Airlie #define R300_PRIM_TYPE_TRI_TYPE2                (7 << 0)
1689c0e09200SDave Airlie #define R300_PRIM_TYPE_RECT_LIST                (8 << 0)
1690c0e09200SDave Airlie #define R300_PRIM_TYPE_3VRT_POINT_LIST          (9 << 0)
1691c0e09200SDave Airlie #define R300_PRIM_TYPE_3VRT_LINE_LIST           (10 << 0)
1692c0e09200SDave Airlie 	/* GUESS (based on r200) */
1693c0e09200SDave Airlie #define R300_PRIM_TYPE_POINT_SPRITES            (11 << 0)
1694c0e09200SDave Airlie #define R300_PRIM_TYPE_LINE_LOOP                (12 << 0)
1695c0e09200SDave Airlie #define R300_PRIM_TYPE_QUADS                    (13 << 0)
1696c0e09200SDave Airlie #define R300_PRIM_TYPE_QUAD_STRIP               (14 << 0)
1697c0e09200SDave Airlie #define R300_PRIM_TYPE_POLYGON                  (15 << 0)
1698c0e09200SDave Airlie #define R300_PRIM_TYPE_MASK                     0xF
1699c0e09200SDave Airlie #define R300_PRIM_WALK_IND                      (1 << 4)
1700c0e09200SDave Airlie #define R300_PRIM_WALK_LIST                     (2 << 4)
1701c0e09200SDave Airlie #define R300_PRIM_WALK_RING                     (3 << 4)
1702c0e09200SDave Airlie #define R300_PRIM_WALK_MASK                     (3 << 4)
1703c0e09200SDave Airlie 	/* GUESS (based on r200) */
1704c0e09200SDave Airlie #define R300_PRIM_COLOR_ORDER_BGRA              (0 << 6)
1705c0e09200SDave Airlie #define R300_PRIM_COLOR_ORDER_RGBA              (1 << 6)
1706c0e09200SDave Airlie #define R300_PRIM_NUM_VERTICES_SHIFT            16
1707c0e09200SDave Airlie #define R300_PRIM_NUM_VERTICES_MASK             0xffff
1708c0e09200SDave Airlie 
1709c0e09200SDave Airlie /* Draw a primitive from vertex data in arrays loaded via 3D_LOAD_VBPNTR.
1710c0e09200SDave Airlie  * Two parameter dwords:
1711c0e09200SDave Airlie  * 0. The first parameter appears to be always 0
1712c0e09200SDave Airlie  * 1. The second parameter is a standard primitive emission dword.
1713c0e09200SDave Airlie  */
1714c0e09200SDave Airlie #define R300_PACKET3_3D_DRAW_VBUF           0x00002800
1715c0e09200SDave Airlie 
1716c0e09200SDave Airlie /* Specify the full set of vertex arrays as (address, stride).
1717c0e09200SDave Airlie  * The first parameter is the number of vertex arrays specified.
1718c0e09200SDave Airlie  * The rest of the command is a variable length list of blocks, where
1719c0e09200SDave Airlie  * each block is three dwords long and specifies two arrays.
1720c0e09200SDave Airlie  * The first dword of a block is split into two words, the lower significant
1721c0e09200SDave Airlie  * word refers to the first array, the more significant word to the second
1722c0e09200SDave Airlie  * array in the block.
1723c0e09200SDave Airlie  * The low byte of each word contains the size of an array entry in dwords,
1724c0e09200SDave Airlie  * the high byte contains the stride of the array.
1725c0e09200SDave Airlie  * The second dword of a block contains the pointer to the first array,
1726c0e09200SDave Airlie  * the third dword of a block contains the pointer to the second array.
1727c0e09200SDave Airlie  * Note that if the total number of arrays is odd, the third dword of
1728c0e09200SDave Airlie  * the last block is omitted.
1729c0e09200SDave Airlie  */
1730c0e09200SDave Airlie #define R300_PACKET3_3D_LOAD_VBPNTR         0x00002F00
1731c0e09200SDave Airlie 
1732c0e09200SDave Airlie #define R300_PACKET3_INDX_BUFFER            0x00003300
1733c0e09200SDave Airlie #    define R300_EB_UNK1_SHIFT                      24
1734c0e09200SDave Airlie #    define R300_EB_UNK1                    (0x80<<24)
1735c0e09200SDave Airlie #    define R300_EB_UNK2                        0x0810
1736c0e09200SDave Airlie #define R300_PACKET3_3D_DRAW_VBUF_2         0x00003400
1737c0e09200SDave Airlie #define R300_PACKET3_3D_DRAW_INDX_2         0x00003600
1738c0e09200SDave Airlie 
1739c0e09200SDave Airlie /* END: Packet 3 commands */
1740c0e09200SDave Airlie 
1741c0e09200SDave Airlie 
1742c0e09200SDave Airlie /* Color formats for 2d packets
1743c0e09200SDave Airlie  */
1744c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_CI8	2
1745c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_ARGB1555	3
1746c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_RGB565	4
1747c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_ARGB8888	6
1748c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_RGB332	7
1749c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_RGB8	9
1750c0e09200SDave Airlie #define R300_CP_COLOR_FORMAT_ARGB4444	15
1751c0e09200SDave Airlie 
1752c0e09200SDave Airlie /*
1753c0e09200SDave Airlie  * CP type-3 packets
1754c0e09200SDave Airlie  */
1755c0e09200SDave Airlie #define R300_CP_CMD_BITBLT_MULTI	0xC0009B00
1756c0e09200SDave Airlie 
1757c0e09200SDave Airlie #define R500_VAP_INDEX_OFFSET		0x208c
1758c0e09200SDave Airlie 
1759c0e09200SDave Airlie #define R500_GA_US_VECTOR_INDEX         0x4250
1760c0e09200SDave Airlie #define R500_GA_US_VECTOR_DATA          0x4254
1761c0e09200SDave Airlie 
1762c0e09200SDave Airlie #define R500_RS_IP_0                    0x4074
1763c0e09200SDave Airlie #define R500_RS_INST_0                  0x4320
1764c0e09200SDave Airlie 
1765c0e09200SDave Airlie #define R500_US_CONFIG                  0x4600
1766c0e09200SDave Airlie 
1767c0e09200SDave Airlie #define R500_US_FC_CTRL			0x4624
1768c0e09200SDave Airlie #define R500_US_CODE_ADDR		0x4630
1769c0e09200SDave Airlie 
1770c0e09200SDave Airlie #define R500_RB3D_COLOR_CLEAR_VALUE_AR  0x46c0
1771c0e09200SDave Airlie #define R500_RB3D_CONSTANT_COLOR_AR     0x4ef8
1772c0e09200SDave Airlie 
1773c0e09200SDave Airlie #endif /* _R300_REG_H */
1774