r600_asm.h revision af69d88d
1/* 2 * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * on the rights to use, copy, modify, merge, publish, distribute, sub 8 * license, and/or sell copies of the Software, and to permit persons to whom 9 * the Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 21 * USE OR OTHER DEALINGS IN THE SOFTWARE. 22 */ 23#ifndef R600_ASM_H 24#define R600_ASM_H 25 26#include "r600_pipe.h" 27#include "r600_isa.h" 28 29struct r600_bytecode_alu_src { 30 unsigned sel; 31 unsigned chan; 32 unsigned neg; 33 unsigned abs; 34 unsigned rel; 35 unsigned kc_bank; 36 uint32_t value; 37}; 38 39struct r600_bytecode_alu_dst { 40 unsigned sel; 41 unsigned chan; 42 unsigned clamp; 43 unsigned write; 44 unsigned rel; 45}; 46 47struct r600_bytecode_alu { 48 struct list_head list; 49 struct r600_bytecode_alu_src src[3]; 50 struct r600_bytecode_alu_dst dst; 51 unsigned op; 52 unsigned last; 53 unsigned is_op3; 54 unsigned execute_mask; 55 unsigned update_pred; 56 unsigned pred_sel; 57 unsigned bank_swizzle; 58 unsigned bank_swizzle_force; 59 unsigned omod; 60 unsigned index_mode; 61}; 62 63struct r600_bytecode_tex { 64 struct list_head list; 65 unsigned op; 66 unsigned inst_mod; 67 unsigned resource_id; 68 unsigned src_gpr; 69 unsigned src_rel; 70 unsigned dst_gpr; 71 unsigned dst_rel; 72 unsigned dst_sel_x; 73 unsigned dst_sel_y; 74 unsigned dst_sel_z; 75 unsigned dst_sel_w; 76 unsigned lod_bias; 77 unsigned coord_type_x; 78 unsigned coord_type_y; 79 unsigned coord_type_z; 80 unsigned coord_type_w; 81 int offset_x; 82 int offset_y; 83 int offset_z; 84 unsigned sampler_id; 85 unsigned src_sel_x; 86 unsigned src_sel_y; 87 unsigned src_sel_z; 88 unsigned src_sel_w; 89}; 90 91struct r600_bytecode_vtx { 92 struct list_head list; 93 unsigned op; 94 unsigned fetch_type; 95 unsigned buffer_id; 96 unsigned src_gpr; 97 unsigned src_sel_x; 98 unsigned mega_fetch_count; 99 unsigned dst_gpr; 100 unsigned dst_sel_x; 101 unsigned dst_sel_y; 102 unsigned dst_sel_z; 103 unsigned dst_sel_w; 104 unsigned use_const_fields; 105 unsigned data_format; 106 unsigned num_format_all; 107 unsigned format_comp_all; 108 unsigned srf_mode_all; 109 unsigned offset; 110 unsigned endian; 111}; 112 113struct r600_bytecode_output { 114 unsigned array_base; 115 unsigned array_size; 116 unsigned comp_mask; 117 unsigned type; 118 119 unsigned op; 120 121 unsigned elem_size; 122 unsigned gpr; 123 unsigned swizzle_x; 124 unsigned swizzle_y; 125 unsigned swizzle_z; 126 unsigned swizzle_w; 127 unsigned burst_count; 128 unsigned index_gpr; 129}; 130 131struct r600_bytecode_kcache { 132 unsigned bank; 133 unsigned mode; 134 unsigned addr; 135}; 136 137struct r600_bytecode_cf { 138 struct list_head list; 139 140 unsigned op; 141 unsigned addr; 142 unsigned ndw; 143 unsigned id; 144 unsigned cond; 145 unsigned pop_count; 146 unsigned cf_addr; /* control flow addr */ 147 struct r600_bytecode_kcache kcache[4]; 148 unsigned r6xx_uses_waterfall; 149 unsigned eg_alu_extended; 150 unsigned barrier; 151 unsigned end_of_program; 152 struct list_head alu; 153 struct list_head tex; 154 struct list_head vtx; 155 struct r600_bytecode_output output; 156 struct r600_bytecode_alu *curr_bs_head; 157 struct r600_bytecode_alu *prev_bs_head; 158 struct r600_bytecode_alu *prev2_bs_head; 159 unsigned isa[2]; 160}; 161 162#define FC_NONE 0 163#define FC_IF 1 164#define FC_LOOP 2 165#define FC_REP 3 166#define FC_PUSH_VPM 4 167#define FC_PUSH_WQM 5 168 169struct r600_cf_stack_entry { 170 int type; 171 struct r600_bytecode_cf *start; 172 struct r600_bytecode_cf **mid; /* used to store the else point */ 173 int num_mid; 174}; 175 176#define SQ_MAX_CALL_DEPTH 0x00000020 177 178#define AR_HANDLE_NORMAL 0 179#define AR_HANDLE_RV6XX 1 /* except RV670 */ 180 181struct r600_stack_info { 182 /* current level of non-WQM PUSH operations 183 * (PUSH, PUSH_ELSE, ALU_PUSH_BEFORE) */ 184 int push; 185 /* current level of WQM PUSH operations 186 * (PUSH, PUSH_ELSE, PUSH_WQM) */ 187 int push_wqm; 188 /* current loop level */ 189 int loop; 190 191 /* required depth */ 192 int max_entries; 193 /* subentries per entry */ 194 int entry_size; 195}; 196 197struct r600_bytecode { 198 enum chip_class chip_class; 199 enum radeon_family family; 200 bool has_compressed_msaa_texturing; 201 int type; 202 struct list_head cf; 203 struct r600_bytecode_cf *cf_last; 204 unsigned ndw; 205 unsigned ncf; 206 unsigned ngpr; 207 unsigned nstack; 208 unsigned nlds_dw; 209 unsigned nresource; 210 unsigned force_add_cf; 211 uint32_t *bytecode; 212 uint32_t fc_sp; 213 struct r600_cf_stack_entry fc_stack[32]; 214 struct r600_stack_info stack; 215 unsigned ar_loaded; 216 unsigned ar_reg; 217 unsigned ar_chan; 218 unsigned ar_handling; 219 unsigned r6xx_nop_after_rel_dst; 220 unsigned debug_id; 221 struct r600_isa* isa; 222}; 223 224/* eg_asm.c */ 225int eg_bytecode_cf_build(struct r600_bytecode *bc, struct r600_bytecode_cf *cf); 226 227/* r600_asm.c */ 228void r600_bytecode_init(struct r600_bytecode *bc, 229 enum chip_class chip_class, 230 enum radeon_family family, 231 bool has_compressed_msaa_texturing); 232void r600_bytecode_clear(struct r600_bytecode *bc); 233int r600_bytecode_add_alu(struct r600_bytecode *bc, 234 const struct r600_bytecode_alu *alu); 235int r600_bytecode_add_vtx(struct r600_bytecode *bc, 236 const struct r600_bytecode_vtx *vtx); 237int r600_bytecode_add_tex(struct r600_bytecode *bc, 238 const struct r600_bytecode_tex *tex); 239int r600_bytecode_add_output(struct r600_bytecode *bc, 240 const struct r600_bytecode_output *output); 241int r600_bytecode_build(struct r600_bytecode *bc); 242int r600_bytecode_add_cf(struct r600_bytecode *bc); 243int r600_bytecode_add_cfinst(struct r600_bytecode *bc, 244 unsigned op); 245int r600_bytecode_add_alu_type(struct r600_bytecode *bc, 246 const struct r600_bytecode_alu *alu, unsigned type); 247void r600_bytecode_special_constants(uint32_t value, 248 unsigned *sel, unsigned *neg); 249void r600_bytecode_disasm(struct r600_bytecode *bc); 250void r600_bytecode_alu_read(struct r600_bytecode *bc, 251 struct r600_bytecode_alu *alu, uint32_t word0, uint32_t word1); 252 253int cm_bytecode_add_cf_end(struct r600_bytecode *bc); 254 255void *r600_create_vertex_fetch_shader(struct pipe_context *ctx, 256 unsigned count, 257 const struct pipe_vertex_element *elements); 258 259/* r700_asm.c */ 260void r700_bytecode_cf_vtx_build(uint32_t *bytecode, 261 const struct r600_bytecode_cf *cf); 262int r700_bytecode_alu_build(struct r600_bytecode *bc, 263 struct r600_bytecode_alu *alu, unsigned id); 264void r700_bytecode_alu_read(struct r600_bytecode *bc, 265 struct r600_bytecode_alu *alu, uint32_t word0, uint32_t word1); 266void r600_bytecode_export_read(struct r600_bytecode *bc, 267 struct r600_bytecode_output *output, uint32_t word0, uint32_t word1); 268void eg_bytecode_export_read(struct r600_bytecode *bc, 269 struct r600_bytecode_output *output, uint32_t word0, uint32_t word1); 270 271void r600_vertex_data_type(enum pipe_format pformat, unsigned *format, 272 unsigned *num_format, unsigned *format_comp, unsigned *endian); 273#endif 274