1de2362d3Smrg/*
2de2362d3Smrg * Copyright 2010 Advanced Micro Devices, Inc.
3de2362d3Smrg *
4de2362d3Smrg * Permission is hereby granted, free of charge, to any person obtaining a
5de2362d3Smrg * copy of this software and associated documentation files (the "Software"),
6de2362d3Smrg * to deal in the Software without restriction, including without limitation
7de2362d3Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8de2362d3Smrg * and/or sell copies of the Software, and to permit persons to whom the
9de2362d3Smrg * Software is furnished to do so, subject to the following conditions:
10de2362d3Smrg *
11de2362d3Smrg * The above copyright notice and this permission notice (including the next
12de2362d3Smrg * paragraph) shall be included in all copies or substantial portions of the
13de2362d3Smrg * Software.
14de2362d3Smrg *
15de2362d3Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16de2362d3Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17de2362d3Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18de2362d3Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19de2362d3Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20de2362d3Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21de2362d3Smrg * SOFTWARE.
22de2362d3Smrg *
23de2362d3Smrg * Authors: Alex Deucher <alexander.deucher@amd.com>
24de2362d3Smrg *
25de2362d3Smrg */
26de2362d3Smrg
27de2362d3Smrg#ifndef __EVERGREEN_STATE_H__
28de2362d3Smrg#define __EVERGREEN_STATE_H__
29de2362d3Smrg
30de2362d3Smrgtypedef int bool_t;
31de2362d3Smrg
32de2362d3Smrg#define CLEAR(x) memset (&x, 0, sizeof(x))
33de2362d3Smrg
34de2362d3Smrg/* Sequencer / thread handling */
35de2362d3Smrgtypedef struct {
36de2362d3Smrg    int ps_prio;
37de2362d3Smrg    int vs_prio;
38de2362d3Smrg    int gs_prio;
39de2362d3Smrg    int es_prio;
40de2362d3Smrg    int hs_prio;
41de2362d3Smrg    int ls_prio;
42de2362d3Smrg    int cs_prio;
43de2362d3Smrg    int num_ps_gprs;
44de2362d3Smrg    int num_vs_gprs;
45de2362d3Smrg    int num_gs_gprs;
46de2362d3Smrg    int num_es_gprs;
47de2362d3Smrg    int num_hs_gprs;
48de2362d3Smrg    int num_ls_gprs;
49de2362d3Smrg    int num_cs_gprs;
50de2362d3Smrg    int num_temp_gprs;
51de2362d3Smrg    int num_ps_threads;
52de2362d3Smrg    int num_vs_threads;
53de2362d3Smrg    int num_gs_threads;
54de2362d3Smrg    int num_es_threads;
55de2362d3Smrg    int num_hs_threads;
56de2362d3Smrg    int num_ls_threads;
57de2362d3Smrg    int num_ps_stack_entries;
58de2362d3Smrg    int num_vs_stack_entries;
59de2362d3Smrg    int num_gs_stack_entries;
60de2362d3Smrg    int num_es_stack_entries;
61de2362d3Smrg    int num_hs_stack_entries;
62de2362d3Smrg    int num_ls_stack_entries;
63de2362d3Smrg} sq_config_t;
64de2362d3Smrg
65de2362d3Smrg/* Color buffer / render target */
66de2362d3Smrgtypedef struct {
67de2362d3Smrg    int id;
68de2362d3Smrg    int w;
69de2362d3Smrg    int h;
70de2362d3Smrg    uint64_t base;
71de2362d3Smrg    int format;
72de2362d3Smrg    int endian;
73de2362d3Smrg    int array_mode;						// tiling
74de2362d3Smrg    int non_disp_tiling;
75de2362d3Smrg    int number_type;
76de2362d3Smrg    int read_size;
77de2362d3Smrg    int comp_swap;
78de2362d3Smrg    int tile_mode;
79de2362d3Smrg    int blend_clamp;
80de2362d3Smrg    int clear_color;
81de2362d3Smrg    int blend_bypass;
82de2362d3Smrg    int simple_float;
83de2362d3Smrg    int round_mode;
84de2362d3Smrg    int tile_compact;
85de2362d3Smrg    int source_format;
86de2362d3Smrg    int resource_type;
87de2362d3Smrg    int fast_clear;
88de2362d3Smrg    int compression;
89de2362d3Smrg    int rat;
90de2362d3Smrg    /* 2D related CB state */
91de2362d3Smrg    uint32_t pmask;
92de2362d3Smrg    int rop;
93de2362d3Smrg    int blend_enable;
94de2362d3Smrg    uint32_t blendcntl;
95de2362d3Smrg    struct radeon_bo *bo;
96de2362d3Smrg    struct radeon_surface *surface;
97de2362d3Smrg} cb_config_t;
98de2362d3Smrg
99de2362d3Smrg/* Shader */
100de2362d3Smrgtypedef struct {
101de2362d3Smrg    uint64_t shader_addr;
102de2362d3Smrg    uint32_t shader_size;
103de2362d3Smrg    int num_gprs;
104de2362d3Smrg    int stack_size;
105de2362d3Smrg    int dx10_clamp;
106de2362d3Smrg    int clamp_consts;
107de2362d3Smrg    int export_mode;
108de2362d3Smrg    int uncached_first_inst;
109de2362d3Smrg    int single_round;
110de2362d3Smrg    int double_round;
111de2362d3Smrg    int allow_sdi;
112de2362d3Smrg    int allow_sd0;
113de2362d3Smrg    int allow_ddi;
114de2362d3Smrg    int allow_ddo;
115de2362d3Smrg    struct radeon_bo *bo;
116de2362d3Smrg} shader_config_t;
117de2362d3Smrg
118de2362d3Smrg/* Shader consts */
119de2362d3Smrgtypedef struct {
120de2362d3Smrg    int type;
121de2362d3Smrg    int size_bytes;
122de2362d3Smrg    uint64_t const_addr;
123de2362d3Smrg    struct radeon_bo *bo;
124de2362d3Smrg    uint32_t *cpu_ptr;
125de2362d3Smrg} const_config_t;
126de2362d3Smrg
127de2362d3Smrg/* Vertex buffer / vtx resource */
128de2362d3Smrgtypedef struct {
129de2362d3Smrg    int id;
130de2362d3Smrg    uint64_t vb_addr;
131de2362d3Smrg    uint32_t vtx_num_entries;
132de2362d3Smrg    uint32_t vtx_size_dw;
133de2362d3Smrg    int clamp_x;
134de2362d3Smrg    int format;
135de2362d3Smrg    int num_format_all;
136de2362d3Smrg    int format_comp_all;
137de2362d3Smrg    int srf_mode_all;
138de2362d3Smrg    int endian;
139de2362d3Smrg    int mem_req_size;
140de2362d3Smrg    int dst_sel_x;
141de2362d3Smrg    int dst_sel_y;
142de2362d3Smrg    int dst_sel_z;
143de2362d3Smrg    int dst_sel_w;
144de2362d3Smrg    int uncached;
145de2362d3Smrg    struct radeon_bo *bo;
146de2362d3Smrg} vtx_resource_t;
147de2362d3Smrg
148de2362d3Smrg/* Texture resource */
149de2362d3Smrgtypedef struct {
150de2362d3Smrg    int id;
151de2362d3Smrg    int w;
152de2362d3Smrg    int h;
153de2362d3Smrg    int pitch;
154de2362d3Smrg    int depth;
155de2362d3Smrg    int dim;
156de2362d3Smrg    int array_mode;
157de2362d3Smrg    int tile_type;
158de2362d3Smrg    int format;
159de2362d3Smrg    uint64_t base;
160de2362d3Smrg    uint64_t mip_base;
161de2362d3Smrg    uint32_t size;
162de2362d3Smrg    int format_comp_x;
163de2362d3Smrg    int format_comp_y;
164de2362d3Smrg    int format_comp_z;
165de2362d3Smrg    int format_comp_w;
166de2362d3Smrg    int num_format_all;
167de2362d3Smrg    int srf_mode_all;
168de2362d3Smrg    int force_degamma;
169de2362d3Smrg    int endian;
170de2362d3Smrg    int dst_sel_x;
171de2362d3Smrg    int dst_sel_y;
172de2362d3Smrg    int dst_sel_z;
173de2362d3Smrg    int dst_sel_w;
174de2362d3Smrg    int base_level;
175de2362d3Smrg    int last_level;
176de2362d3Smrg    int base_array;
177de2362d3Smrg    int last_array;
178de2362d3Smrg    int perf_modulation;
179de2362d3Smrg    int interlaced;
180de2362d3Smrg    int min_lod;
181de2362d3Smrg    struct radeon_bo *bo;
182de2362d3Smrg    struct radeon_bo *mip_bo;
183de2362d3Smrg    struct radeon_surface *surface;
184de2362d3Smrg} tex_resource_t;
185de2362d3Smrg
186de2362d3Smrg/* Texture sampler */
187de2362d3Smrgtypedef struct {
188de2362d3Smrg    int				id;
189de2362d3Smrg    /* Clamping */
190de2362d3Smrg    int				clamp_x, clamp_y, clamp_z;
191de2362d3Smrg    int		       		border_color;
192de2362d3Smrg    /* Filtering */
193de2362d3Smrg    int				xy_mag_filter, xy_min_filter;
194de2362d3Smrg    int				z_filter;
195de2362d3Smrg    int				mip_filter;
196de2362d3Smrg    bool_t			high_precision_filter;	/* ? */
197de2362d3Smrg    int				perf_mip;		/* ? 0-7 */
198de2362d3Smrg    int				perf_z;			/* ? 3 */
199de2362d3Smrg    /* LoD selection */
200de2362d3Smrg    int				min_lod, max_lod;	/* 0-0x3ff */
201de2362d3Smrg    int                         lod_bias;		/* 0-0xfff (signed?) */
202de2362d3Smrg    int                         lod_bias2;		/* ? 0-0xfff (signed?) */
203de2362d3Smrg    bool_t			lod_uses_minor_axis;	/* ? */
204de2362d3Smrg    /* Other stuff */
205de2362d3Smrg    bool_t			point_sampling_clamp;	/* ? */
206de2362d3Smrg    bool_t			tex_array_override;	/* ? */
207de2362d3Smrg    bool_t                      mc_coord_truncate;	/* ? */
208de2362d3Smrg    bool_t			force_degamma;		/* ? */
209de2362d3Smrg    bool_t			fetch_4;		/* ? */
210de2362d3Smrg    bool_t			sample_is_pcf;		/* ? */
211de2362d3Smrg    bool_t			type;			/* ? */
212de2362d3Smrg    int				depth_compare;		/* only depth textures? */
213de2362d3Smrg    int				chroma_key;
214de2362d3Smrg    int                         truncate_coord;
215de2362d3Smrg    bool_t                      disable_cube_wrap;
216de2362d3Smrg} tex_sampler_t;
217de2362d3Smrg
218de2362d3Smrg/* Draw command */
219de2362d3Smrgtypedef struct {
220de2362d3Smrg    uint32_t prim_type;
221de2362d3Smrg    uint32_t vgt_draw_initiator;
222de2362d3Smrg    uint32_t index_type;
223de2362d3Smrg    uint32_t num_instances;
224de2362d3Smrg    uint32_t num_indices;
225de2362d3Smrg} draw_config_t;
226de2362d3Smrg
227de2362d3Smrg#define BEGIN_BATCH(n)			\
228de2362d3Smrgdo {								\
229de2362d3Smrg    radeon_ddx_cs_start(pScrn, (n), __FILE__, __func__, __LINE__);	\
230de2362d3Smrg} while(0)
231de2362d3Smrg#define END_BATCH()			\
232de2362d3Smrgdo {					\
233de2362d3Smrg    radeon_cs_end(info->cs, __FILE__, __func__, __LINE__);	\
234de2362d3Smrg} while(0)
235de2362d3Smrg#define RELOC_BATCH(bo, rd, wd)				\
236de2362d3Smrgdo {							\
237de2362d3Smrg    int _ret;								\
238de2362d3Smrg    _ret = radeon_cs_write_reloc(info->cs, (bo), (rd), (wd), 0);	\
239de2362d3Smrg    if (_ret) ErrorF("reloc emit failure %d (%s %d)\n", _ret, __func__, __LINE__); \
240de2362d3Smrg} while(0)
241de2362d3Smrg#define E32(dword)                                                  \
242de2362d3Smrgdo {                                                                    \
243de2362d3Smrg    radeon_cs_write_dword(info->cs, (dword));				\
244de2362d3Smrg} while (0)
245de2362d3Smrg
246de2362d3Smrg#define EFLOAT(val)							\
247de2362d3Smrgdo {								\
248de2362d3Smrg    union { float f; uint32_t d; } a;                                   \
249de2362d3Smrg    a.f = (val);							\
250de2362d3Smrg    E32(a.d);							\
251de2362d3Smrg} while (0)
252de2362d3Smrg
253de2362d3Smrg#define PACK3(cmd, num)	       					\
254de2362d3Smrgdo {                                                                    \
255de2362d3Smrg    E32(RADEON_CP_PACKET3 | ((cmd) << 8) | ((((num) - 1) & 0x3fff) << 16)); \
256de2362d3Smrg} while (0)
257de2362d3Smrg
258de2362d3Smrg/* write num registers, start at reg */
259de2362d3Smrg/* If register falls in a special area, special commands are issued */
260de2362d3Smrg#define PACK0(reg, num)                                             \
261de2362d3Smrgdo {                                                                    \
262de2362d3Smrg    if ((reg) >= SET_CONFIG_REG_offset && (reg) < SET_CONFIG_REG_end) {	\
263de2362d3Smrg	PACK3(IT_SET_CONFIG_REG, (num) + 1);			\
264de2362d3Smrg	E32(((reg) - SET_CONFIG_REG_offset) >> 2);                  \
265de2362d3Smrg    } else if ((reg) >= SET_CONTEXT_REG_offset && (reg) < SET_CONTEXT_REG_end) { \
266de2362d3Smrg	PACK3(IT_SET_CONTEXT_REG, (num) + 1);			\
267de2362d3Smrg	E32(((reg) - SET_CONTEXT_REG_offset) >> 2);			\
268de2362d3Smrg    } else if ((reg) >= SET_RESOURCE_offset && (reg) < SET_RESOURCE_end) { \
269de2362d3Smrg	PACK3(IT_SET_RESOURCE, num + 1);				\
270de2362d3Smrg	E32(((reg) - SET_RESOURCE_offset) >> 2);			\
271de2362d3Smrg    } else if ((reg) >= SET_SAMPLER_offset && (reg) < SET_SAMPLER_end) { \
272de2362d3Smrg	PACK3(IT_SET_SAMPLER, (num) + 1);				\
273de2362d3Smrg	E32((reg - SET_SAMPLER_offset) >> 2);			\
274de2362d3Smrg    } else if ((reg) >= SET_CTL_CONST_offset && (reg) < SET_CTL_CONST_end) { \
275de2362d3Smrg	PACK3(IT_SET_CTL_CONST, (num) + 1);			\
276de2362d3Smrg	E32(((reg) - SET_CTL_CONST_offset) >> 2);		\
277de2362d3Smrg    } else if ((reg) >= SET_LOOP_CONST_offset && (reg) < SET_LOOP_CONST_end) { \
278de2362d3Smrg	PACK3(IT_SET_LOOP_CONST, (num) + 1);			\
279de2362d3Smrg	E32(((reg) - SET_LOOP_CONST_offset) >> 2);		\
280de2362d3Smrg    } else if ((reg) >= SET_BOOL_CONST_offset && (reg) < SET_BOOL_CONST_end) { \
281de2362d3Smrg	PACK3(IT_SET_BOOL_CONST, (num) + 1);			\
282de2362d3Smrg	E32(((reg) - SET_BOOL_CONST_offset) >> 2);		\
283de2362d3Smrg    } else {								\
284de2362d3Smrg	E32(CP_PACKET0 ((reg), (num) - 1));			\
285de2362d3Smrg    }									\
286de2362d3Smrg} while (0)
287de2362d3Smrg
288de2362d3Smrg/* write a single register */
289de2362d3Smrg#define EREG(reg, val)                                              \
290de2362d3Smrgdo {								        \
291de2362d3Smrg    PACK0((reg), 1);						\
292de2362d3Smrg    E32((val));							\
293de2362d3Smrg} while (0)
294de2362d3Smrg
295de2362d3Smrgvoid
296de2362d3Smrgevergreen_start_3d(ScrnInfoPtr pScrn);
297de2362d3Smrgvoid
298de2362d3Smrgevergreen_set_render_target(ScrnInfoPtr pScrn, cb_config_t *cb_conf, uint32_t domain);
299de2362d3Smrgvoid
30018781e08Smrgevergreen_set_blend_color(ScrnInfoPtr pScrn, float *color);
30118781e08Smrgvoid
302de2362d3Smrgevergreen_cp_wait_vline_sync(ScrnInfoPtr pScrn, PixmapPtr pPix, xf86CrtcPtr crtc, int start, int stop);
303de2362d3Smrgvoid
304de2362d3Smrgevergreen_set_spi(ScrnInfoPtr pScrn, int vs_export_count, int num_interp);
305de2362d3Smrgvoid
306de2362d3Smrgevergreen_fs_setup(ScrnInfoPtr pScrn, shader_config_t *fs_conf, uint32_t domain);
307de2362d3Smrgvoid
308de2362d3Smrgevergreen_vs_setup(ScrnInfoPtr pScrn, shader_config_t *vs_conf, uint32_t domain);
309de2362d3Smrgvoid
310de2362d3Smrgevergreen_ps_setup(ScrnInfoPtr pScrn, shader_config_t *ps_conf, uint32_t domain);
311de2362d3Smrgvoid
312de2362d3Smrgevergreen_set_alu_consts(ScrnInfoPtr pScrn, const_config_t *const_conf, uint32_t domain);
313de2362d3Smrgvoid
314de2362d3Smrgevergreen_set_bool_consts(ScrnInfoPtr pScrn, int offset, uint32_t val);
315de2362d3Smrgvoid
316de2362d3Smrgevergreen_set_tex_resource(ScrnInfoPtr pScrn, tex_resource_t *tex_res, uint32_t domain);
317de2362d3Smrgvoid
318de2362d3Smrgevergreen_set_tex_sampler(ScrnInfoPtr pScrn, tex_sampler_t *s);
319de2362d3Smrgvoid
320de2362d3Smrgevergreen_set_screen_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2);
321de2362d3Smrgvoid
322de2362d3Smrgevergreen_set_vport_scissor(ScrnInfoPtr pScrn, int id, int x1, int y1, int x2, int y2);
323de2362d3Smrgvoid
324de2362d3Smrgevergreen_set_generic_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2);
325de2362d3Smrgvoid
326de2362d3Smrgevergreen_set_window_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2);
327de2362d3Smrgvoid
328de2362d3Smrgevergreen_set_clip_rect(ScrnInfoPtr pScrn, int id, int x1, int y1, int x2, int y2);
329de2362d3Smrgvoid
330de2362d3Smrgevergreen_set_default_state(ScrnInfoPtr pScrn);
331de2362d3Smrgvoid
332de2362d3Smrgcayman_set_default_state(ScrnInfoPtr pScrn);
333de2362d3Smrgvoid
334de2362d3Smrgevergreen_draw_auto(ScrnInfoPtr pScrn, draw_config_t *draw_conf);
335de2362d3Smrg
336de2362d3Smrgvoid evergreen_finish_op(ScrnInfoPtr pScrn, int vtx_size);
337de2362d3Smrg
338de2362d3Smrgextern Bool
339de2362d3SmrgR600SetAccelState(ScrnInfoPtr pScrn,
340de2362d3Smrg		  struct r600_accel_object *src0,
341de2362d3Smrg		  struct r600_accel_object *src1,
342de2362d3Smrg		  struct r600_accel_object *dst,
343de2362d3Smrg		  uint32_t vs_offset, uint32_t ps_offset,
344de2362d3Smrg		  int rop, Pixel planemask);
345de2362d3Smrg
346de2362d3Smrgextern Bool RADEONPrepareAccess_CS(PixmapPtr pPix, int index);
347de2362d3Smrgextern void RADEONFinishAccess_CS(PixmapPtr pPix, int index);
348de2362d3Smrgextern void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height,
349de2362d3Smrg				    int depth, int usage_hint, int bitsPerPixel,
350de2362d3Smrg				    int *new_pitch);
351de2362d3Smrgextern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv);
352de2362d3Smrgextern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix);
3530a1d3ae0Smrgextern Bool RADEONEXASharePixmapBacking(PixmapPtr ppix, ScreenPtr secondary, void **handle_p);
35418781e08Smrgextern Bool RADEONEXASetSharedPixmapBacking(PixmapPtr ppix, void *handle);
355de2362d3Smrg
356de2362d3Smrg#endif
357