r600_state.h revision b7e1c893
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; 53b7e1c893Smrg} cb_config_t; 54b7e1c893Smrg 55b7e1c893Smrg/* Depth buffer */ 56b7e1c893Smrgtypedef struct { 57b7e1c893Smrg int w; 58b7e1c893Smrg int h; 59b7e1c893Smrg uint64_t base; 60b7e1c893Smrg int format; 61b7e1c893Smrg int read_size; 62b7e1c893Smrg int array_mode; // tiling 63b7e1c893Smrg int tile_surface_en; 64b7e1c893Smrg int tile_compact; 65b7e1c893Smrg int zrange_precision; 66b7e1c893Smrg} db_config_t; 67b7e1c893Smrg 68b7e1c893Smrg/* Shader */ 69b7e1c893Smrgtypedef struct { 70b7e1c893Smrg uint64_t shader_addr; 71b7e1c893Smrg int num_gprs; 72b7e1c893Smrg int stack_size; 73b7e1c893Smrg int dx10_clamp; 74b7e1c893Smrg int prime_cache_pgm_en; 75b7e1c893Smrg int prime_cache_on_draw; 76b7e1c893Smrg int fetch_cache_lines; 77b7e1c893Smrg int prime_cache_en; 78b7e1c893Smrg int prime_cache_on_const; 79b7e1c893Smrg int clamp_consts; 80b7e1c893Smrg int export_mode; 81b7e1c893Smrg int uncached_first_inst; 82b7e1c893Smrg} shader_config_t; 83b7e1c893Smrg 84b7e1c893Smrg/* Vertex buffer / vtx resource */ 85b7e1c893Smrgtypedef struct { 86b7e1c893Smrg int id; 87b7e1c893Smrg uint64_t vb_addr; 88b7e1c893Smrg uint32_t vtx_num_entries; 89b7e1c893Smrg uint32_t vtx_size_dw; 90b7e1c893Smrg int clamp_x; 91b7e1c893Smrg int format; 92b7e1c893Smrg int num_format_all; 93b7e1c893Smrg int format_comp_all; 94b7e1c893Smrg int srf_mode_all; 95b7e1c893Smrg int endian; 96b7e1c893Smrg int mem_req_size; 97b7e1c893Smrg} vtx_resource_t; 98b7e1c893Smrg 99b7e1c893Smrg/* Texture resource */ 100b7e1c893Smrgtypedef struct { 101b7e1c893Smrg int id; 102b7e1c893Smrg int w; 103b7e1c893Smrg int h; 104b7e1c893Smrg int pitch; 105b7e1c893Smrg int depth; 106b7e1c893Smrg int dim; 107b7e1c893Smrg int tile_mode; 108b7e1c893Smrg int tile_type; 109b7e1c893Smrg int format; 110b7e1c893Smrg uint64_t base; 111b7e1c893Smrg uint64_t mip_base; 112b7e1c893Smrg int format_comp_x; 113b7e1c893Smrg int format_comp_y; 114b7e1c893Smrg int format_comp_z; 115b7e1c893Smrg int format_comp_w; 116b7e1c893Smrg int num_format_all; 117b7e1c893Smrg int srf_mode_all; 118b7e1c893Smrg int force_degamma; 119b7e1c893Smrg int endian; 120b7e1c893Smrg int request_size; 121b7e1c893Smrg int dst_sel_x; 122b7e1c893Smrg int dst_sel_y; 123b7e1c893Smrg int dst_sel_z; 124b7e1c893Smrg int dst_sel_w; 125b7e1c893Smrg int base_level; 126b7e1c893Smrg int last_level; 127b7e1c893Smrg int base_array; 128b7e1c893Smrg int last_array; 129b7e1c893Smrg int mpeg_clamp; 130b7e1c893Smrg int perf_modulation; 131b7e1c893Smrg int interlaced; 132b7e1c893Smrg} tex_resource_t; 133b7e1c893Smrg 134b7e1c893Smrg/* Texture sampler */ 135b7e1c893Smrgtypedef struct { 136b7e1c893Smrg int id; 137b7e1c893Smrg /* Clamping */ 138b7e1c893Smrg int clamp_x, clamp_y, clamp_z; 139b7e1c893Smrg int border_color; 140b7e1c893Smrg /* Filtering */ 141b7e1c893Smrg int xy_mag_filter, xy_min_filter; 142b7e1c893Smrg int z_filter; 143b7e1c893Smrg int mip_filter; 144b7e1c893Smrg bool_t high_precision_filter; /* ? */ 145b7e1c893Smrg int perf_mip; /* ? 0-7 */ 146b7e1c893Smrg int perf_z; /* ? 3 */ 147b7e1c893Smrg /* LoD selection */ 148b7e1c893Smrg int min_lod, max_lod; /* 0-0x3ff */ 149b7e1c893Smrg int lod_bias; /* 0-0xfff (signed?) */ 150b7e1c893Smrg int lod_bias2; /* ? 0-0xfff (signed?) */ 151b7e1c893Smrg bool_t lod_uses_minor_axis; /* ? */ 152b7e1c893Smrg /* Other stuff */ 153b7e1c893Smrg bool_t point_sampling_clamp; /* ? */ 154b7e1c893Smrg bool_t tex_array_override; /* ? */ 155b7e1c893Smrg bool_t mc_coord_truncate; /* ? */ 156b7e1c893Smrg bool_t force_degamma; /* ? */ 157b7e1c893Smrg bool_t fetch_4; /* ? */ 158b7e1c893Smrg bool_t sample_is_pcf; /* ? */ 159b7e1c893Smrg bool_t type; /* ? */ 160b7e1c893Smrg int depth_compare; /* only depth textures? */ 161b7e1c893Smrg int chroma_key; 162b7e1c893Smrg} tex_sampler_t; 163b7e1c893Smrg 164b7e1c893Smrg/* Draw command */ 165b7e1c893Smrgtypedef struct { 166b7e1c893Smrg uint32_t prim_type; 167b7e1c893Smrg uint32_t vgt_draw_initiator; 168b7e1c893Smrg uint32_t index_type; 169b7e1c893Smrg uint32_t num_instances; 170b7e1c893Smrg uint32_t num_indices; 171b7e1c893Smrg} draw_config_t; 172b7e1c893Smrg 173b7e1c893Smrg#define E32(ib, dword) \ 174b7e1c893Smrgdo { \ 175b7e1c893Smrg uint32_t *ib_head = (pointer)(char*)(ib)->address; \ 176b7e1c893Smrg ib_head[(ib)->used >> 2] = (dword); \ 177b7e1c893Smrg (ib)->used += 4; \ 178b7e1c893Smrg} while (0) 179b7e1c893Smrg 180b7e1c893Smrg#define EFLOAT(ib, val) \ 181b7e1c893Smrgdo { \ 182b7e1c893Smrg union { float f; uint32_t d; } a; \ 183b7e1c893Smrg a.f = (val); \ 184b7e1c893Smrg E32((ib), a.d); \ 185b7e1c893Smrg} while (0) 186b7e1c893Smrg 187b7e1c893Smrg#define PACK3(ib, cmd, num) \ 188b7e1c893Smrgdo { \ 189b7e1c893Smrg E32((ib), RADEON_CP_PACKET3 | ((cmd) << 8) | ((((num) - 1) & 0x3fff) << 16)); \ 190b7e1c893Smrg} while (0) 191b7e1c893Smrg 192b7e1c893Smrg/* write num registers, start at reg */ 193b7e1c893Smrg/* If register falls in a special area, special commands are issued */ 194b7e1c893Smrg#define PACK0(ib, reg, num) \ 195b7e1c893Smrgdo { \ 196b7e1c893Smrg if ((reg) >= SET_CONFIG_REG_offset && (reg) < SET_CONFIG_REG_end) { \ 197b7e1c893Smrg PACK3((ib), IT_SET_CONFIG_REG, (num) + 1); \ 198b7e1c893Smrg E32(ib, ((reg) - SET_CONFIG_REG_offset) >> 2); \ 199b7e1c893Smrg } else if ((reg) >= SET_CONTEXT_REG_offset && (reg) < SET_CONTEXT_REG_end) { \ 200b7e1c893Smrg PACK3((ib), IT_SET_CONTEXT_REG, (num) + 1); \ 201b7e1c893Smrg E32(ib, ((reg) - 0x28000) >> 2); \ 202b7e1c893Smrg } else if ((reg) >= SET_ALU_CONST_offset && (reg) < SET_ALU_CONST_end) { \ 203b7e1c893Smrg PACK3((ib), IT_SET_ALU_CONST, (num) + 1); \ 204b7e1c893Smrg E32(ib, ((reg) - SET_ALU_CONST_offset) >> 2); \ 205b7e1c893Smrg } else if ((reg) >= SET_RESOURCE_offset && (reg) < SET_RESOURCE_end) { \ 206b7e1c893Smrg PACK3((ib), IT_SET_RESOURCE, num + 1); \ 207b7e1c893Smrg E32((ib), ((reg) - SET_RESOURCE_offset) >> 2); \ 208b7e1c893Smrg } else if ((reg) >= SET_SAMPLER_offset && (reg) < SET_SAMPLER_end) { \ 209b7e1c893Smrg PACK3((ib), IT_SET_SAMPLER, (num) + 1); \ 210b7e1c893Smrg E32((ib), (reg - SET_SAMPLER_offset) >> 2); \ 211b7e1c893Smrg } else if ((reg) >= SET_CTL_CONST_offset && (reg) < SET_CTL_CONST_end) { \ 212b7e1c893Smrg PACK3((ib), IT_SET_CTL_CONST, (num) + 1); \ 213b7e1c893Smrg E32((ib), ((reg) - SET_CTL_CONST_offset) >> 2); \ 214b7e1c893Smrg } else if ((reg) >= SET_LOOP_CONST_offset && (reg) < SET_LOOP_CONST_end) { \ 215b7e1c893Smrg PACK3((ib), IT_SET_LOOP_CONST, (num) + 1); \ 216b7e1c893Smrg E32((ib), ((reg) - SET_LOOP_CONST_offset) >> 2); \ 217b7e1c893Smrg } else if ((reg) >= SET_BOOL_CONST_offset && (reg) < SET_BOOL_CONST_end) { \ 218b7e1c893Smrg PACK3((ib), IT_SET_BOOL_CONST, (num) + 1); \ 219b7e1c893Smrg E32((ib), ((reg) - SET_BOOL_CONST_offset) >> 2); \ 220b7e1c893Smrg } else { \ 221b7e1c893Smrg E32((ib), CP_PACKET0 ((reg), (num) - 1)); \ 222b7e1c893Smrg } \ 223b7e1c893Smrg} while (0) 224b7e1c893Smrg 225b7e1c893Smrg/* write a single register */ 226b7e1c893Smrg#define EREG(ib, reg, val) \ 227b7e1c893Smrgdo { \ 228b7e1c893Smrg PACK0((ib), (reg), 1); \ 229b7e1c893Smrg E32((ib), (val)); \ 230b7e1c893Smrg} while (0) 231b7e1c893Smrg 232b7e1c893Smrgvoid R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib); 233b7e1c893Smrgvoid R600IBDiscard(ScrnInfoPtr pScrn, drmBufPtr ib); 234b7e1c893Smrg 235b7e1c893Smrguint64_t 236b7e1c893Smrgupload (ScrnInfoPtr pScrn, void *shader, int size, int offset); 237b7e1c893Smrgvoid 238b7e1c893Smrgwait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib); 239b7e1c893Smrgvoid 240b7e1c893Smrgwait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib); 241b7e1c893Smrgvoid 242b7e1c893Smrgstart_3d(ScrnInfoPtr pScrn, drmBufPtr ib); 243b7e1c893Smrgvoid 244b7e1c893Smrgset_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf); 245b7e1c893Smrgvoid 246b7e1c893Smrgcp_set_surface_sync(ScrnInfoPtr pScrn, drmBufPtr ib, uint32_t sync_type, uint32_t size, uint64_t mc_addr); 247b7e1c893Smrgvoid 248b7e1c893Smrgcp_wait_vline_sync(ScrnInfoPtr pScrn, drmBufPtr ib, PixmapPtr pPix, int crtc, int start, int stop); 249b7e1c893Smrgvoid 250b7e1c893Smrgfs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf); 251b7e1c893Smrgvoid 252b7e1c893Smrgvs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf); 253b7e1c893Smrgvoid 254b7e1c893Smrgps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf); 255b7e1c893Smrgvoid 256b7e1c893Smrgset_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf); 257b7e1c893Smrgvoid 258b7e1c893Smrgset_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val); 259b7e1c893Smrgvoid 260b7e1c893Smrgset_vtx_resource(ScrnInfoPtr pScrn, drmBufPtr ib, vtx_resource_t *res); 261b7e1c893Smrgvoid 262b7e1c893Smrgset_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res); 263b7e1c893Smrgvoid 264b7e1c893Smrgset_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s); 265b7e1c893Smrgvoid 266b7e1c893Smrgset_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 267b7e1c893Smrgvoid 268b7e1c893Smrgset_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); 269b7e1c893Smrgvoid 270b7e1c893Smrgset_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 271b7e1c893Smrgvoid 272b7e1c893Smrgset_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); 273b7e1c893Smrgvoid 274b7e1c893Smrgset_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); 275b7e1c893Smrgvoid 276b7e1c893Smrgset_default_state(ScrnInfoPtr pScrn, drmBufPtr ib); 277b7e1c893Smrgvoid 278b7e1c893Smrgdraw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices); 279b7e1c893Smrgvoid 280b7e1c893Smrgdraw_auto(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf); 281b7e1c893Smrg 282b7e1c893Smrg#endif 283