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