1 /* 2 * Copyright (c) 2012 Rob Clark <robdclark@gmail.com> 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 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * 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 NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 * SOFTWARE. 22 */ 23 24 #ifndef INSTR_A2XX_H_ 25 #define INSTR_A2XX_H_ 26 27 #define PACKED __attribute__((__packed__)) 28 29 #include "util/u_math.h" 30 #include "adreno_common.xml.h" 31 #include "adreno_pm4.xml.h" 32 #include "a2xx.xml.h" 33 34 /* 35 * ALU instructions: 36 */ 37 38 typedef enum { 39 ADDs = 0, 40 ADD_PREVs = 1, 41 MULs = 2, 42 MUL_PREVs = 3, 43 MUL_PREV2s = 4, 44 MAXs = 5, 45 MINs = 6, 46 SETEs = 7, 47 SETGTs = 8, 48 SETGTEs = 9, 49 SETNEs = 10, 50 FRACs = 11, 51 TRUNCs = 12, 52 FLOORs = 13, 53 EXP_IEEE = 14, 54 LOG_CLAMP = 15, 55 LOG_IEEE = 16, 56 RECIP_CLAMP = 17, 57 RECIP_FF = 18, 58 RECIP_IEEE = 19, 59 RECIPSQ_CLAMP = 20, 60 RECIPSQ_FF = 21, 61 RECIPSQ_IEEE = 22, 62 MOVAs = 23, 63 MOVA_FLOORs = 24, 64 SUBs = 25, 65 SUB_PREVs = 26, 66 PRED_SETEs = 27, 67 PRED_SETNEs = 28, 68 PRED_SETGTs = 29, 69 PRED_SETGTEs = 30, 70 PRED_SET_INVs = 31, 71 PRED_SET_POPs = 32, 72 PRED_SET_CLRs = 33, 73 PRED_SET_RESTOREs = 34, 74 KILLEs = 35, 75 KILLGTs = 36, 76 KILLGTEs = 37, 77 KILLNEs = 38, 78 KILLONEs = 39, 79 SQRT_IEEE = 40, 80 MUL_CONST_0 = 42, 81 MUL_CONST_1 = 43, 82 ADD_CONST_0 = 44, 83 ADD_CONST_1 = 45, 84 SUB_CONST_0 = 46, 85 SUB_CONST_1 = 47, 86 SIN = 48, 87 COS = 49, 88 RETAIN_PREV = 50, 89 SCALAR_NONE = 63, 90 } instr_scalar_opc_t; 91 92 typedef enum { 93 ADDv = 0, 94 MULv = 1, 95 MAXv = 2, 96 MINv = 3, 97 SETEv = 4, 98 SETGTv = 5, 99 SETGTEv = 6, 100 SETNEv = 7, 101 FRACv = 8, 102 TRUNCv = 9, 103 FLOORv = 10, 104 MULADDv = 11, 105 CNDEv = 12, 106 CNDGTEv = 13, 107 CNDGTv = 14, 108 DOT4v = 15, 109 DOT3v = 16, 110 DOT2ADDv = 17, 111 CUBEv = 18, 112 MAX4v = 19, 113 PRED_SETE_PUSHv = 20, 114 PRED_SETNE_PUSHv = 21, 115 PRED_SETGT_PUSHv = 22, 116 PRED_SETGTE_PUSHv = 23, 117 KILLEv = 24, 118 KILLGTv = 25, 119 KILLGTEv = 26, 120 KILLNEv = 27, 121 DSTv = 28, 122 MOVAv = 29, 123 VECTOR_NONE = 31, 124 } instr_vector_opc_t; 125 126 typedef struct PACKED { 127 /* dword0: */ 128 uint8_t vector_dest : 6; 129 uint8_t vector_dest_rel : 1; 130 uint8_t low_precision_16b_fp : 1; 131 uint8_t scalar_dest : 6; 132 uint8_t scalar_dest_rel : 1; 133 uint8_t export_data : 1; 134 uint8_t vector_write_mask : 4; 135 uint8_t scalar_write_mask : 4; 136 uint8_t vector_clamp : 1; 137 uint8_t scalar_clamp : 1; 138 instr_scalar_opc_t scalar_opc : 6; 139 /* dword1: */ 140 uint8_t src3_swiz : 8; 141 uint8_t src2_swiz : 8; 142 uint8_t src1_swiz : 8; 143 uint8_t src3_reg_negate : 1; 144 uint8_t src2_reg_negate : 1; 145 uint8_t src1_reg_negate : 1; 146 uint8_t pred_select : 2; 147 uint8_t relative_addr : 1; 148 uint8_t const_1_rel_abs : 1; 149 uint8_t const_0_rel_abs : 1; 150 /* dword2: */ 151 union { 152 struct { 153 uint8_t src3_reg : 6; 154 uint8_t src3_reg_select : 1; 155 uint8_t src3_reg_abs : 1; 156 uint8_t src2_reg : 6; 157 uint8_t src2_reg_select : 1; 158 uint8_t src2_reg_abs : 1; 159 uint8_t src1_reg : 6; 160 uint8_t src1_reg_select : 1; 161 uint8_t src1_reg_abs : 1; 162 }; 163 /* constants have full 8-bit index */ 164 struct { 165 uint8_t src3_reg_byte : 8; 166 uint8_t src2_reg_byte : 8; 167 uint8_t src1_reg_byte : 8; 168 }; 169 }; 170 instr_vector_opc_t vector_opc : 5; 171 uint8_t src3_sel : 1; 172 uint8_t src2_sel : 1; 173 uint8_t src1_sel : 1; 174 } instr_alu_t; 175 176 /* 177 * CF instructions: 178 */ 179 180 typedef enum { 181 NOP = 0, 182 EXEC = 1, 183 EXEC_END = 2, 184 COND_EXEC = 3, 185 COND_EXEC_END = 4, 186 COND_PRED_EXEC = 5, 187 COND_PRED_EXEC_END = 6, 188 LOOP_START = 7, 189 LOOP_END = 8, 190 COND_CALL = 9, 191 RETURN = 10, 192 COND_JMP = 11, 193 ALLOC = 12, 194 COND_EXEC_PRED_CLEAN = 13, 195 COND_EXEC_PRED_CLEAN_END = 14, 196 MARK_VS_FETCH_DONE = 15, 197 } instr_cf_opc_t; 198 199 typedef enum { 200 RELATIVE_ADDR = 0, 201 ABSOLUTE_ADDR = 1, 202 } instr_addr_mode_t; 203 204 typedef enum { 205 SQ_NO_ALLOC = 0, 206 SQ_POSITION = 1, 207 SQ_PARAMETER_PIXEL = 2, 208 SQ_MEMORY = 3, 209 } instr_alloc_type_t; 210 211 typedef struct PACKED { 212 uint16_t address : 9; 213 uint8_t reserved0 : 3; 214 uint8_t count : 3; 215 uint8_t yeild : 1; 216 uint16_t serialize : 12; 217 uint32_t vc : 6; /* vertex cache? */ 218 uint32_t bool_addr : 8; 219 uint8_t condition : 1; 220 instr_addr_mode_t address_mode : 1; 221 instr_cf_opc_t opc : 4; 222 } instr_cf_exec_t; 223 224 typedef struct PACKED { 225 uint16_t address : 10; 226 uint8_t reserved0 : 6; 227 uint8_t loop_id : 5; 228 uint32_t reserved1 : 22; 229 instr_addr_mode_t address_mode : 1; 230 instr_cf_opc_t opc : 4; 231 } instr_cf_loop_t; 232 233 typedef struct PACKED { 234 uint16_t address : 10; 235 uint8_t reserved0 : 3; 236 uint8_t force_call : 1; 237 uint8_t predicated_jmp : 1; 238 uint32_t reserved1 : 18; 239 uint8_t direction : 1; 240 uint32_t bool_addr : 8; 241 uint8_t condition : 1; 242 instr_addr_mode_t address_mode : 1; 243 instr_cf_opc_t opc : 4; 244 } instr_cf_jmp_call_t; 245 246 typedef struct PACKED { 247 uint8_t size : 4; 248 uint64_t reserved0 : 36; 249 uint8_t no_serial : 1; 250 instr_alloc_type_t buffer_select : 2; 251 uint8_t alloc_mode : 1; 252 instr_cf_opc_t opc : 4; 253 } instr_cf_alloc_t; 254 255 typedef union PACKED { 256 instr_cf_exec_t exec; 257 instr_cf_loop_t loop; 258 instr_cf_jmp_call_t jmp_call; 259 instr_cf_alloc_t alloc; 260 struct PACKED { 261 uint64_t dummy : 44; 262 instr_cf_opc_t opc : 4; 263 }; 264 } instr_cf_t; 265 266 /* 267 * FETCH instructions: 268 */ 269 270 typedef enum { 271 VTX_FETCH = 0, 272 TEX_FETCH = 1, 273 TEX_GET_BORDER_COLOR_FRAC = 16, 274 TEX_GET_COMP_TEX_LOD = 17, 275 TEX_GET_GRADIENTS = 18, 276 TEX_GET_WEIGHTS = 19, 277 TEX_SET_TEX_LOD = 24, 278 TEX_SET_GRADIENTS_H = 25, 279 TEX_SET_GRADIENTS_V = 26, 280 TEX_RESERVED_4 = 27, 281 } instr_fetch_opc_t; 282 283 typedef enum { 284 TEX_FILTER_POINT = 0, 285 TEX_FILTER_LINEAR = 1, 286 TEX_FILTER_BASEMAP = 2, /* only applicable for mip-filter */ 287 TEX_FILTER_USE_FETCH_CONST = 3, 288 } instr_tex_filter_t; 289 290 typedef enum { 291 ANISO_FILTER_DISABLED = 0, 292 ANISO_FILTER_MAX_1_1 = 1, 293 ANISO_FILTER_MAX_2_1 = 2, 294 ANISO_FILTER_MAX_4_1 = 3, 295 ANISO_FILTER_MAX_8_1 = 4, 296 ANISO_FILTER_MAX_16_1 = 5, 297 ANISO_FILTER_USE_FETCH_CONST = 7, 298 } instr_aniso_filter_t; 299 300 typedef enum { 301 ARBITRARY_FILTER_2X4_SYM = 0, 302 ARBITRARY_FILTER_2X4_ASYM = 1, 303 ARBITRARY_FILTER_4X2_SYM = 2, 304 ARBITRARY_FILTER_4X2_ASYM = 3, 305 ARBITRARY_FILTER_4X4_SYM = 4, 306 ARBITRARY_FILTER_4X4_ASYM = 5, 307 ARBITRARY_FILTER_USE_FETCH_CONST = 7, 308 } instr_arbitrary_filter_t; 309 310 typedef enum { 311 SAMPLE_CENTROID = 0, 312 SAMPLE_CENTER = 1, 313 } instr_sample_loc_t; 314 315 typedef enum a2xx_sq_surfaceformat instr_surf_fmt_t; 316 317 typedef struct PACKED { 318 /* dword0: */ 319 instr_fetch_opc_t opc : 5; 320 uint32_t src_reg : 6; 321 uint8_t src_reg_am : 1; 322 uint32_t dst_reg : 6; 323 uint8_t dst_reg_am : 1; 324 uint8_t fetch_valid_only : 1; 325 uint32_t const_idx : 5; 326 uint8_t tx_coord_denorm : 1; 327 uint8_t src_swiz : 6; 328 /* dword1: */ 329 uint16_t dst_swiz : 12; 330 instr_tex_filter_t mag_filter : 2; 331 instr_tex_filter_t min_filter : 2; 332 instr_tex_filter_t mip_filter : 2; 333 instr_aniso_filter_t aniso_filter : 3; 334 instr_arbitrary_filter_t arbitrary_filter : 3; 335 instr_tex_filter_t vol_mag_filter : 2; 336 instr_tex_filter_t vol_min_filter : 2; 337 uint8_t use_comp_lod : 1; 338 uint8_t use_reg_lod : 2; /* 0 for cube, 1 for 2d */ 339 uint8_t pred_select : 1; 340 /* dword2: */ 341 uint8_t use_reg_gradients : 1; 342 instr_sample_loc_t sample_location : 1; 343 uint32_t lod_bias : 7; 344 uint8_t unused : 7; 345 uint8_t offset_x : 5; 346 uint32_t offset_y : 5; 347 uint8_t offset_z : 5; 348 uint8_t pred_condition : 1; 349 } instr_fetch_tex_t; 350 351 typedef struct PACKED { 352 /* dword0: */ 353 instr_fetch_opc_t opc : 5; 354 uint32_t src_reg : 6; 355 uint8_t src_reg_am : 1; 356 uint32_t dst_reg : 6; 357 uint8_t dst_reg_am : 1; 358 uint8_t must_be_one : 1; 359 uint32_t const_index : 5; 360 uint8_t const_index_sel : 2; 361 uint8_t reserved0 : 3; 362 uint8_t src_swiz : 2; 363 /* dword1: */ 364 uint16_t dst_swiz : 12; 365 uint8_t format_comp_all : 1; /* '1' for signed, '0' for unsigned? */ 366 uint8_t num_format_all : 1; /* '0' for normalized, '1' for unnormalized */ 367 uint8_t signed_rf_mode_all : 1; 368 uint8_t reserved1 : 1; 369 instr_surf_fmt_t format : 6; 370 uint8_t reserved2 : 2; 371 uint8_t exp_adjust_all : 6; 372 uint8_t reserved3 : 1; 373 uint8_t pred_select : 1; 374 /* dword2: */ 375 uint8_t stride : 8; 376 uint32_t offset : 22; 377 uint8_t reserved4 : 1; 378 uint8_t pred_condition : 1; 379 } instr_fetch_vtx_t; 380 381 typedef union PACKED { 382 instr_fetch_tex_t tex; 383 instr_fetch_vtx_t vtx; 384 struct PACKED { 385 /* dword0: */ 386 instr_fetch_opc_t opc : 5; 387 uint32_t dummy0 : 27; 388 /* dword1: */ 389 uint32_t dummy1 : 31; 390 uint8_t pred_select : 1; 391 /* dword2: */ 392 uint32_t dummy2 : 31; 393 uint8_t pred_condition : 1; 394 }; 395 } instr_fetch_t; 396 397 typedef union PACKED { 398 instr_alu_t alu; 399 instr_fetch_t fetch; 400 } instr_t; 401 402 #endif /* INSTR_H_ */ 403