1de2362d3Smrg#ifndef __R600_STATE_H__
2de2362d3Smrg#define __R600_STATE_H__
3de2362d3Smrg
4de2362d3Smrg
5de2362d3Smrg#include "xf86drm.h"
6de2362d3Smrg
7de2362d3Smrgtypedef int bool_t;
8de2362d3Smrg
9de2362d3Smrg#define CLEAR(x) memset (&x, 0, sizeof(x))
10de2362d3Smrg
11de2362d3Smrg/* Sequencer / thread handling */
12de2362d3Smrgtypedef struct {
13de2362d3Smrg    int ps_prio;
14de2362d3Smrg    int vs_prio;
15de2362d3Smrg    int gs_prio;
16de2362d3Smrg    int es_prio;
17de2362d3Smrg    int num_ps_gprs;
18de2362d3Smrg    int num_vs_gprs;
19de2362d3Smrg    int num_gs_gprs;
20de2362d3Smrg    int num_es_gprs;
21de2362d3Smrg    int num_temp_gprs;
22de2362d3Smrg    int num_ps_threads;
23de2362d3Smrg    int num_vs_threads;
24de2362d3Smrg    int num_gs_threads;
25de2362d3Smrg    int num_es_threads;
26de2362d3Smrg    int num_ps_stack_entries;
27de2362d3Smrg    int num_vs_stack_entries;
28de2362d3Smrg    int num_gs_stack_entries;
29de2362d3Smrg    int num_es_stack_entries;
30de2362d3Smrg} sq_config_t;
31de2362d3Smrg
32de2362d3Smrg/* Color buffer / render target */
33de2362d3Smrgtypedef struct {
34de2362d3Smrg    int id;
35de2362d3Smrg    int w;
36de2362d3Smrg    int h;
37de2362d3Smrg    uint64_t base;
38de2362d3Smrg    int format;
39de2362d3Smrg    int endian;
40de2362d3Smrg    int array_mode;						// tiling
41de2362d3Smrg    int number_type;
42de2362d3Smrg    int read_size;
43de2362d3Smrg    int comp_swap;
44de2362d3Smrg    int tile_mode;
45de2362d3Smrg    int blend_clamp;
46de2362d3Smrg    int clear_color;
47de2362d3Smrg    int blend_bypass;
48de2362d3Smrg    int blend_float32;
49de2362d3Smrg    int simple_float;
50de2362d3Smrg    int round_mode;
51de2362d3Smrg    int tile_compact;
52de2362d3Smrg    int source_format;
53de2362d3Smrg    /* 2D related CB state */
54de2362d3Smrg    uint32_t pmask;
55de2362d3Smrg    int rop;
56de2362d3Smrg    int blend_enable;
57de2362d3Smrg    uint32_t blendcntl;
58de2362d3Smrg    struct radeon_bo *bo;
59de2362d3Smrg    struct radeon_surface *surface;
60de2362d3Smrg} cb_config_t;
61de2362d3Smrg
62de2362d3Smrg/* Depth buffer */
63de2362d3Smrgtypedef struct {
64de2362d3Smrg    int w;
65de2362d3Smrg    int h;
66de2362d3Smrg    uint64_t base;
67de2362d3Smrg    int format;
68de2362d3Smrg    int read_size;
69de2362d3Smrg    int array_mode;						// tiling
70de2362d3Smrg    int tile_surface_en;
71de2362d3Smrg    int tile_compact;
72de2362d3Smrg    int zrange_precision;
73de2362d3Smrg    struct radeon_bo *bo;
74de2362d3Smrg} db_config_t;
75de2362d3Smrg
76de2362d3Smrg/* Shader */
77de2362d3Smrgtypedef struct {
78de2362d3Smrg    uint64_t shader_addr;
79de2362d3Smrg    uint32_t shader_size;
80de2362d3Smrg    int num_gprs;
81de2362d3Smrg    int stack_size;
82de2362d3Smrg    int dx10_clamp;
83de2362d3Smrg    int prime_cache_pgm_en;
84de2362d3Smrg    int prime_cache_on_draw;
85de2362d3Smrg    int fetch_cache_lines;
86de2362d3Smrg    int prime_cache_en;
87de2362d3Smrg    int prime_cache_on_const;
88de2362d3Smrg    int clamp_consts;
89de2362d3Smrg    int export_mode;
90de2362d3Smrg    int uncached_first_inst;
91de2362d3Smrg    struct radeon_bo *bo;
92de2362d3Smrg} shader_config_t;
93de2362d3Smrg
94de2362d3Smrg/* Vertex buffer / vtx resource */
95de2362d3Smrgtypedef struct {
96de2362d3Smrg    int id;
97de2362d3Smrg    uint64_t vb_addr;
98de2362d3Smrg    uint32_t vtx_num_entries;
99de2362d3Smrg    uint32_t vtx_size_dw;
100de2362d3Smrg    int clamp_x;
101de2362d3Smrg    int format;
102de2362d3Smrg    int num_format_all;
103de2362d3Smrg    int format_comp_all;
104de2362d3Smrg    int srf_mode_all;
105de2362d3Smrg    int endian;
106de2362d3Smrg    int mem_req_size;
107de2362d3Smrg    struct radeon_bo *bo;
108de2362d3Smrg} vtx_resource_t;
109de2362d3Smrg
110de2362d3Smrg/* Texture resource */
111de2362d3Smrgtypedef struct {
112de2362d3Smrg    int id;
113de2362d3Smrg    int w;
114de2362d3Smrg    int h;
115de2362d3Smrg    int pitch;
116de2362d3Smrg    int depth;
117de2362d3Smrg    int dim;
118de2362d3Smrg    int tile_mode;
119de2362d3Smrg    int tile_type;
120de2362d3Smrg    int format;
121de2362d3Smrg    uint64_t base;
122de2362d3Smrg    uint64_t mip_base;
123de2362d3Smrg    uint32_t size;
124de2362d3Smrg    int format_comp_x;
125de2362d3Smrg    int format_comp_y;
126de2362d3Smrg    int format_comp_z;
127de2362d3Smrg    int format_comp_w;
128de2362d3Smrg    int num_format_all;
129de2362d3Smrg    int srf_mode_all;
130de2362d3Smrg    int force_degamma;
131de2362d3Smrg    int endian;
132de2362d3Smrg    int request_size;
133de2362d3Smrg    int dst_sel_x;
134de2362d3Smrg    int dst_sel_y;
135de2362d3Smrg    int dst_sel_z;
136de2362d3Smrg    int dst_sel_w;
137de2362d3Smrg    int base_level;
138de2362d3Smrg    int last_level;
139de2362d3Smrg    int base_array;
140de2362d3Smrg    int last_array;
141de2362d3Smrg    int mpeg_clamp;
142de2362d3Smrg    int perf_modulation;
143de2362d3Smrg    int interlaced;
144de2362d3Smrg    struct radeon_bo *bo;
145de2362d3Smrg    struct radeon_bo *mip_bo;
146de2362d3Smrg    struct radeon_surface *surface;
147de2362d3Smrg} tex_resource_t;
148de2362d3Smrg
149de2362d3Smrg/* Texture sampler */
150de2362d3Smrgtypedef struct {
151de2362d3Smrg    int				id;
152de2362d3Smrg    /* Clamping */
153de2362d3Smrg    int				clamp_x, clamp_y, clamp_z;
154de2362d3Smrg    int		       		border_color;
155de2362d3Smrg    /* Filtering */
156de2362d3Smrg    int				xy_mag_filter, xy_min_filter;
157de2362d3Smrg    int				z_filter;
158de2362d3Smrg    int				mip_filter;
159de2362d3Smrg    bool_t			high_precision_filter;	/* ? */
160de2362d3Smrg    int				perf_mip;		/* ? 0-7 */
161de2362d3Smrg    int				perf_z;			/* ? 3 */
162de2362d3Smrg    /* LoD selection */
163de2362d3Smrg    int				min_lod, max_lod;	/* 0-0x3ff */
164de2362d3Smrg    int                         lod_bias;		/* 0-0xfff (signed?) */
165de2362d3Smrg    int                         lod_bias2;		/* ? 0-0xfff (signed?) */
166de2362d3Smrg    bool_t			lod_uses_minor_axis;	/* ? */
167de2362d3Smrg    /* Other stuff */
168de2362d3Smrg    bool_t			point_sampling_clamp;	/* ? */
169de2362d3Smrg    bool_t			tex_array_override;	/* ? */
170de2362d3Smrg    bool_t                      mc_coord_truncate;	/* ? */
171de2362d3Smrg    bool_t			force_degamma;		/* ? */
172de2362d3Smrg    bool_t			fetch_4;		/* ? */
173de2362d3Smrg    bool_t			sample_is_pcf;		/* ? */
174de2362d3Smrg    bool_t			type;			/* ? */
175de2362d3Smrg    int				depth_compare;		/* only depth textures? */
176de2362d3Smrg    int				chroma_key;
177de2362d3Smrg} tex_sampler_t;
178de2362d3Smrg
179de2362d3Smrg/* Draw command */
180de2362d3Smrgtypedef struct {
181de2362d3Smrg    uint32_t prim_type;
182de2362d3Smrg    uint32_t vgt_draw_initiator;
183de2362d3Smrg    uint32_t index_type;
184de2362d3Smrg    uint32_t num_instances;
185de2362d3Smrg    uint32_t num_indices;
186de2362d3Smrg} draw_config_t;
187de2362d3Smrg
188de2362d3Smrg#define BEGIN_BATCH(n)				\
189de2362d3Smrgdo {					\
19018781e08Smrg    radeon_ddx_cs_start(pScrn, (n), __FILE__, __func__, __LINE__);	\
191de2362d3Smrg} while(0)
192de2362d3Smrg#define END_BATCH()				\
193de2362d3Smrgdo {					\
19418781e08Smrg    radeon_cs_end(info->cs, __FILE__, __func__, __LINE__);	\
195de2362d3Smrg} while(0)
196de2362d3Smrg#define RELOC_BATCH(bo, rd, wd)					\
197de2362d3Smrgdo {							\
19818781e08Smrg    int _ret;								\
19918781e08Smrg    _ret = radeon_cs_write_reloc(info->cs, (bo), (rd), (wd), 0);	\
20018781e08Smrg    if (_ret) ErrorF("reloc emit failure %d (%s %d)\n", _ret, __func__, __LINE__); \
201de2362d3Smrg} while(0)
20218781e08Smrg#define E32(dword)                                                  \
203de2362d3Smrgdo {                                                                    \
20418781e08Smrg    radeon_cs_write_dword(info->cs, (dword));			\
205de2362d3Smrg} while (0)
206de2362d3Smrg
20718781e08Smrg#define EFLOAT(val)							\
208de2362d3Smrgdo {								        \
209de2362d3Smrg    union { float f; uint32_t d; } a;                                   \
210de2362d3Smrg    a.f = (val);								\
21118781e08Smrg    E32(a.d);							\
212de2362d3Smrg} while (0)
213de2362d3Smrg
21418781e08Smrg#define PACK3(cmd, num)	       					\
215de2362d3Smrgdo {                                                                    \
21618781e08Smrg    E32(RADEON_CP_PACKET3 | ((cmd) << 8) | ((((num) - 1) & 0x3fff) << 16)); \
217de2362d3Smrg} while (0)
218de2362d3Smrg
219de2362d3Smrg/* write num registers, start at reg */
220de2362d3Smrg/* If register falls in a special area, special commands are issued */
22118781e08Smrg#define PACK0(reg, num)                                             \
222de2362d3Smrgdo {                                                                    \
223de2362d3Smrg    if ((reg) >= SET_CONFIG_REG_offset && (reg) < SET_CONFIG_REG_end) {	\
22418781e08Smrg	PACK3(IT_SET_CONFIG_REG, (num) + 1);			\
22518781e08Smrg	E32(((reg) - SET_CONFIG_REG_offset) >> 2);		\
226de2362d3Smrg    } else if ((reg) >= SET_CONTEXT_REG_offset && (reg) < SET_CONTEXT_REG_end) { \
22718781e08Smrg	PACK3(IT_SET_CONTEXT_REG, (num) + 1);			\
22818781e08Smrg	E32(((reg) - SET_CONTEXT_REG_offset) >> 2);		\
229de2362d3Smrg    } else if ((reg) >= SET_ALU_CONST_offset && (reg) < SET_ALU_CONST_end) { \
23018781e08Smrg	PACK3(IT_SET_ALU_CONST, (num) + 1);			\
23118781e08Smrg	E32(((reg) - SET_ALU_CONST_offset) >> 2);			\
232de2362d3Smrg    } else if ((reg) >= SET_RESOURCE_offset && (reg) < SET_RESOURCE_end) { \
23318781e08Smrg	PACK3(IT_SET_RESOURCE, num + 1);				\
23418781e08Smrg	E32(((reg) - SET_RESOURCE_offset) >> 2);			\
235de2362d3Smrg    } else if ((reg) >= SET_SAMPLER_offset && (reg) < SET_SAMPLER_end) { \
23618781e08Smrg	PACK3(IT_SET_SAMPLER, (num) + 1);				\
23718781e08Smrg	E32((reg - SET_SAMPLER_offset) >> 2);			\
238de2362d3Smrg    } else if ((reg) >= SET_CTL_CONST_offset && (reg) < SET_CTL_CONST_end) { \
23918781e08Smrg	PACK3(IT_SET_CTL_CONST, (num) + 1);			\
24018781e08Smrg	E32(((reg) - SET_CTL_CONST_offset) >> 2);		\
241de2362d3Smrg    } else if ((reg) >= SET_LOOP_CONST_offset && (reg) < SET_LOOP_CONST_end) { \
24218781e08Smrg	PACK3(IT_SET_LOOP_CONST, (num) + 1);			\
24318781e08Smrg	E32(((reg) - SET_LOOP_CONST_offset) >> 2);		\
244de2362d3Smrg    } else if ((reg) >= SET_BOOL_CONST_offset && (reg) < SET_BOOL_CONST_end) { \
24518781e08Smrg	PACK3(IT_SET_BOOL_CONST, (num) + 1);			\
24618781e08Smrg	E32(((reg) - SET_BOOL_CONST_offset) >> 2);		\
247de2362d3Smrg    } else {								\
24818781e08Smrg	E32(CP_PACKET0 ((reg), (num) - 1));			\
249de2362d3Smrg    }									\
250de2362d3Smrg} while (0)
251de2362d3Smrg
252de2362d3Smrg/* write a single register */
25318781e08Smrg#define EREG(reg, val)							\
254de2362d3Smrgdo {								        \
25518781e08Smrg    PACK0((reg), 1);						\
25618781e08Smrg    E32((val));							\
257de2362d3Smrg} while (0)
258de2362d3Smrg
25918781e08Smrgvoid R600CPFlushIndirect(ScrnInfoPtr pScrn);
26018781e08Smrgvoid R600IBDiscard(ScrnInfoPtr pScrn);
261de2362d3Smrg
262de2362d3Smrgvoid
26318781e08Smrgr600_wait_3d_idle_clean(ScrnInfoPtr pScrn);
26418781e08Smrgvoid
26518781e08Smrgr600_wait_3d_idle(ScrnInfoPtr pScrn);
266de2362d3Smrgvoid
26718781e08Smrgr600_start_3d(ScrnInfoPtr pScrn);
268de2362d3Smrgvoid
26918781e08Smrgr600_set_blend_color(ScrnInfoPtr pScrn, float *color);
2707314432eSmrgvoid
27118781e08Smrgr600_set_render_target(ScrnInfoPtr pScrn, cb_config_t *cb_conf, uint32_t domain);
272de2362d3Smrgvoid
27318781e08Smrgr600_cp_wait_vline_sync(ScrnInfoPtr pScrn, PixmapPtr pPix, xf86CrtcPtr crtc, int start, int stop);
274de2362d3Smrgvoid
27518781e08Smrgr600_set_spi(ScrnInfoPtr pScrn, int vs_export_count, int num_interp);
276de2362d3Smrgvoid
27718781e08Smrgr600_fs_setup(ScrnInfoPtr pScrn, shader_config_t *fs_conf, uint32_t domain);
278de2362d3Smrgvoid
27918781e08Smrgr600_vs_setup(ScrnInfoPtr pScrn, shader_config_t *vs_conf, uint32_t domain);
280de2362d3Smrgvoid
28118781e08Smrgr600_ps_setup(ScrnInfoPtr pScrn, shader_config_t *ps_conf, uint32_t domain);
282de2362d3Smrgvoid
28318781e08Smrgr600_set_alu_consts(ScrnInfoPtr pScrn, int offset, int count, float *const_buf);
284de2362d3Smrgvoid
28518781e08Smrgr600_set_bool_consts(ScrnInfoPtr pScrn, int offset, uint32_t val);
286de2362d3Smrgvoid
28718781e08Smrgr600_set_tex_resource(ScrnInfoPtr pScrn, tex_resource_t *tex_res, uint32_t domain);
288de2362d3Smrgvoid
28918781e08Smrgr600_set_tex_sampler (ScrnInfoPtr pScrn, tex_sampler_t *s);
290de2362d3Smrgvoid
29118781e08Smrgr600_set_screen_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2);
292de2362d3Smrgvoid
29318781e08Smrgr600_set_vport_scissor(ScrnInfoPtr pScrn, int id, int x1, int y1, int x2, int y2);
294de2362d3Smrgvoid
29518781e08Smrgr600_set_generic_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2);
296de2362d3Smrgvoid
29718781e08Smrgr600_set_window_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2);
298de2362d3Smrgvoid
29918781e08Smrgr600_set_clip_rect(ScrnInfoPtr pScrn, int id, int x1, int y1, int x2, int y2);
300de2362d3Smrgvoid
30118781e08Smrgr600_set_default_state(ScrnInfoPtr pScrn);
302de2362d3Smrgvoid
30318781e08Smrgr600_draw_immd(ScrnInfoPtr pScrn, draw_config_t *draw_conf, uint32_t *indices);
304de2362d3Smrgvoid
30518781e08Smrgr600_draw_auto(ScrnInfoPtr pScrn, draw_config_t *draw_conf);
306de2362d3Smrg
307de2362d3Smrgvoid r600_finish_op(ScrnInfoPtr pScrn, int vtx_size);
308de2362d3Smrg
309de2362d3SmrgBool
310de2362d3SmrgR600SetAccelState(ScrnInfoPtr pScrn,
311de2362d3Smrg		  struct r600_accel_object *src0,
312de2362d3Smrg		  struct r600_accel_object *src1,
313de2362d3Smrg		  struct r600_accel_object *dst,
314de2362d3Smrg		  uint32_t vs_offset, uint32_t ps_offset,
315de2362d3Smrg		  int rop, Pixel planemask);
316de2362d3Smrg
317de2362d3Smrgextern Bool RADEONPrepareAccess_CS(PixmapPtr pPix, int index);
318de2362d3Smrgextern void RADEONFinishAccess_CS(PixmapPtr pPix, int index);
319de2362d3Smrgextern void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height,
320de2362d3Smrg				    int depth, int usage_hint, int bitsPerPixel,
321de2362d3Smrg				    int *new_pitch);
322de2362d3Smrgextern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv);
323de2362d3Smrgextern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix);
3240a1d3ae0Smrgextern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr secondary, void **handle_p);
32518781e08Smrgextern Bool RADEONEXASetSharedPixmapBacking(PixmapPtr ppix, void *handle);
326de2362d3Smrg#endif
327