r600_state.h revision 2f39173d
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; 53ad43ddacSmrg struct radeon_bo *bo; 54b7e1c893Smrg} cb_config_t; 55b7e1c893Smrg 56b7e1c893Smrg/* Depth buffer */ 57b7e1c893Smrgtypedef struct { 58b7e1c893Smrg int w; 59b7e1c893Smrg int h; 60b7e1c893Smrg uint64_t base; 61b7e1c893Smrg int format; 62b7e1c893Smrg int read_size; 63b7e1c893Smrg int array_mode; // tiling 64b7e1c893Smrg int tile_surface_en; 65b7e1c893Smrg int tile_compact; 66b7e1c893Smrg int zrange_precision; 67ad43ddacSmrg struct radeon_bo *bo; 68b7e1c893Smrg} db_config_t; 69b7e1c893Smrg 70b7e1c893Smrg/* Shader */ 71b7e1c893Smrgtypedef struct { 72b7e1c893Smrg uint64_t shader_addr; 73b7e1c893Smrg int num_gprs; 74b7e1c893Smrg int stack_size; 75b7e1c893Smrg int dx10_clamp; 76b7e1c893Smrg int prime_cache_pgm_en; 77b7e1c893Smrg int prime_cache_on_draw; 78b7e1c893Smrg int fetch_cache_lines; 79b7e1c893Smrg int prime_cache_en; 80b7e1c893Smrg int prime_cache_on_const; 81b7e1c893Smrg int clamp_consts; 82b7e1c893Smrg int export_mode; 83b7e1c893Smrg int uncached_first_inst; 84ad43ddacSmrg struct radeon_bo *bo; 85b7e1c893Smrg} shader_config_t; 86b7e1c893Smrg 87b7e1c893Smrg/* Vertex buffer / vtx resource */ 88b7e1c893Smrgtypedef struct { 89b7e1c893Smrg int id; 90b7e1c893Smrg uint64_t vb_addr; 91b7e1c893Smrg uint32_t vtx_num_entries; 92b7e1c893Smrg uint32_t vtx_size_dw; 93b7e1c893Smrg int clamp_x; 94b7e1c893Smrg int format; 95b7e1c893Smrg int num_format_all; 96b7e1c893Smrg int format_comp_all; 97b7e1c893Smrg int srf_mode_all; 98b7e1c893Smrg int endian; 99b7e1c893Smrg int mem_req_size; 100ad43ddacSmrg struct radeon_bo *bo; 101b7e1c893Smrg} vtx_resource_t; 102b7e1c893Smrg 103b7e1c893Smrg/* Texture resource */ 104b7e1c893Smrgtypedef struct { 105b7e1c893Smrg int id; 106b7e1c893Smrg int w; 107b7e1c893Smrg int h; 108b7e1c893Smrg int pitch; 109b7e1c893Smrg int depth; 110b7e1c893Smrg int dim; 111b7e1c893Smrg int tile_mode; 112b7e1c893Smrg int tile_type; 113b7e1c893Smrg int format; 114b7e1c893Smrg uint64_t base; 115b7e1c893Smrg uint64_t mip_base; 116b7e1c893Smrg int format_comp_x; 117b7e1c893Smrg int format_comp_y; 118b7e1c893Smrg int format_comp_z; 119b7e1c893Smrg int format_comp_w; 120b7e1c893Smrg int num_format_all; 121b7e1c893Smrg int srf_mode_all; 122b7e1c893Smrg int force_degamma; 123b7e1c893Smrg int endian; 124b7e1c893Smrg int request_size; 125b7e1c893Smrg int dst_sel_x; 126b7e1c893Smrg int dst_sel_y; 127b7e1c893Smrg int dst_sel_z; 128b7e1c893Smrg int dst_sel_w; 129b7e1c893Smrg int base_level; 130b7e1c893Smrg int last_level; 131b7e1c893Smrg int base_array; 132b7e1c893Smrg int last_array; 133b7e1c893Smrg int mpeg_clamp; 134b7e1c893Smrg int perf_modulation; 135b7e1c893Smrg int interlaced; 136ad43ddacSmrg struct radeon_bo *bo; 137ad43ddacSmrg struct radeon_bo *mip_bo; 138b7e1c893Smrg} tex_resource_t; 139b7e1c893Smrg 140b7e1c893Smrg/* Texture sampler */ 141b7e1c893Smrgtypedef struct { 142b7e1c893Smrg int id; 143b7e1c893Smrg /* Clamping */ 144b7e1c893Smrg int clamp_x, clamp_y, clamp_z; 145b7e1c893Smrg int border_color; 146b7e1c893Smrg /* Filtering */ 147b7e1c893Smrg int xy_mag_filter, xy_min_filter; 148b7e1c893Smrg int z_filter; 149b7e1c893Smrg int mip_filter; 150b7e1c893Smrg bool_t high_precision_filter; /* ? */ 151b7e1c893Smrg int perf_mip; /* ? 0-7 */ 152b7e1c893Smrg int perf_z; /* ? 3 */ 153b7e1c893Smrg /* LoD selection */ 154b7e1c893Smrg int min_lod, max_lod; /* 0-0x3ff */ 155b7e1c893Smrg int lod_bias; /* 0-0xfff (signed?) */ 156b7e1c893Smrg int lod_bias2; /* ? 0-0xfff (signed?) */ 157b7e1c893Smrg bool_t lod_uses_minor_axis; /* ? */ 158b7e1c893Smrg /* Other stuff */ 159b7e1c893Smrg bool_t point_sampling_clamp; /* ? */ 160b7e1c893Smrg bool_t tex_array_override; /* ? */ 161b7e1c893Smrg bool_t mc_coord_truncate; /* ? */ 162b7e1c893Smrg bool_t force_degamma; /* ? */ 163b7e1c893Smrg bool_t fetch_4; /* ? */ 164b7e1c893Smrg bool_t sample_is_pcf; /* ? */ 165b7e1c893Smrg bool_t type; /* ? */ 166b7e1c893Smrg int depth_compare; /* only depth textures? */ 167b7e1c893Smrg int chroma_key; 168b7e1c893Smrg} tex_sampler_t; 169b7e1c893Smrg 170b7e1c893Smrg/* Draw command */ 171b7e1c893Smrgtypedef struct { 172b7e1c893Smrg uint32_t prim_type; 173b7e1c893Smrg uint32_t vgt_draw_initiator; 174b7e1c893Smrg uint32_t index_type; 175b7e1c893Smrg uint32_t num_instances; 176b7e1c893Smrg uint32_t num_indices; 177b7e1c893Smrg} draw_config_t; 178b7e1c893Smrg 179ad43ddacSmrg#if defined(XF86DRM_MODE) 180ad43ddacSmrg#define BEGIN_BATCH(n) \ 181ad43ddacSmrgdo { \ 182ad43ddacSmrg if (info->cs) \ 183ad43ddacSmrg radeon_ddx_cs_start(pScrn, (n), __FILE__, __func__, __LINE__); \ 184ad43ddacSmrg} while(0) 185ad43ddacSmrg#define END_BATCH() \ 186ad43ddacSmrgdo { \ 187ad43ddacSmrg if (info->cs) \ 188ad43ddacSmrg radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); \ 189ad43ddacSmrg} while(0) 190ad43ddacSmrg#define RELOC_BATCH(bo, rd, wd) \ 191ad43ddacSmrgdo { \ 192ad43ddacSmrg if (info->cs) { \ 193ad43ddacSmrg int _ret; \ 194ad43ddacSmrg _ret = radeon_cs_write_reloc(info->cs, (bo), (rd), (wd), 0); \ 195ad43ddacSmrg if (_ret) ErrorF("reloc emit failure %d (%s %d)\n", _ret, __func__, __LINE__); \ 196ad43ddacSmrg } \ 197ad43ddacSmrg} while(0) 198ad43ddacSmrg#define E32(ib, dword) \ 199ad43ddacSmrgdo { \ 200ad43ddacSmrg if (info->cs) \ 201ad43ddacSmrg radeon_cs_write_dword(info->cs, (dword)); \ 202ad43ddacSmrg else { \ 203ad43ddacSmrg uint32_t *ib_head = (pointer)(char*)(ib)->address; \ 204ad43ddacSmrg ib_head[(ib)->used >> 2] = (dword); \ 205ad43ddacSmrg (ib)->used += 4; \ 206ad43ddacSmrg } \ 207ad43ddacSmrg} while (0) 208ad43ddacSmrg#else 209ad43ddacSmrg#define BEGIN_BATCH(n) do {(void)info;} while(0) 210ad43ddacSmrg#define END_BATCH() do {} while(0) 211ad43ddacSmrg#define RELOC_BATCH(bo, wd, rd) do {} while(0) 212b7e1c893Smrg#define E32(ib, dword) \ 213b7e1c893Smrgdo { \ 214b7e1c893Smrg uint32_t *ib_head = (pointer)(char*)(ib)->address; \ 215b7e1c893Smrg ib_head[(ib)->used >> 2] = (dword); \ 216b7e1c893Smrg (ib)->used += 4; \ 217b7e1c893Smrg} while (0) 218ad43ddacSmrg#endif 219b7e1c893Smrg 220b7e1c893Smrg#define EFLOAT(ib, val) \ 221b7e1c893Smrgdo { \ 222b7e1c893Smrg union { float f; uint32_t d; } a; \ 223b7e1c893Smrg a.f = (val); \ 224b7e1c893Smrg E32((ib), a.d); \ 225b7e1c893Smrg} while (0) 226b7e1c893Smrg 227b7e1c893Smrg#define PACK3(ib, cmd, num) \ 228b7e1c893Smrgdo { \ 229b7e1c893Smrg E32((ib), RADEON_CP_PACKET3 | ((cmd) << 8) | ((((num) - 1) & 0x3fff) << 16)); \ 230b7e1c893Smrg} while (0) 231b7e1c893Smrg 232b7e1c893Smrg/* write num registers, start at reg */ 233b7e1c893Smrg/* If register falls in a special area, special commands are issued */ 234b7e1c893Smrg#define PACK0(ib, reg, num) \ 235b7e1c893Smrgdo { \ 236b7e1c893Smrg if ((reg) >= SET_CONFIG_REG_offset && (reg) < SET_CONFIG_REG_end) { \ 237b7e1c893Smrg PACK3((ib), IT_SET_CONFIG_REG, (num) + 1); \ 2382f39173dSmrg E32((ib), ((reg) - SET_CONFIG_REG_offset) >> 2); \ 239b7e1c893Smrg } else if ((reg) >= SET_CONTEXT_REG_offset && (reg) < SET_CONTEXT_REG_end) { \ 240c503f109Smrg PACK3((ib), IT_SET_CONTEXT_REG, (num) + 1); \ 2412f39173dSmrg E32((ib), ((reg) - SET_CONTEXT_REG_offset) >> 2); \ 242b7e1c893Smrg } else if ((reg) >= SET_ALU_CONST_offset && (reg) < SET_ALU_CONST_end) { \ 243b7e1c893Smrg PACK3((ib), IT_SET_ALU_CONST, (num) + 1); \ 2442f39173dSmrg E32((ib), ((reg) - SET_ALU_CONST_offset) >> 2); \ 245b7e1c893Smrg } else if ((reg) >= SET_RESOURCE_offset && (reg) < SET_RESOURCE_end) { \ 246b7e1c893Smrg PACK3((ib), IT_SET_RESOURCE, num + 1); \ 247b7e1c893Smrg E32((ib), ((reg) - SET_RESOURCE_offset) >> 2); \ 248b7e1c893Smrg } else if ((reg) >= SET_SAMPLER_offset && (reg) < SET_SAMPLER_end) { \ 249b7e1c893Smrg PACK3((ib), IT_SET_SAMPLER, (num) + 1); \ 250b7e1c893Smrg E32((ib), (reg - SET_SAMPLER_offset) >> 2); \ 251b7e1c893Smrg } else if ((reg) >= SET_CTL_CONST_offset && (reg) < SET_CTL_CONST_end) { \ 252b7e1c893Smrg PACK3((ib), IT_SET_CTL_CONST, (num) + 1); \ 253b7e1c893Smrg E32((ib), ((reg) - SET_CTL_CONST_offset) >> 2); \ 254b7e1c893Smrg } else if ((reg) >= SET_LOOP_CONST_offset && (reg) < SET_LOOP_CONST_end) { \ 255b7e1c893Smrg PACK3((ib), IT_SET_LOOP_CONST, (num) + 1); \ 256b7e1c893Smrg E32((ib), ((reg) - SET_LOOP_CONST_offset) >> 2); \ 257b7e1c893Smrg } else if ((reg) >= SET_BOOL_CONST_offset && (reg) < SET_BOOL_CONST_end) { \ 258b7e1c893Smrg PACK3((ib), IT_SET_BOOL_CONST, (num) + 1); \ 259b7e1c893Smrg E32((ib), ((reg) - SET_BOOL_CONST_offset) >> 2); \ 260b7e1c893Smrg } else { \ 261b7e1c893Smrg E32((ib), CP_PACKET0 ((reg), (num) - 1)); \ 262b7e1c893Smrg } \ 263b7e1c893Smrg} while (0) 264b7e1c893Smrg 265b7e1c893Smrg/* write a single register */ 266b7e1c893Smrg#define EREG(ib, reg, val) \ 267b7e1c893Smrgdo { \ 268b7e1c893Smrg PACK0((ib), (reg), 1); \ 269b7e1c893Smrg E32((ib), (val)); \ 270b7e1c893Smrg} while (0) 271b7e1c893Smrg 272b7e1c893Smrgvoid R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib); 273b7e1c893Smrgvoid R600IBDiscard(ScrnInfoPtr pScrn, drmBufPtr ib); 274b7e1c893Smrg 275b7e1c893Smrguint64_t 276b7e1c893Smrgupload (ScrnInfoPtr pScrn, void *shader, int size, int offset); 277b7e1c893Smrgvoid 278b7e1c893Smrgwait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib); 279b7e1c893Smrgvoid 280b7e1c893Smrgwait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib); 281b7e1c893Smrgvoid 282b7e1c893Smrgstart_3d(ScrnInfoPtr pScrn, drmBufPtr ib); 283b7e1c893Smrgvoid 284ad43ddacSmrgset_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf, uint32_t domain); 285b7e1c893Smrgvoid 286ad43ddacSmrgcp_set_surface_sync(ScrnInfoPtr pScrn, drmBufPtr ib, uint32_t sync_type, uint32_t size, uint64_t mc_addr, 287ad43ddacSmrg struct radeon_bo *bo, uint32_t rdomains, uint32_t wdomain); 288b7e1c893Smrgvoid 289ad43ddacSmrgcp_wait_vline_sync(ScrnInfoPtr pScrn, drmBufPtr ib, PixmapPtr pPix, xf86CrtcPtr crtc, int start, int stop); 290b7e1c893Smrgvoid 291ad43ddacSmrgfs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf, uint32_t domain); 292b7e1c893Smrgvoid 293ad43ddacSmrgvs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf, uint32_t domain); 294b7e1c893Smrgvoid 295ad43ddacSmrgps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf, uint32_t domain); 296b7e1c893Smrgvoid 297b7e1c893Smrgset_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf); 298b7e1c893Smrgvoid 299b7e1c893Smrgset_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val); 300b7e1c893Smrgvoid 301ad43ddacSmrgset_vtx_resource(ScrnInfoPtr pScrn, drmBufPtr ib, vtx_resource_t *res, uint32_t domain); 302b7e1c893Smrgvoid 303ad43ddacSmrgset_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res, uint32_t domain); 304b7e1c893Smrgvoid 305b7e1c893Smrgset_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s); 306b7e1c893Smrgvoid 307b7e1c893Smrgset_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 308b7e1c893Smrgvoid 309b7e1c893Smrgset_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); 310b7e1c893Smrgvoid 311b7e1c893Smrgset_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 312b7e1c893Smrgvoid 313b7e1c893Smrgset_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 314b7e1c893Smrgvoid 315b7e1c893Smrgset_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); 316b7e1c893Smrgvoid 317b7e1c893Smrgset_default_state(ScrnInfoPtr pScrn, drmBufPtr ib); 318b7e1c893Smrgvoid 319b7e1c893Smrgdraw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices); 320b7e1c893Smrgvoid 321b7e1c893Smrgdraw_auto(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf); 322b7e1c893Smrg 323ad43ddacSmrgBool 324ad43ddacSmrgr600_vb_get(ScrnInfoPtr pScrn); 325ad43ddacSmrgvoid 326ad43ddacSmrgr600_vb_discard(ScrnInfoPtr pScrn); 327ad43ddacSmrgint 328ad43ddacSmrgr600_cp_start(ScrnInfoPtr pScrn); 329ad43ddacSmrgvoid r600_finish_op(ScrnInfoPtr pScrn, int vtx_size); 330ad43ddacSmrg 331ad43ddacSmrgBool 332ad43ddacSmrgR600SetAccelState(ScrnInfoPtr pScrn, 333ad43ddacSmrg struct r600_accel_object *src0, 334ad43ddacSmrg struct r600_accel_object *src1, 335ad43ddacSmrg struct r600_accel_object *dst, 336ad43ddacSmrg uint32_t vs_offset, uint32_t ps_offset, 337ad43ddacSmrg int rop, Pixel planemask); 338ad43ddacSmrg 339ad43ddacSmrgextern Bool RADEONPrepareAccess_CS(PixmapPtr pPix, int index); 340ad43ddacSmrgextern void RADEONFinishAccess_CS(PixmapPtr pPix, int index); 341ad43ddacSmrgextern void *RADEONEXACreatePixmap(ScreenPtr pScreen, int size, int align); 342ad43ddacSmrgextern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv); 343ad43ddacSmrgextern struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix); 344ad43ddacSmrgextern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix); 345ad43ddacSmrg 346ad43ddacSmrg 347b7e1c893Smrg#endif 348