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