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; 5943df4709Smrg#ifdef XF86DRM_MODE 6040732134Srjs struct radeon_surface *surface; 6143df4709Smrg#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; 14843df4709Smrg#ifdef XF86DRM_MODE 14940732134Srjs struct radeon_surface *surface; 15043df4709Smrg#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 19243df4709Smrg#if defined(XF86DRM_MODE) 193ad43ddacSmrg#define BEGIN_BATCH(n) \ 194ad43ddacSmrgdo { \ 19543df4709Smrg if (info->cs) \ 19643df4709Smrg radeon_ddx_cs_start(pScrn, (n), __FILE__, __func__, __LINE__); \ 197ad43ddacSmrg} while(0) 198ad43ddacSmrg#define END_BATCH() \ 199ad43ddacSmrgdo { \ 20043df4709Smrg if (info->cs) \ 20143df4709Smrg radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); \ 202ad43ddacSmrg} while(0) 203ad43ddacSmrg#define RELOC_BATCH(bo, rd, wd) \ 204ad43ddacSmrgdo { \ 20543df4709Smrg if (info->cs) { \ 20643df4709Smrg int _ret; \ 20743df4709Smrg _ret = radeon_cs_write_reloc(info->cs, (bo), (rd), (wd), 0); \ 20843df4709Smrg if (_ret) ErrorF("reloc emit failure %d (%s %d)\n", _ret, __func__, __LINE__); \ 20943df4709Smrg } \ 210ad43ddacSmrg} while(0) 21143df4709Smrg#define E32(ib, dword) \ 212ad43ddacSmrgdo { \ 21343df4709Smrg if (info->cs) \ 21443df4709Smrg radeon_cs_write_dword(info->cs, (dword)); \ 21543df4709Smrg else { \ 21643df4709Smrg uint32_t *ib_head = (pointer)(char*)(ib)->address; \ 21743df4709Smrg ib_head[(ib)->used >> 2] = (dword); \ 21843df4709Smrg (ib)->used += 4; \ 21943df4709Smrg } \ 220ad43ddacSmrg} while (0) 22143df4709Smrg#else 22243df4709Smrg#define BEGIN_BATCH(n) do {(void)info;} while(0) 22343df4709Smrg#define END_BATCH() do {} while(0) 22443df4709Smrg#define RELOC_BATCH(bo, wd, rd) do {} while(0) 22543df4709Smrg#define E32(ib, dword) \ 22643df4709Smrgdo { \ 22743df4709Smrg uint32_t *ib_head = (pointer)(char*)(ib)->address; \ 22843df4709Smrg ib_head[(ib)->used >> 2] = (dword); \ 22943df4709Smrg (ib)->used += 4; \ 23043df4709Smrg} while (0) 23143df4709Smrg#endif 232b7e1c893Smrg 23343df4709Smrg#define EFLOAT(ib, val) \ 234b7e1c893Smrgdo { \ 235b7e1c893Smrg union { float f; uint32_t d; } a; \ 236b7e1c893Smrg a.f = (val); \ 23743df4709Smrg E32((ib), a.d); \ 238b7e1c893Smrg} while (0) 239b7e1c893Smrg 24043df4709Smrg#define PACK3(ib, cmd, num) \ 241b7e1c893Smrgdo { \ 24243df4709Smrg 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 */ 24743df4709Smrg#define PACK0(ib, reg, num) \ 248b7e1c893Smrgdo { \ 249b7e1c893Smrg if ((reg) >= SET_CONFIG_REG_offset && (reg) < SET_CONFIG_REG_end) { \ 25043df4709Smrg PACK3((ib), IT_SET_CONFIG_REG, (num) + 1); \ 25143df4709Smrg E32((ib), ((reg) - SET_CONFIG_REG_offset) >> 2); \ 252b7e1c893Smrg } else if ((reg) >= SET_CONTEXT_REG_offset && (reg) < SET_CONTEXT_REG_end) { \ 25343df4709Smrg PACK3((ib), IT_SET_CONTEXT_REG, (num) + 1); \ 25443df4709Smrg E32((ib), ((reg) - SET_CONTEXT_REG_offset) >> 2); \ 255b7e1c893Smrg } else if ((reg) >= SET_ALU_CONST_offset && (reg) < SET_ALU_CONST_end) { \ 25643df4709Smrg PACK3((ib), IT_SET_ALU_CONST, (num) + 1); \ 25743df4709Smrg E32((ib), ((reg) - SET_ALU_CONST_offset) >> 2); \ 258b7e1c893Smrg } else if ((reg) >= SET_RESOURCE_offset && (reg) < SET_RESOURCE_end) { \ 25943df4709Smrg PACK3((ib), IT_SET_RESOURCE, num + 1); \ 26043df4709Smrg E32((ib), ((reg) - SET_RESOURCE_offset) >> 2); \ 261b7e1c893Smrg } else if ((reg) >= SET_SAMPLER_offset && (reg) < SET_SAMPLER_end) { \ 26243df4709Smrg PACK3((ib), IT_SET_SAMPLER, (num) + 1); \ 26343df4709Smrg E32((ib), (reg - SET_SAMPLER_offset) >> 2); \ 264b7e1c893Smrg } else if ((reg) >= SET_CTL_CONST_offset && (reg) < SET_CTL_CONST_end) { \ 26543df4709Smrg PACK3((ib), IT_SET_CTL_CONST, (num) + 1); \ 26643df4709Smrg E32((ib), ((reg) - SET_CTL_CONST_offset) >> 2); \ 267b7e1c893Smrg } else if ((reg) >= SET_LOOP_CONST_offset && (reg) < SET_LOOP_CONST_end) { \ 26843df4709Smrg PACK3((ib), IT_SET_LOOP_CONST, (num) + 1); \ 26943df4709Smrg E32((ib), ((reg) - SET_LOOP_CONST_offset) >> 2); \ 270b7e1c893Smrg } else if ((reg) >= SET_BOOL_CONST_offset && (reg) < SET_BOOL_CONST_end) { \ 27143df4709Smrg PACK3((ib), IT_SET_BOOL_CONST, (num) + 1); \ 27243df4709Smrg E32((ib), ((reg) - SET_BOOL_CONST_offset) >> 2); \ 273b7e1c893Smrg } else { \ 27443df4709Smrg E32((ib), CP_PACKET0 ((reg), (num) - 1)); \ 275b7e1c893Smrg } \ 276b7e1c893Smrg} while (0) 277b7e1c893Smrg 278b7e1c893Smrg/* write a single register */ 27943df4709Smrg#define EREG(ib, reg, val) \ 280b7e1c893Smrgdo { \ 28143df4709Smrg PACK0((ib), (reg), 1); \ 28243df4709Smrg E32((ib), (val)); \ 283b7e1c893Smrg} while (0) 284b7e1c893Smrg 28543df4709Smrgvoid R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib); 28643df4709Smrgvoid R600IBDiscard(ScrnInfoPtr pScrn, drmBufPtr ib); 287b7e1c893Smrg 288b7e1c893Smrgvoid 28943df4709Smrgr600_wait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib); 290b7e1c893Smrgvoid 29143df4709Smrgr600_wait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib); 292b7e1c893Smrgvoid 29343df4709Smrgr600_start_3d(ScrnInfoPtr pScrn, drmBufPtr ib); 294b7e1c893Smrgvoid 29543df4709Smrgr600_set_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf, uint32_t domain); 296b7e1c893Smrgvoid 29743df4709Smrgr600_cp_wait_vline_sync(ScrnInfoPtr pScrn, drmBufPtr ib, PixmapPtr pPix, xf86CrtcPtr crtc, int start, int stop); 298b7e1c893Smrgvoid 29943df4709Smrgr600_set_spi(ScrnInfoPtr pScrn, drmBufPtr ib, int vs_export_count, int num_interp); 300b13dfe66Smrgvoid 30143df4709Smrgr600_fs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf, uint32_t domain); 302b7e1c893Smrgvoid 30343df4709Smrgr600_vs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf, uint32_t domain); 304b7e1c893Smrgvoid 30543df4709Smrgr600_ps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf, uint32_t domain); 306b7e1c893Smrgvoid 30743df4709Smrgr600_set_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf); 308b7e1c893Smrgvoid 30943df4709Smrgr600_set_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val); 310b7e1c893Smrgvoid 31143df4709Smrgr600_set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res, uint32_t domain); 312b7e1c893Smrgvoid 31343df4709Smrgr600_set_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s); 314b7e1c893Smrgvoid 31543df4709Smrgr600_set_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 316b7e1c893Smrgvoid 31743df4709Smrgr600_set_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); 318b7e1c893Smrgvoid 31943df4709Smrgr600_set_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 320b7e1c893Smrgvoid 32143df4709Smrgr600_set_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 322b7e1c893Smrgvoid 32343df4709Smrgr600_set_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); 324b7e1c893Smrgvoid 32543df4709Smrgr600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib); 326b7e1c893Smrgvoid 32743df4709Smrgr600_draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices); 328b7e1c893Smrgvoid 32943df4709Smrgr600_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); 35043df4709Smrg 35143df4709Smrg 352b7e1c893Smrg#endif 353