r600_asm.h revision 3464ebd5
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 "util/u_double_list.h" 27 28struct r600_vertex_element; 29struct r600_pipe_context; 30 31struct r600_bc_alu_src { 32 unsigned sel; 33 unsigned chan; 34 unsigned neg; 35 unsigned abs; 36 unsigned rel; 37 uint32_t value; 38}; 39 40struct r600_bc_alu_dst { 41 unsigned sel; 42 unsigned chan; 43 unsigned clamp; 44 unsigned write; 45 unsigned rel; 46}; 47 48struct r600_bc_alu { 49 struct list_head list; 50 struct r600_bc_alu_src src[3]; 51 struct r600_bc_alu_dst dst; 52 unsigned inst; 53 unsigned last; 54 unsigned is_op3; 55 unsigned predicate; 56 unsigned bank_swizzle; 57 unsigned bank_swizzle_force; 58 unsigned omod; 59}; 60 61struct r600_bc_tex { 62 struct list_head list; 63 unsigned inst; 64 unsigned resource_id; 65 unsigned src_gpr; 66 unsigned src_rel; 67 unsigned dst_gpr; 68 unsigned dst_rel; 69 unsigned dst_sel_x; 70 unsigned dst_sel_y; 71 unsigned dst_sel_z; 72 unsigned dst_sel_w; 73 unsigned lod_bias; 74 unsigned coord_type_x; 75 unsigned coord_type_y; 76 unsigned coord_type_z; 77 unsigned coord_type_w; 78 unsigned offset_x; 79 unsigned offset_y; 80 unsigned offset_z; 81 unsigned sampler_id; 82 unsigned src_sel_x; 83 unsigned src_sel_y; 84 unsigned src_sel_z; 85 unsigned src_sel_w; 86}; 87 88struct r600_bc_vtx { 89 struct list_head list; 90 unsigned inst; 91 unsigned fetch_type; 92 unsigned buffer_id; 93 unsigned src_gpr; 94 unsigned src_sel_x; 95 unsigned mega_fetch_count; 96 unsigned dst_gpr; 97 unsigned dst_sel_x; 98 unsigned dst_sel_y; 99 unsigned dst_sel_z; 100 unsigned dst_sel_w; 101 unsigned use_const_fields; 102 unsigned data_format; 103 unsigned num_format_all; 104 unsigned format_comp_all; 105 unsigned srf_mode_all; 106 unsigned offset; 107 unsigned endian; 108}; 109 110struct r600_bc_output { 111 unsigned array_base; 112 unsigned type; 113 unsigned end_of_program; 114 unsigned inst; 115 unsigned elem_size; 116 unsigned gpr; 117 unsigned swizzle_x; 118 unsigned swizzle_y; 119 unsigned swizzle_z; 120 unsigned swizzle_w; 121 unsigned burst_count; 122 unsigned barrier; 123}; 124 125struct r600_bc_kcache { 126 unsigned bank; 127 unsigned mode; 128 unsigned addr; 129}; 130 131struct r600_bc_cf { 132 struct list_head list; 133 unsigned inst; 134 unsigned addr; 135 unsigned ndw; 136 unsigned id; 137 unsigned cond; 138 unsigned pop_count; 139 unsigned cf_addr; /* control flow addr */ 140 struct r600_bc_kcache kcache[2]; 141 unsigned r6xx_uses_waterfall; 142 struct list_head alu; 143 struct list_head tex; 144 struct list_head vtx; 145 struct r600_bc_output output; 146 struct r600_bc_alu *curr_bs_head; 147 struct r600_bc_alu *prev_bs_head; 148 struct r600_bc_alu *prev2_bs_head; 149}; 150 151#define FC_NONE 0 152#define FC_IF 1 153#define FC_LOOP 2 154#define FC_REP 3 155#define FC_PUSH_VPM 4 156#define FC_PUSH_WQM 5 157 158struct r600_cf_stack_entry { 159 int type; 160 struct r600_bc_cf *start; 161 struct r600_bc_cf **mid; /* used to store the else point */ 162 int num_mid; 163}; 164 165#define SQ_MAX_CALL_DEPTH 0x00000020 166struct r600_cf_callstack { 167 unsigned fc_sp_before_entry; 168 int sub_desc_index; 169 int current; 170 int max; 171}; 172 173struct r600_bc { 174 enum radeon_family family; 175 int chiprev; /* 0 - r600, 1 - r700, 2 - evergreen */ 176 int type; 177 struct list_head cf; 178 struct r600_bc_cf *cf_last; 179 unsigned ndw; 180 unsigned ncf; 181 unsigned ngpr; 182 unsigned nstack; 183 unsigned nresource; 184 unsigned force_add_cf; 185 u32 *bytecode; 186 u32 fc_sp; 187 struct r600_cf_stack_entry fc_stack[32]; 188 unsigned call_sp; 189 struct r600_cf_callstack callstack[SQ_MAX_CALL_DEPTH]; 190}; 191 192/* eg_asm.c */ 193int eg_bc_cf_build(struct r600_bc *bc, struct r600_bc_cf *cf); 194 195/* r600_asm.c */ 196int r600_bc_init(struct r600_bc *bc, enum radeon_family family); 197void r600_bc_clear(struct r600_bc *bc); 198int r600_bc_add_alu(struct r600_bc *bc, const struct r600_bc_alu *alu); 199int r600_bc_add_vtx(struct r600_bc *bc, const struct r600_bc_vtx *vtx); 200int r600_bc_add_tex(struct r600_bc *bc, const struct r600_bc_tex *tex); 201int r600_bc_add_output(struct r600_bc *bc, const struct r600_bc_output *output); 202int r600_bc_build(struct r600_bc *bc); 203int r600_bc_add_cfinst(struct r600_bc *bc, int inst); 204int r600_bc_add_alu_type(struct r600_bc *bc, const struct r600_bc_alu *alu, int type); 205void r600_bc_special_constants(u32 value, unsigned *sel, unsigned *neg); 206void r600_bc_dump(struct r600_bc *bc); 207 208int cm_bc_add_cf_end(struct r600_bc *bc); 209 210int r600_vertex_elements_build_fetch_shader(struct r600_pipe_context *rctx, struct r600_vertex_element *ve); 211 212/* r700_asm.c */ 213void r700_bc_cf_vtx_build(uint32_t *bytecode, const struct r600_bc_cf *cf); 214int r700_bc_alu_build(struct r600_bc *bc, struct r600_bc_alu *alu, unsigned id); 215 216#endif 217