r600_state.h revision 40732134
1b7e1c893Smrg#ifndef __R600_STATE_H__
2b7e1c893Smrg#define __R600_STATE_H__
3b7e1c893Smrg
4b7e1c893Smrg
5b7e1c893Smrg#include "xf86drm.h"
6b7e1c893Smrg
7b7e1c893Smrgtypedef int bool_t;
8b7e1c893Smrg
9b7e1c893Smrg#define CLEAR(x) memset (&x, 0, sizeof(x))
10b7e1c893Smrg
11b7e1c893Smrg/* Sequencer / thread handling */
12b7e1c893Smrgtypedef struct {
13b7e1c893Smrg    int ps_prio;
14b7e1c893Smrg    int vs_prio;
15b7e1c893Smrg    int gs_prio;
16b7e1c893Smrg    int es_prio;
17b7e1c893Smrg    int num_ps_gprs;
18b7e1c893Smrg    int num_vs_gprs;
19b7e1c893Smrg    int num_gs_gprs;
20b7e1c893Smrg    int num_es_gprs;
21b7e1c893Smrg    int num_temp_gprs;
22b7e1c893Smrg    int num_ps_threads;
23b7e1c893Smrg    int num_vs_threads;
24b7e1c893Smrg    int num_gs_threads;
25b7e1c893Smrg    int num_es_threads;
26b7e1c893Smrg    int num_ps_stack_entries;
27b7e1c893Smrg    int num_vs_stack_entries;
28b7e1c893Smrg    int num_gs_stack_entries;
29b7e1c893Smrg    int num_es_stack_entries;
30b7e1c893Smrg} sq_config_t;
31b7e1c893Smrg
32b7e1c893Smrg/* Color buffer / render target */
33b7e1c893Smrgtypedef struct {
34b7e1c893Smrg    int id;
35b7e1c893Smrg    int w;
36b7e1c893Smrg    int h;
37b7e1c893Smrg    uint64_t base;
38b7e1c893Smrg    int format;
39b7e1c893Smrg    int endian;
40b7e1c893Smrg    int array_mode;						// tiling
41b7e1c893Smrg    int number_type;
42b7e1c893Smrg    int read_size;
43b7e1c893Smrg    int comp_swap;
44b7e1c893Smrg    int tile_mode;
45b7e1c893Smrg    int blend_clamp;
46b7e1c893Smrg    int clear_color;
47b7e1c893Smrg    int blend_bypass;
48b7e1c893Smrg    int blend_float32;
49b7e1c893Smrg    int simple_float;
50b7e1c893Smrg    int round_mode;
51b7e1c893Smrg    int tile_compact;
52b7e1c893Smrg    int source_format;
53b13dfe66Smrg    /* 2D related CB state */
54b13dfe66Smrg    uint32_t pmask;
55b13dfe66Smrg    int rop;
56b13dfe66Smrg    int blend_enable;
57b13dfe66Smrg    uint32_t blendcntl;
58ad43ddacSmrg    struct radeon_bo *bo;
5940732134Srjs#ifdef XF86DRM_MODE
6040732134Srjs    struct radeon_surface *surface;
6140732134Srjs#endif
62b7e1c893Smrg} cb_config_t;
63b7e1c893Smrg
64b7e1c893Smrg/* Depth buffer */
65b7e1c893Smrgtypedef struct {
66b7e1c893Smrg    int w;
67b7e1c893Smrg    int h;
68b7e1c893Smrg    uint64_t base;
69b7e1c893Smrg    int format;
70b7e1c893Smrg    int read_size;
71b7e1c893Smrg    int array_mode;						// tiling
72b7e1c893Smrg    int tile_surface_en;
73b7e1c893Smrg    int tile_compact;
74b7e1c893Smrg    int zrange_precision;
75ad43ddacSmrg    struct radeon_bo *bo;
76b7e1c893Smrg} db_config_t;
77b7e1c893Smrg
78b7e1c893Smrg/* Shader */
79b7e1c893Smrgtypedef struct {
80b7e1c893Smrg    uint64_t shader_addr;
810974d292Smrg    uint32_t shader_size;
82b7e1c893Smrg    int num_gprs;
83b7e1c893Smrg    int stack_size;
84b7e1c893Smrg    int dx10_clamp;
85b7e1c893Smrg    int prime_cache_pgm_en;
86b7e1c893Smrg    int prime_cache_on_draw;
87b7e1c893Smrg    int fetch_cache_lines;
88b7e1c893Smrg    int prime_cache_en;
89b7e1c893Smrg    int prime_cache_on_const;
90b7e1c893Smrg    int clamp_consts;
91b7e1c893Smrg    int export_mode;
92b7e1c893Smrg    int uncached_first_inst;
93ad43ddacSmrg    struct radeon_bo *bo;
94b7e1c893Smrg} shader_config_t;
95b7e1c893Smrg
96b7e1c893Smrg/* Vertex buffer / vtx resource */
97b7e1c893Smrgtypedef struct {
98b7e1c893Smrg    int id;
99b7e1c893Smrg    uint64_t vb_addr;
100b7e1c893Smrg    uint32_t vtx_num_entries;
101b7e1c893Smrg    uint32_t vtx_size_dw;
102b7e1c893Smrg    int clamp_x;
103b7e1c893Smrg    int format;
104b7e1c893Smrg    int num_format_all;
105b7e1c893Smrg    int format_comp_all;
106b7e1c893Smrg    int srf_mode_all;
107b7e1c893Smrg    int endian;
108b7e1c893Smrg    int mem_req_size;
109ad43ddacSmrg    struct radeon_bo *bo;
110b7e1c893Smrg} vtx_resource_t;
111b7e1c893Smrg
112b7e1c893Smrg/* Texture resource */
113b7e1c893Smrgtypedef struct {
114b7e1c893Smrg    int id;
115b7e1c893Smrg    int w;
116b7e1c893Smrg    int h;
117b7e1c893Smrg    int pitch;
118b7e1c893Smrg    int depth;
119b7e1c893Smrg    int dim;
120b7e1c893Smrg    int tile_mode;
121b7e1c893Smrg    int tile_type;
122b7e1c893Smrg    int format;
123b7e1c893Smrg    uint64_t base;
124b7e1c893Smrg    uint64_t mip_base;
1250974d292Smrg    uint32_t size;
126b7e1c893Smrg    int format_comp_x;
127b7e1c893Smrg    int format_comp_y;
128b7e1c893Smrg    int format_comp_z;
129b7e1c893Smrg    int format_comp_w;
130b7e1c893Smrg    int num_format_all;
131b7e1c893Smrg    int srf_mode_all;
132b7e1c893Smrg    int force_degamma;
133b7e1c893Smrg    int endian;
134b7e1c893Smrg    int request_size;
135b7e1c893Smrg    int dst_sel_x;
136b7e1c893Smrg    int dst_sel_y;
137b7e1c893Smrg    int dst_sel_z;
138b7e1c893Smrg    int dst_sel_w;
139b7e1c893Smrg    int base_level;
140b7e1c893Smrg    int last_level;
141b7e1c893Smrg    int base_array;
142b7e1c893Smrg    int last_array;
143b7e1c893Smrg    int mpeg_clamp;
144b7e1c893Smrg    int perf_modulation;
145b7e1c893Smrg    int interlaced;
146ad43ddacSmrg    struct radeon_bo *bo;
147ad43ddacSmrg    struct radeon_bo *mip_bo;
14840732134Srjs#ifdef XF86DRM_MODE
14940732134Srjs    struct radeon_surface *surface;
15040732134Srjs#endif
151b7e1c893Smrg} tex_resource_t;
152b7e1c893Smrg
153b7e1c893Smrg/* Texture sampler */
154b7e1c893Smrgtypedef struct {
155b7e1c893Smrg    int				id;
156b7e1c893Smrg    /* Clamping */
157b7e1c893Smrg    int				clamp_x, clamp_y, clamp_z;
158b7e1c893Smrg    int		       		border_color;
159b7e1c893Smrg    /* Filtering */
160b7e1c893Smrg    int				xy_mag_filter, xy_min_filter;
161b7e1c893Smrg    int				z_filter;
162b7e1c893Smrg    int				mip_filter;
163b7e1c893Smrg    bool_t			high_precision_filter;	/* ? */
164b7e1c893Smrg    int				perf_mip;		/* ? 0-7 */
165b7e1c893Smrg    int				perf_z;			/* ? 3 */
166b7e1c893Smrg    /* LoD selection */
167b7e1c893Smrg    int				min_lod, max_lod;	/* 0-0x3ff */
168b7e1c893Smrg    int                         lod_bias;		/* 0-0xfff (signed?) */
169b7e1c893Smrg    int                         lod_bias2;		/* ? 0-0xfff (signed?) */
170b7e1c893Smrg    bool_t			lod_uses_minor_axis;	/* ? */
171b7e1c893Smrg    /* Other stuff */
172b7e1c893Smrg    bool_t			point_sampling_clamp;	/* ? */
173b7e1c893Smrg    bool_t			tex_array_override;	/* ? */
174b7e1c893Smrg    bool_t                      mc_coord_truncate;	/* ? */
175b7e1c893Smrg    bool_t			force_degamma;		/* ? */
176b7e1c893Smrg    bool_t			fetch_4;		/* ? */
177b7e1c893Smrg    bool_t			sample_is_pcf;		/* ? */
178b7e1c893Smrg    bool_t			type;			/* ? */
179b7e1c893Smrg    int				depth_compare;		/* only depth textures? */
180b7e1c893Smrg    int				chroma_key;
181b7e1c893Smrg} tex_sampler_t;
182b7e1c893Smrg
183b7e1c893Smrg/* Draw command */
184b7e1c893Smrgtypedef struct {
185b7e1c893Smrg    uint32_t prim_type;
186b7e1c893Smrg    uint32_t vgt_draw_initiator;
187b7e1c893Smrg    uint32_t index_type;
188b7e1c893Smrg    uint32_t num_instances;
189b7e1c893Smrg    uint32_t num_indices;
190b7e1c893Smrg} draw_config_t;
191b7e1c893Smrg
192ad43ddacSmrg#if defined(XF86DRM_MODE)
193ad43ddacSmrg#define BEGIN_BATCH(n)				\
194ad43ddacSmrgdo {					\
195ad43ddacSmrg    if (info->cs)			\
196ad43ddacSmrg	radeon_ddx_cs_start(pScrn, (n), __FILE__, __func__, __LINE__);	\
197ad43ddacSmrg} while(0)
198ad43ddacSmrg#define END_BATCH()				\
199ad43ddacSmrgdo {					\
200ad43ddacSmrg    if (info->cs)			\
201ad43ddacSmrg	radeon_cs_end(info->cs, __FILE__, __func__, __LINE__);	\
202ad43ddacSmrg} while(0)
203ad43ddacSmrg#define RELOC_BATCH(bo, rd, wd)					\
204ad43ddacSmrgdo {							\
205ad43ddacSmrg    if (info->cs) {							\
206ad43ddacSmrg	int _ret;							\
207ad43ddacSmrg	_ret = radeon_cs_write_reloc(info->cs, (bo), (rd), (wd), 0);	\
208ad43ddacSmrg	if (_ret) ErrorF("reloc emit failure %d (%s %d)\n", _ret, __func__, __LINE__); \
209ad43ddacSmrg    }									\
210ad43ddacSmrg} while(0)
211ad43ddacSmrg#define E32(ib, dword)                                                  \
212ad43ddacSmrgdo {                                                                    \
213ad43ddacSmrg    if (info->cs)							\
214ad43ddacSmrg	radeon_cs_write_dword(info->cs, (dword));			\
215ad43ddacSmrg    else {								\
216ad43ddacSmrg	uint32_t *ib_head = (pointer)(char*)(ib)->address;		\
217ad43ddacSmrg	ib_head[(ib)->used >> 2] = (dword);				\
218ad43ddacSmrg	(ib)->used += 4;						\
219ad43ddacSmrg    }									\
220ad43ddacSmrg} while (0)
221ad43ddacSmrg#else
222ad43ddacSmrg#define BEGIN_BATCH(n) do {(void)info;} while(0)
223ad43ddacSmrg#define END_BATCH() do {} while(0)
224ad43ddacSmrg#define RELOC_BATCH(bo, wd, rd) do {} while(0)
225b7e1c893Smrg#define E32(ib, dword)                                                  \
226b7e1c893Smrgdo {                                                                    \
227b7e1c893Smrg    uint32_t *ib_head = (pointer)(char*)(ib)->address;			\
228b7e1c893Smrg    ib_head[(ib)->used >> 2] = (dword);					\
229b7e1c893Smrg    (ib)->used += 4;							\
230b7e1c893Smrg} while (0)
231ad43ddacSmrg#endif
232b7e1c893Smrg
233b7e1c893Smrg#define EFLOAT(ib, val)							\
234b7e1c893Smrgdo {								        \
235b7e1c893Smrg    union { float f; uint32_t d; } a;                                   \
236b7e1c893Smrg    a.f = (val);								\
237b7e1c893Smrg    E32((ib), a.d);							\
238b7e1c893Smrg} while (0)
239b7e1c893Smrg
240b7e1c893Smrg#define PACK3(ib, cmd, num)	       					\
241b7e1c893Smrgdo {                                                                    \
242b7e1c893Smrg    E32((ib), RADEON_CP_PACKET3 | ((cmd) << 8) | ((((num) - 1) & 0x3fff) << 16)); \
243b7e1c893Smrg} while (0)
244b7e1c893Smrg
245b7e1c893Smrg/* write num registers, start at reg */
246b7e1c893Smrg/* If register falls in a special area, special commands are issued */
247b7e1c893Smrg#define PACK0(ib, reg, num)                                             \
248b7e1c893Smrgdo {                                                                    \
249b7e1c893Smrg    if ((reg) >= SET_CONFIG_REG_offset && (reg) < SET_CONFIG_REG_end) {	\
250b7e1c893Smrg	PACK3((ib), IT_SET_CONFIG_REG, (num) + 1);			\
2512f39173dSmrg	E32((ib), ((reg) - SET_CONFIG_REG_offset) >> 2);		\
252b7e1c893Smrg    } else if ((reg) >= SET_CONTEXT_REG_offset && (reg) < SET_CONTEXT_REG_end) { \
253c503f109Smrg	PACK3((ib), IT_SET_CONTEXT_REG, (num) + 1);			\
2542f39173dSmrg	E32((ib), ((reg) - SET_CONTEXT_REG_offset) >> 2);		\
255b7e1c893Smrg    } else if ((reg) >= SET_ALU_CONST_offset && (reg) < SET_ALU_CONST_end) { \
256b7e1c893Smrg	PACK3((ib), IT_SET_ALU_CONST, (num) + 1);			\
2572f39173dSmrg	E32((ib), ((reg) - SET_ALU_CONST_offset) >> 2);			\
258b7e1c893Smrg    } else if ((reg) >= SET_RESOURCE_offset && (reg) < SET_RESOURCE_end) { \
259b7e1c893Smrg	PACK3((ib), IT_SET_RESOURCE, num + 1);				\
260b7e1c893Smrg	E32((ib), ((reg) - SET_RESOURCE_offset) >> 2);			\
261b7e1c893Smrg    } else if ((reg) >= SET_SAMPLER_offset && (reg) < SET_SAMPLER_end) { \
262b7e1c893Smrg	PACK3((ib), IT_SET_SAMPLER, (num) + 1);				\
263b7e1c893Smrg	E32((ib), (reg - SET_SAMPLER_offset) >> 2);			\
264b7e1c893Smrg    } else if ((reg) >= SET_CTL_CONST_offset && (reg) < SET_CTL_CONST_end) { \
265b7e1c893Smrg	PACK3((ib), IT_SET_CTL_CONST, (num) + 1);			\
266b7e1c893Smrg	E32((ib), ((reg) - SET_CTL_CONST_offset) >> 2);		\
267b7e1c893Smrg    } else if ((reg) >= SET_LOOP_CONST_offset && (reg) < SET_LOOP_CONST_end) { \
268b7e1c893Smrg	PACK3((ib), IT_SET_LOOP_CONST, (num) + 1);			\
269b7e1c893Smrg	E32((ib), ((reg) - SET_LOOP_CONST_offset) >> 2);		\
270b7e1c893Smrg    } else if ((reg) >= SET_BOOL_CONST_offset && (reg) < SET_BOOL_CONST_end) { \
271b7e1c893Smrg	PACK3((ib), IT_SET_BOOL_CONST, (num) + 1);			\
272b7e1c893Smrg	E32((ib), ((reg) - SET_BOOL_CONST_offset) >> 2);		\
273b7e1c893Smrg    } else {								\
274b7e1c893Smrg	E32((ib), CP_PACKET0 ((reg), (num) - 1));			\
275b7e1c893Smrg    }									\
276b7e1c893Smrg} while (0)
277b7e1c893Smrg
278b7e1c893Smrg/* write a single register */
279b7e1c893Smrg#define EREG(ib, reg, val)                                              \
280b7e1c893Smrgdo {								        \
281b7e1c893Smrg    PACK0((ib), (reg), 1);						\
282b7e1c893Smrg    E32((ib), (val));							\
283b7e1c893Smrg} while (0)
284b7e1c893Smrg
285b7e1c893Smrgvoid R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib);
286b7e1c893Smrgvoid R600IBDiscard(ScrnInfoPtr pScrn, drmBufPtr ib);
287b7e1c893Smrg
288b7e1c893Smrgvoid
289921a55d8Smrgr600_wait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib);
290b7e1c893Smrgvoid
291921a55d8Smrgr600_wait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib);
292b7e1c893Smrgvoid
293921a55d8Smrgr600_start_3d(ScrnInfoPtr pScrn, drmBufPtr ib);
294b7e1c893Smrgvoid
295921a55d8Smrgr600_set_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf, uint32_t domain);
296b7e1c893Smrgvoid
297921a55d8Smrgr600_cp_wait_vline_sync(ScrnInfoPtr pScrn, drmBufPtr ib, PixmapPtr pPix, xf86CrtcPtr crtc, int start, int stop);
298b7e1c893Smrgvoid
299b13dfe66Smrgr600_set_spi(ScrnInfoPtr pScrn, drmBufPtr ib, int vs_export_count, int num_interp);
300b13dfe66Smrgvoid
301921a55d8Smrgr600_fs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf, uint32_t domain);
302b7e1c893Smrgvoid
303921a55d8Smrgr600_vs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf, uint32_t domain);
304b7e1c893Smrgvoid
305921a55d8Smrgr600_ps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf, uint32_t domain);
306b7e1c893Smrgvoid
307921a55d8Smrgr600_set_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf);
308b7e1c893Smrgvoid
309921a55d8Smrgr600_set_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val);
310b7e1c893Smrgvoid
311921a55d8Smrgr600_set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res, uint32_t domain);
312b7e1c893Smrgvoid
313921a55d8Smrgr600_set_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s);
314b7e1c893Smrgvoid
315921a55d8Smrgr600_set_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2);
316b7e1c893Smrgvoid
317921a55d8Smrgr600_set_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2);
318b7e1c893Smrgvoid
319921a55d8Smrgr600_set_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2);
320b7e1c893Smrgvoid
321921a55d8Smrgr600_set_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2);
322b7e1c893Smrgvoid
323921a55d8Smrgr600_set_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2);
324b7e1c893Smrgvoid
325921a55d8Smrgr600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib);
326b7e1c893Smrgvoid
327921a55d8Smrgr600_draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices);
328b7e1c893Smrgvoid
329921a55d8Smrgr600_draw_auto(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf);
330b7e1c893Smrg
331ad43ddacSmrgvoid r600_finish_op(ScrnInfoPtr pScrn, int vtx_size);
332ad43ddacSmrg
333ad43ddacSmrgBool
334ad43ddacSmrgR600SetAccelState(ScrnInfoPtr pScrn,
335ad43ddacSmrg		  struct r600_accel_object *src0,
336ad43ddacSmrg		  struct r600_accel_object *src1,
337ad43ddacSmrg		  struct r600_accel_object *dst,
338ad43ddacSmrg		  uint32_t vs_offset, uint32_t ps_offset,
339ad43ddacSmrg		  int rop, Pixel planemask);
340ad43ddacSmrg
341ad43ddacSmrgextern Bool RADEONPrepareAccess_CS(PixmapPtr pPix, int index);
342ad43ddacSmrgextern void RADEONFinishAccess_CS(PixmapPtr pPix, int index);
343ad43ddacSmrgextern void *RADEONEXACreatePixmap(ScreenPtr pScreen, int size, int align);
3440974d292Smrgextern void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height,
3450974d292Smrg				    int depth, int usage_hint, int bitsPerPixel,
3460974d292Smrg				    int *new_pitch);
347ad43ddacSmrgextern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv);
348ad43ddacSmrgextern struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix);
349ad43ddacSmrgextern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix);
350ad43ddacSmrg
351ad43ddacSmrg
352b7e1c893Smrg#endif
353