r600_state.h revision 921a55d8
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; 730974d292Smrg uint32_t shader_size; 74b7e1c893Smrg int num_gprs; 75b7e1c893Smrg int stack_size; 76b7e1c893Smrg int dx10_clamp; 77b7e1c893Smrg int prime_cache_pgm_en; 78b7e1c893Smrg int prime_cache_on_draw; 79b7e1c893Smrg int fetch_cache_lines; 80b7e1c893Smrg int prime_cache_en; 81b7e1c893Smrg int prime_cache_on_const; 82b7e1c893Smrg int clamp_consts; 83b7e1c893Smrg int export_mode; 84b7e1c893Smrg int uncached_first_inst; 85ad43ddacSmrg struct radeon_bo *bo; 86b7e1c893Smrg} shader_config_t; 87b7e1c893Smrg 88b7e1c893Smrg/* Vertex buffer / vtx resource */ 89b7e1c893Smrgtypedef struct { 90b7e1c893Smrg int id; 91b7e1c893Smrg uint64_t vb_addr; 92b7e1c893Smrg uint32_t vtx_num_entries; 93b7e1c893Smrg uint32_t vtx_size_dw; 94b7e1c893Smrg int clamp_x; 95b7e1c893Smrg int format; 96b7e1c893Smrg int num_format_all; 97b7e1c893Smrg int format_comp_all; 98b7e1c893Smrg int srf_mode_all; 99b7e1c893Smrg int endian; 100b7e1c893Smrg int mem_req_size; 101ad43ddacSmrg struct radeon_bo *bo; 102b7e1c893Smrg} vtx_resource_t; 103b7e1c893Smrg 104b7e1c893Smrg/* Texture resource */ 105b7e1c893Smrgtypedef struct { 106b7e1c893Smrg int id; 107b7e1c893Smrg int w; 108b7e1c893Smrg int h; 109b7e1c893Smrg int pitch; 110b7e1c893Smrg int depth; 111b7e1c893Smrg int dim; 112b7e1c893Smrg int tile_mode; 113b7e1c893Smrg int tile_type; 114b7e1c893Smrg int format; 115b7e1c893Smrg uint64_t base; 116b7e1c893Smrg uint64_t mip_base; 1170974d292Smrg uint32_t size; 118b7e1c893Smrg int format_comp_x; 119b7e1c893Smrg int format_comp_y; 120b7e1c893Smrg int format_comp_z; 121b7e1c893Smrg int format_comp_w; 122b7e1c893Smrg int num_format_all; 123b7e1c893Smrg int srf_mode_all; 124b7e1c893Smrg int force_degamma; 125b7e1c893Smrg int endian; 126b7e1c893Smrg int request_size; 127b7e1c893Smrg int dst_sel_x; 128b7e1c893Smrg int dst_sel_y; 129b7e1c893Smrg int dst_sel_z; 130b7e1c893Smrg int dst_sel_w; 131b7e1c893Smrg int base_level; 132b7e1c893Smrg int last_level; 133b7e1c893Smrg int base_array; 134b7e1c893Smrg int last_array; 135b7e1c893Smrg int mpeg_clamp; 136b7e1c893Smrg int perf_modulation; 137b7e1c893Smrg int interlaced; 138ad43ddacSmrg struct radeon_bo *bo; 139ad43ddacSmrg struct radeon_bo *mip_bo; 140b7e1c893Smrg} tex_resource_t; 141b7e1c893Smrg 142b7e1c893Smrg/* Texture sampler */ 143b7e1c893Smrgtypedef struct { 144b7e1c893Smrg int id; 145b7e1c893Smrg /* Clamping */ 146b7e1c893Smrg int clamp_x, clamp_y, clamp_z; 147b7e1c893Smrg int border_color; 148b7e1c893Smrg /* Filtering */ 149b7e1c893Smrg int xy_mag_filter, xy_min_filter; 150b7e1c893Smrg int z_filter; 151b7e1c893Smrg int mip_filter; 152b7e1c893Smrg bool_t high_precision_filter; /* ? */ 153b7e1c893Smrg int perf_mip; /* ? 0-7 */ 154b7e1c893Smrg int perf_z; /* ? 3 */ 155b7e1c893Smrg /* LoD selection */ 156b7e1c893Smrg int min_lod, max_lod; /* 0-0x3ff */ 157b7e1c893Smrg int lod_bias; /* 0-0xfff (signed?) */ 158b7e1c893Smrg int lod_bias2; /* ? 0-0xfff (signed?) */ 159b7e1c893Smrg bool_t lod_uses_minor_axis; /* ? */ 160b7e1c893Smrg /* Other stuff */ 161b7e1c893Smrg bool_t point_sampling_clamp; /* ? */ 162b7e1c893Smrg bool_t tex_array_override; /* ? */ 163b7e1c893Smrg bool_t mc_coord_truncate; /* ? */ 164b7e1c893Smrg bool_t force_degamma; /* ? */ 165b7e1c893Smrg bool_t fetch_4; /* ? */ 166b7e1c893Smrg bool_t sample_is_pcf; /* ? */ 167b7e1c893Smrg bool_t type; /* ? */ 168b7e1c893Smrg int depth_compare; /* only depth textures? */ 169b7e1c893Smrg int chroma_key; 170b7e1c893Smrg} tex_sampler_t; 171b7e1c893Smrg 172b7e1c893Smrg/* Draw command */ 173b7e1c893Smrgtypedef struct { 174b7e1c893Smrg uint32_t prim_type; 175b7e1c893Smrg uint32_t vgt_draw_initiator; 176b7e1c893Smrg uint32_t index_type; 177b7e1c893Smrg uint32_t num_instances; 178b7e1c893Smrg uint32_t num_indices; 179b7e1c893Smrg} draw_config_t; 180b7e1c893Smrg 181ad43ddacSmrg#if defined(XF86DRM_MODE) 182ad43ddacSmrg#define BEGIN_BATCH(n) \ 183ad43ddacSmrgdo { \ 184ad43ddacSmrg if (info->cs) \ 185ad43ddacSmrg radeon_ddx_cs_start(pScrn, (n), __FILE__, __func__, __LINE__); \ 186ad43ddacSmrg} while(0) 187ad43ddacSmrg#define END_BATCH() \ 188ad43ddacSmrgdo { \ 189ad43ddacSmrg if (info->cs) \ 190ad43ddacSmrg radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); \ 191ad43ddacSmrg} while(0) 192ad43ddacSmrg#define RELOC_BATCH(bo, rd, wd) \ 193ad43ddacSmrgdo { \ 194ad43ddacSmrg if (info->cs) { \ 195ad43ddacSmrg int _ret; \ 196ad43ddacSmrg _ret = radeon_cs_write_reloc(info->cs, (bo), (rd), (wd), 0); \ 197ad43ddacSmrg if (_ret) ErrorF("reloc emit failure %d (%s %d)\n", _ret, __func__, __LINE__); \ 198ad43ddacSmrg } \ 199ad43ddacSmrg} while(0) 200ad43ddacSmrg#define E32(ib, dword) \ 201ad43ddacSmrgdo { \ 202ad43ddacSmrg if (info->cs) \ 203ad43ddacSmrg radeon_cs_write_dword(info->cs, (dword)); \ 204ad43ddacSmrg else { \ 205ad43ddacSmrg uint32_t *ib_head = (pointer)(char*)(ib)->address; \ 206ad43ddacSmrg ib_head[(ib)->used >> 2] = (dword); \ 207ad43ddacSmrg (ib)->used += 4; \ 208ad43ddacSmrg } \ 209ad43ddacSmrg} while (0) 210ad43ddacSmrg#else 211ad43ddacSmrg#define BEGIN_BATCH(n) do {(void)info;} while(0) 212ad43ddacSmrg#define END_BATCH() do {} while(0) 213ad43ddacSmrg#define RELOC_BATCH(bo, wd, rd) do {} while(0) 214b7e1c893Smrg#define E32(ib, dword) \ 215b7e1c893Smrgdo { \ 216b7e1c893Smrg uint32_t *ib_head = (pointer)(char*)(ib)->address; \ 217b7e1c893Smrg ib_head[(ib)->used >> 2] = (dword); \ 218b7e1c893Smrg (ib)->used += 4; \ 219b7e1c893Smrg} while (0) 220ad43ddacSmrg#endif 221b7e1c893Smrg 222b7e1c893Smrg#define EFLOAT(ib, val) \ 223b7e1c893Smrgdo { \ 224b7e1c893Smrg union { float f; uint32_t d; } a; \ 225b7e1c893Smrg a.f = (val); \ 226b7e1c893Smrg E32((ib), a.d); \ 227b7e1c893Smrg} while (0) 228b7e1c893Smrg 229b7e1c893Smrg#define PACK3(ib, cmd, num) \ 230b7e1c893Smrgdo { \ 231b7e1c893Smrg E32((ib), RADEON_CP_PACKET3 | ((cmd) << 8) | ((((num) - 1) & 0x3fff) << 16)); \ 232b7e1c893Smrg} while (0) 233b7e1c893Smrg 234b7e1c893Smrg/* write num registers, start at reg */ 235b7e1c893Smrg/* If register falls in a special area, special commands are issued */ 236b7e1c893Smrg#define PACK0(ib, reg, num) \ 237b7e1c893Smrgdo { \ 238b7e1c893Smrg if ((reg) >= SET_CONFIG_REG_offset && (reg) < SET_CONFIG_REG_end) { \ 239b7e1c893Smrg PACK3((ib), IT_SET_CONFIG_REG, (num) + 1); \ 2402f39173dSmrg E32((ib), ((reg) - SET_CONFIG_REG_offset) >> 2); \ 241b7e1c893Smrg } else if ((reg) >= SET_CONTEXT_REG_offset && (reg) < SET_CONTEXT_REG_end) { \ 242c503f109Smrg PACK3((ib), IT_SET_CONTEXT_REG, (num) + 1); \ 2432f39173dSmrg E32((ib), ((reg) - SET_CONTEXT_REG_offset) >> 2); \ 244b7e1c893Smrg } else if ((reg) >= SET_ALU_CONST_offset && (reg) < SET_ALU_CONST_end) { \ 245b7e1c893Smrg PACK3((ib), IT_SET_ALU_CONST, (num) + 1); \ 2462f39173dSmrg E32((ib), ((reg) - SET_ALU_CONST_offset) >> 2); \ 247b7e1c893Smrg } else if ((reg) >= SET_RESOURCE_offset && (reg) < SET_RESOURCE_end) { \ 248b7e1c893Smrg PACK3((ib), IT_SET_RESOURCE, num + 1); \ 249b7e1c893Smrg E32((ib), ((reg) - SET_RESOURCE_offset) >> 2); \ 250b7e1c893Smrg } else if ((reg) >= SET_SAMPLER_offset && (reg) < SET_SAMPLER_end) { \ 251b7e1c893Smrg PACK3((ib), IT_SET_SAMPLER, (num) + 1); \ 252b7e1c893Smrg E32((ib), (reg - SET_SAMPLER_offset) >> 2); \ 253b7e1c893Smrg } else if ((reg) >= SET_CTL_CONST_offset && (reg) < SET_CTL_CONST_end) { \ 254b7e1c893Smrg PACK3((ib), IT_SET_CTL_CONST, (num) + 1); \ 255b7e1c893Smrg E32((ib), ((reg) - SET_CTL_CONST_offset) >> 2); \ 256b7e1c893Smrg } else if ((reg) >= SET_LOOP_CONST_offset && (reg) < SET_LOOP_CONST_end) { \ 257b7e1c893Smrg PACK3((ib), IT_SET_LOOP_CONST, (num) + 1); \ 258b7e1c893Smrg E32((ib), ((reg) - SET_LOOP_CONST_offset) >> 2); \ 259b7e1c893Smrg } else if ((reg) >= SET_BOOL_CONST_offset && (reg) < SET_BOOL_CONST_end) { \ 260b7e1c893Smrg PACK3((ib), IT_SET_BOOL_CONST, (num) + 1); \ 261b7e1c893Smrg E32((ib), ((reg) - SET_BOOL_CONST_offset) >> 2); \ 262b7e1c893Smrg } else { \ 263b7e1c893Smrg E32((ib), CP_PACKET0 ((reg), (num) - 1)); \ 264b7e1c893Smrg } \ 265b7e1c893Smrg} while (0) 266b7e1c893Smrg 267b7e1c893Smrg/* write a single register */ 268b7e1c893Smrg#define EREG(ib, reg, val) \ 269b7e1c893Smrgdo { \ 270b7e1c893Smrg PACK0((ib), (reg), 1); \ 271b7e1c893Smrg E32((ib), (val)); \ 272b7e1c893Smrg} while (0) 273b7e1c893Smrg 274b7e1c893Smrgvoid R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib); 275b7e1c893Smrgvoid R600IBDiscard(ScrnInfoPtr pScrn, drmBufPtr ib); 276b7e1c893Smrg 277b7e1c893Smrgvoid 278921a55d8Smrgr600_wait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib); 279b7e1c893Smrgvoid 280921a55d8Smrgr600_wait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib); 281b7e1c893Smrgvoid 282921a55d8Smrgr600_start_3d(ScrnInfoPtr pScrn, drmBufPtr ib); 283b7e1c893Smrgvoid 284921a55d8Smrgr600_set_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf, uint32_t domain); 285b7e1c893Smrgvoid 286921a55d8Smrgr600_cp_wait_vline_sync(ScrnInfoPtr pScrn, drmBufPtr ib, PixmapPtr pPix, xf86CrtcPtr crtc, int start, int stop); 287b7e1c893Smrgvoid 288921a55d8Smrgr600_fs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf, uint32_t domain); 289b7e1c893Smrgvoid 290921a55d8Smrgr600_vs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf, uint32_t domain); 291b7e1c893Smrgvoid 292921a55d8Smrgr600_ps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf, uint32_t domain); 293b7e1c893Smrgvoid 294921a55d8Smrgr600_set_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf); 295b7e1c893Smrgvoid 296921a55d8Smrgr600_set_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val); 297b7e1c893Smrgvoid 298921a55d8Smrgr600_set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res, uint32_t domain); 299b7e1c893Smrgvoid 300921a55d8Smrgr600_set_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s); 301b7e1c893Smrgvoid 302921a55d8Smrgr600_set_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 303b7e1c893Smrgvoid 304921a55d8Smrgr600_set_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); 305b7e1c893Smrgvoid 306921a55d8Smrgr600_set_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 307b7e1c893Smrgvoid 308921a55d8Smrgr600_set_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 309b7e1c893Smrgvoid 310921a55d8Smrgr600_set_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); 311b7e1c893Smrgvoid 312921a55d8Smrgr600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib); 313b7e1c893Smrgvoid 314921a55d8Smrgr600_draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices); 315b7e1c893Smrgvoid 316921a55d8Smrgr600_draw_auto(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf); 317b7e1c893Smrg 318ad43ddacSmrgvoid r600_finish_op(ScrnInfoPtr pScrn, int vtx_size); 319ad43ddacSmrg 320ad43ddacSmrgBool 321ad43ddacSmrgR600SetAccelState(ScrnInfoPtr pScrn, 322ad43ddacSmrg struct r600_accel_object *src0, 323ad43ddacSmrg struct r600_accel_object *src1, 324ad43ddacSmrg struct r600_accel_object *dst, 325ad43ddacSmrg uint32_t vs_offset, uint32_t ps_offset, 326ad43ddacSmrg int rop, Pixel planemask); 327ad43ddacSmrg 328ad43ddacSmrgextern Bool RADEONPrepareAccess_CS(PixmapPtr pPix, int index); 329ad43ddacSmrgextern void RADEONFinishAccess_CS(PixmapPtr pPix, int index); 330ad43ddacSmrgextern void *RADEONEXACreatePixmap(ScreenPtr pScreen, int size, int align); 3310974d292Smrgextern void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height, 3320974d292Smrg int depth, int usage_hint, int bitsPerPixel, 3330974d292Smrg int *new_pitch); 334ad43ddacSmrgextern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv); 335ad43ddacSmrgextern struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix); 336ad43ddacSmrgextern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix); 337ad43ddacSmrg 338ad43ddacSmrg 339b7e1c893Smrg#endif 340