1 /* 2 * Copyright (c) 2012 Rob Clark <robdclark (at) 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 IR2_H_ 25 #define IR2_H_ 26 27 #include <stdint.h> 28 #include <stdbool.h> 29 30 #include "instr-a2xx.h" 31 32 /* low level intermediate representation of an adreno a2xx shader program */ 33 34 struct ir2_shader; 35 36 struct ir2_shader_info { 37 uint16_t sizedwords; 38 int8_t max_reg; /* highest GPR # used by shader */ 39 uint8_t max_input_reg; 40 uint64_t regs_written; 41 }; 42 43 struct ir2_register { 44 enum { 45 IR2_REG_CONST = 0x1, 46 IR2_REG_EXPORT = 0x2, 47 IR2_REG_NEGATE = 0x4, 48 IR2_REG_ABS = 0x8, 49 } flags; 50 int num; 51 char *swizzle; 52 }; 53 54 enum ir2_pred { 55 IR2_PRED_NONE = 0, 56 IR2_PRED_EQ = 1, 57 IR2_PRED_NE = 2, 58 }; 59 60 struct ir2_instruction { 61 struct ir2_shader *shader; 62 enum { 63 IR2_FETCH, 64 IR2_ALU, 65 } instr_type; 66 enum ir2_pred pred; 67 int sync; 68 unsigned regs_count; 69 struct ir2_register *regs[5]; 70 union { 71 /* FETCH specific: */ 72 struct { 73 instr_fetch_opc_t opc; 74 unsigned const_idx; 75 /* texture fetch specific: */ 76 bool is_cube : 1; 77 /* vertex fetch specific: */ 78 unsigned const_idx_sel; 79 enum a2xx_sq_surfaceformat fmt; 80 bool is_signed : 1; 81 bool is_normalized : 1; 82 uint32_t stride; 83 uint32_t offset; 84 } fetch; 85 /* ALU specific: */ 86 struct { 87 instr_vector_opc_t vector_opc; 88 instr_scalar_opc_t scalar_opc; 89 bool vector_clamp : 1; 90 bool scalar_clamp : 1; 91 } alu; 92 }; 93 }; 94 95 struct ir2_cf { 96 struct ir2_shader *shader; 97 instr_cf_opc_t cf_type; 98 99 union { 100 /* EXEC/EXEC_END specific: */ 101 struct { 102 unsigned instrs_count; 103 struct ir2_instruction *instrs[6]; 104 uint32_t addr, cnt, sequence; 105 } exec; 106 /* ALLOC specific: */ 107 struct { 108 instr_alloc_type_t type; /* SQ_POSITION or SQ_PARAMETER_PIXEL */ 109 int size; 110 } alloc; 111 }; 112 }; 113 114 struct ir2_shader { 115 unsigned cfs_count; 116 struct ir2_cf *cfs[0x56]; 117 uint32_t heap[100 * 4096]; 118 unsigned heap_idx; 119 120 enum ir2_pred pred; /* pred inherited by newly created instrs */ 121 }; 122 123 struct ir2_shader * ir2_shader_create(void); 124 void ir2_shader_destroy(struct ir2_shader *shader); 125 void * ir2_shader_assemble(struct ir2_shader *shader, 126 struct ir2_shader_info *info); 127 128 struct ir2_cf * ir2_cf_create(struct ir2_shader *shader, instr_cf_opc_t cf_type); 129 130 struct ir2_instruction * ir2_instr_create(struct ir2_cf *cf, int instr_type); 131 132 struct ir2_register * ir2_reg_create(struct ir2_instruction *instr, 133 int num, const char *swizzle, int flags); 134 135 /* some helper fxns: */ 136 137 static inline struct ir2_cf * 138 ir2_cf_create_alloc(struct ir2_shader *shader, instr_alloc_type_t type, int size) 139 { 140 struct ir2_cf *cf = ir2_cf_create(shader, ALLOC); 141 if (!cf) 142 return cf; 143 cf->alloc.type = type; 144 cf->alloc.size = size; 145 return cf; 146 } 147 static inline struct ir2_instruction * 148 ir2_instr_create_alu(struct ir2_cf *cf, instr_vector_opc_t vop, instr_scalar_opc_t sop) 149 { 150 struct ir2_instruction *instr = ir2_instr_create(cf, IR2_ALU); 151 if (!instr) 152 return instr; 153 instr->alu.vector_opc = vop; 154 instr->alu.scalar_opc = sop; 155 return instr; 156 } 157 static inline struct ir2_instruction * 158 ir2_instr_create_vtx_fetch(struct ir2_cf *cf, int ci, int cis, 159 enum a2xx_sq_surfaceformat fmt, bool is_signed, int stride) 160 { 161 struct ir2_instruction *instr = ir2_instr_create(cf, IR2_FETCH); 162 instr->fetch.opc = VTX_FETCH; 163 instr->fetch.const_idx = ci; 164 instr->fetch.const_idx_sel = cis; 165 instr->fetch.fmt = fmt; 166 instr->fetch.is_signed = is_signed; 167 instr->fetch.stride = stride; 168 return instr; 169 } 170 static inline struct ir2_instruction * 171 ir2_instr_create_tex_fetch(struct ir2_cf *cf, int ci) 172 { 173 struct ir2_instruction *instr = ir2_instr_create(cf, IR2_FETCH); 174 instr->fetch.opc = TEX_FETCH; 175 instr->fetch.const_idx = ci; 176 return instr; 177 } 178 179 180 #endif /* IR2_H_ */ 181