lp_bld_tgsi.h revision 46931ecf480e1d231bb6c2236d91b5390f2465ac
1/************************************************************************** 2 * 3 * Copyright 2011-2012 Advanced Micro Devices, Inc. 4 * Copyright 2009 VMware, Inc. 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation the rights to use, copy, modify, merge, publish, 11 * distribute, sub license, and/or sell copies of the Software, and to 12 * permit persons to whom the Software is furnished to do so, subject to 13 * the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial portions 17 * of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 23 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 24 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 25 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 26 * 27 **************************************************************************/ 28 29/** 30 * @file 31 * TGSI to LLVM IR translation. 32 * 33 * @author Jose Fonseca <jfonseca@vmware.com> 34 * @author Tom Stellard <thomas.stellard@amd.com> 35 */ 36 37#ifndef LP_BLD_TGSI_H 38#define LP_BLD_TGSI_H 39 40#include "gallivm/lp_bld.h" 41#include "gallivm/lp_bld_tgsi_action.h" 42#include "gallivm/lp_bld_limits.h" 43#include "lp_bld_type.h" 44#include "pipe/p_compiler.h" 45#include "pipe/p_state.h" 46#include "tgsi/tgsi_exec.h" 47#include "tgsi/tgsi_scan.h" 48#include "tgsi/tgsi_info.h" 49 50#define LP_CHAN_ALL ~0 51 52#define LP_MAX_INSTRUCTIONS 256 53 54struct tgsi_full_declaration; 55struct tgsi_full_immediate; 56struct tgsi_full_instruction; 57struct tgsi_full_src_register; 58struct tgsi_opcode_info; 59struct tgsi_token; 60struct tgsi_shader_info; 61struct lp_build_mask_context; 62struct gallivm_state; 63 64 65enum lp_build_tex_modifier { 66 LP_BLD_TEX_MODIFIER_NONE = 0, 67 LP_BLD_TEX_MODIFIER_PROJECTED, 68 LP_BLD_TEX_MODIFIER_LOD_BIAS, 69 LP_BLD_TEX_MODIFIER_EXPLICIT_LOD, 70 LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV 71}; 72 73 74/** 75 * Describe a channel of a register. 76 * 77 * The value can be a: 78 * - immediate value (i.e. derived from a IMM register) 79 * - CONST[n].x/y/z/w 80 * - IN[n].x/y/z/w 81 * - undetermined (when .file == TGSI_FILE_NULL) 82 * 83 * This is one of the analysis results, and is used to described 84 * the output color in terms of inputs. 85 */ 86struct lp_tgsi_channel_info 87{ 88 unsigned file:4; /* TGSI_FILE_* */ 89 unsigned swizzle:3; /* PIPE_SWIZZLE_x */ 90 union { 91 uint32_t index; 92 float value; /* for TGSI_FILE_IMMEDIATE */ 93 } u; 94}; 95 96 97/** 98 * Describe a texture sampler interpolator. 99 * 100 * The interpolation is described in terms of regular inputs. 101 */ 102struct lp_tgsi_texture_info 103{ 104 struct lp_tgsi_channel_info coord[4]; 105 unsigned target:8; /* TGSI_TEXTURE_* */ 106 unsigned unit:8; /* Sampler unit */ 107 unsigned modifier:8; /* LP_BLD_TEX_MODIFIER_* */ 108}; 109 110 111struct lp_tgsi_info 112{ 113 struct tgsi_shader_info base; 114 115 /* 116 * Whether any of the texture opcodes access a register file other than 117 * TGSI_FILE_INPUT. 118 * 119 * We could also handle TGSI_FILE_CONST/IMMEDIATE here, but there is little 120 * benefit. 121 */ 122 unsigned indirect_textures:1; 123 124 /* 125 * Whether any immediate values are outside the range of 0 and 1 126 */ 127 unsigned unclamped_immediates:1; 128 129 /* 130 * Texture opcode description. Aimed at detecting and described direct 131 * texture opcodes. 132 */ 133 unsigned num_texs; 134 struct lp_tgsi_texture_info tex[PIPE_MAX_SAMPLERS]; 135 136 /* 137 * Output description. Aimed at detecting and describing simple blit 138 * shaders. 139 */ 140 struct lp_tgsi_channel_info output[PIPE_MAX_SHADER_OUTPUTS][4]; 141 142 /* 143 * Shortcut pointers into the above (for fragment shaders). 144 */ 145 const struct lp_tgsi_channel_info *cbuf[PIPE_MAX_COLOR_BUFS]; 146}; 147 148/** 149 * Sampler code generation interface. 150 * 151 * Although texture sampling is a requirement for TGSI translation, it is 152 * a very different problem with several different approaches to it. This 153 * structure establishes an interface for texture sampling code generation, so 154 * that we can easily use different texture sampling strategies. 155 */ 156struct lp_build_sampler_soa 157{ 158 void 159 (*destroy)( struct lp_build_sampler_soa *sampler ); 160 161 void 162 (*emit_fetch_texel)( const struct lp_build_sampler_soa *sampler, 163 struct gallivm_state *gallivm, 164 struct lp_type type, 165 unsigned unit, 166 unsigned num_coords, 167 const LLVMValueRef *coords, 168 const LLVMValueRef *ddx, 169 const LLVMValueRef *ddy, 170 LLVMValueRef lod_bias, /* optional */ 171 LLVMValueRef explicit_lod, /* optional */ 172 LLVMValueRef *texel); 173 174 void 175 (*emit_size_query)( const struct lp_build_sampler_soa *sampler, 176 struct gallivm_state *gallivm, 177 unsigned unit, 178 LLVMValueRef explicit_lod, /* optional */ 179 LLVMValueRef *sizes_out); 180}; 181 182 183struct lp_build_sampler_aos 184{ 185 LLVMValueRef 186 (*emit_fetch_texel)( struct lp_build_sampler_aos *sampler, 187 struct lp_build_context *bld, 188 unsigned target, /* TGSI_TEXTURE_* */ 189 unsigned unit, 190 LLVMValueRef coords, 191 LLVMValueRef ddx, 192 LLVMValueRef ddy, 193 enum lp_build_tex_modifier modifier); 194}; 195 196 197void 198lp_build_tgsi_info(const struct tgsi_token *tokens, 199 struct lp_tgsi_info *info); 200 201 202void 203lp_build_tgsi_soa(struct gallivm_state *gallivm, 204 const struct tgsi_token *tokens, 205 struct lp_type type, 206 struct lp_build_mask_context *mask, 207 LLVMValueRef consts_ptr, 208 LLVMValueRef instance_id, 209 const LLVMValueRef *pos, 210 const LLVMValueRef (*inputs)[4], 211 LLVMValueRef (*outputs)[4], 212 struct lp_build_sampler_soa *sampler, 213 const struct tgsi_shader_info *info); 214 215 216void 217lp_build_tgsi_aos(struct gallivm_state *gallivm, 218 const struct tgsi_token *tokens, 219 struct lp_type type, 220 const unsigned char swizzles[4], 221 LLVMValueRef consts_ptr, 222 const LLVMValueRef *inputs, 223 LLVMValueRef *outputs, 224 struct lp_build_sampler_aos *sampler, 225 const struct tgsi_shader_info *info); 226 227 228struct lp_exec_mask { 229 struct lp_build_context *bld; 230 231 boolean has_mask; 232 233 LLVMTypeRef int_vec_type; 234 235 LLVMValueRef cond_stack[LP_MAX_TGSI_NESTING]; 236 int cond_stack_size; 237 LLVMValueRef cond_mask; 238 239 LLVMBasicBlockRef loop_block; 240 LLVMValueRef cont_mask; 241 LLVMValueRef break_mask; 242 LLVMValueRef break_var; 243 struct { 244 LLVMBasicBlockRef loop_block; 245 LLVMValueRef cont_mask; 246 LLVMValueRef break_mask; 247 LLVMValueRef break_var; 248 } loop_stack[LP_MAX_TGSI_NESTING]; 249 int loop_stack_size; 250 251 LLVMValueRef ret_mask; 252 struct { 253 int pc; 254 LLVMValueRef ret_mask; 255 } call_stack[LP_MAX_TGSI_NESTING]; 256 int call_stack_size; 257 258 LLVMValueRef exec_mask; 259 LLVMValueRef loop_limiter; 260}; 261 262struct lp_build_tgsi_inst_list 263{ 264 struct tgsi_full_instruction *instructions; 265 uint max_instructions; 266 uint num_instructions; 267}; 268 269unsigned lp_bld_tgsi_list_init(struct lp_build_tgsi_context * bld_base); 270 271 272unsigned lp_bld_tgsi_add_instruction( 273 struct lp_build_tgsi_context * bld_base, 274 struct tgsi_full_instruction *inst_to_add); 275 276 277struct lp_build_tgsi_context; 278 279 280typedef LLVMValueRef (*lp_build_emit_fetch_fn)(struct lp_build_tgsi_context *, 281 const struct tgsi_full_src_register *, 282 enum tgsi_opcode_type, 283 unsigned); 284 285struct lp_build_tgsi_context 286{ 287 struct lp_build_context base; 288 289 struct lp_build_context uint_bld; 290 struct lp_build_context int_bld; 291 292 /** This array stores functions that are used to transform TGSI opcodes to 293 * LLVM instructions. 294 */ 295 struct lp_build_tgsi_action op_actions[TGSI_OPCODE_LAST]; 296 297 /* TGSI_OPCODE_RSQ is defined as 1 / sqrt( abs(src0.x) ), rsq_action 298 * should compute 1 / sqrt (src0.x) */ 299 struct lp_build_tgsi_action rsq_action; 300 301 const struct tgsi_shader_info *info; 302 303 lp_build_emit_fetch_fn emit_fetch_funcs[TGSI_FILE_COUNT]; 304 305 LLVMValueRef (*emit_swizzle)(struct lp_build_tgsi_context *, 306 LLVMValueRef, unsigned, unsigned, unsigned, unsigned); 307 308 void (*emit_store)(struct lp_build_tgsi_context *, 309 const struct tgsi_full_instruction *, 310 const struct tgsi_opcode_info *, 311 LLVMValueRef dst[4]); 312 313 void (*emit_declaration)(struct lp_build_tgsi_context *, 314 const struct tgsi_full_declaration *decl); 315 316 void (*emit_immediate)(struct lp_build_tgsi_context *, 317 const struct tgsi_full_immediate *imm); 318 319 320 /* Allow the user to store data in this structure rather than passing it 321 * to every function. */ 322 void * userdata; 323 324 boolean soa; 325 326 int pc; 327 328 struct tgsi_full_instruction *instructions; 329 uint max_instructions; 330 uint num_instructions; 331 332 /** This function allows the user to insert some instructions at the 333 * beginning of the program. It is optional and does not need to be 334 * implemented. 335 */ 336 void (*emit_prologue)(struct lp_build_tgsi_context*); 337 338 /** This function allows the user to insert some instructions at the end of 339 * the program. This callback is intended to be used for emitting 340 * instructions to handle the export for the output registers, but it can 341 * be used for any purpose. Implementing this function is optiona, but 342 * recommended. 343 */ 344 void (*emit_epilogue)(struct lp_build_tgsi_context*); 345}; 346 347struct lp_build_tgsi_soa_context 348{ 349 struct lp_build_tgsi_context bld_base; 350 351 /* Builder for scalar elements of shader's data type (float) */ 352 struct lp_build_context elem_bld; 353 354 LLVMValueRef consts_ptr; 355 const LLVMValueRef *pos; 356 const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS]; 357 LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS]; 358 359 const struct lp_build_sampler_soa *sampler; 360 361 LLVMValueRef immediates[LP_MAX_TGSI_IMMEDIATES][TGSI_NUM_CHANNELS]; 362 LLVMValueRef temps[LP_MAX_TGSI_TEMPS][TGSI_NUM_CHANNELS]; 363 LLVMValueRef addr[LP_MAX_TGSI_ADDRS][TGSI_NUM_CHANNELS]; 364 LLVMValueRef preds[LP_MAX_TGSI_PREDS][TGSI_NUM_CHANNELS]; 365 366 /* We allocate/use this array of temps if (1 << TGSI_FILE_TEMPORARY) is 367 * set in the indirect_files field. 368 * The temps[] array above is unused then. 369 */ 370 LLVMValueRef temps_array; 371 372 /* We allocate/use this array of output if (1 << TGSI_FILE_OUTPUT) is 373 * set in the indirect_files field. 374 * The outputs[] array above is unused then. 375 */ 376 LLVMValueRef outputs_array; 377 378 /* We allocate/use this array of inputs if (1 << TGSI_FILE_INPUT) is 379 * set in the indirect_files field. 380 * The inputs[] array above is unused then. 381 */ 382 LLVMValueRef inputs_array; 383 384 LLVMValueRef instance_id; 385 386 /** bitmask indicating which register files are accessed indirectly */ 387 unsigned indirect_files; 388 389 struct lp_build_mask_context *mask; 390 struct lp_exec_mask exec_mask; 391 392 uint num_immediates; 393 394}; 395 396void 397lp_emit_declaration_soa( 398 struct lp_build_tgsi_context *bld, 399 const struct tgsi_full_declaration *decl); 400 401void lp_emit_immediate_soa( 402 struct lp_build_tgsi_context *bld_base, 403 const struct tgsi_full_immediate *imm); 404 405boolean 406lp_emit_instruction_soa( 407 struct lp_build_tgsi_soa_context *bld, 408 const struct tgsi_full_instruction *inst, 409 const struct tgsi_opcode_info *info); 410 411 412LLVMValueRef 413lp_get_temp_ptr_soa( 414 struct lp_build_tgsi_soa_context *bld, 415 unsigned index, 416 unsigned chan); 417 418LLVMValueRef 419lp_get_output_ptr( 420 struct lp_build_tgsi_soa_context *bld, 421 unsigned index, 422 unsigned chan); 423 424struct lp_build_tgsi_aos_context 425{ 426 struct lp_build_tgsi_context bld_base; 427 428 /* Builder for integer masks and indices */ 429 struct lp_build_context int_bld; 430 431 /* 432 * AoS swizzle used: 433 * - swizzles[0] = red index 434 * - swizzles[1] = green index 435 * - swizzles[2] = blue index 436 * - swizzles[3] = alpha index 437 */ 438 unsigned char swizzles[4]; 439 unsigned char inv_swizzles[4]; 440 441 LLVMValueRef consts_ptr; 442 const LLVMValueRef *inputs; 443 LLVMValueRef *outputs; 444 445 struct lp_build_sampler_aos *sampler; 446 447 LLVMValueRef immediates[LP_MAX_TGSI_IMMEDIATES]; 448 LLVMValueRef temps[LP_MAX_TGSI_TEMPS]; 449 LLVMValueRef addr[LP_MAX_TGSI_ADDRS]; 450 LLVMValueRef preds[LP_MAX_TGSI_PREDS]; 451 452 /* We allocate/use this array of temps if (1 << TGSI_FILE_TEMPORARY) is 453 * set in the indirect_files field. 454 * The temps[] array above is unused then. 455 */ 456 LLVMValueRef temps_array; 457 458 /** bitmask indicating which register files are accessed indirectly */ 459 unsigned indirect_files; 460 461}; 462 463static INLINE struct lp_build_tgsi_soa_context * 464lp_soa_context(struct lp_build_tgsi_context *bld_base) 465{ 466 return (struct lp_build_tgsi_soa_context *)bld_base; 467} 468 469static INLINE struct lp_build_tgsi_aos_context * 470lp_aos_context(struct lp_build_tgsi_context *bld_base) 471{ 472 return (struct lp_build_tgsi_aos_context *)bld_base; 473} 474 475void 476lp_emit_declaration_aos( 477 struct lp_build_tgsi_aos_context *bld, 478 const struct tgsi_full_declaration *decl); 479 480 481boolean 482lp_emit_instruction_aos( 483 struct lp_build_tgsi_aos_context *bld, 484 const struct tgsi_full_instruction *inst, 485 const struct tgsi_opcode_info *info, 486 int *pc); 487 488void 489lp_emit_store_aos( 490 struct lp_build_tgsi_aos_context *bld, 491 const struct tgsi_full_instruction *inst, 492 unsigned index, 493 LLVMValueRef value); 494 495void lp_build_fetch_args( 496 struct lp_build_tgsi_context * bld_base, 497 struct lp_build_emit_data * emit_data); 498 499LLVMValueRef 500lp_build_tgsi_inst_llvm_aos( 501 struct lp_build_tgsi_context * bld_base, 502 const struct tgsi_full_instruction *inst); 503 504void 505lp_build_tgsi_intrinsic( 506 const struct lp_build_tgsi_action * action, 507 struct lp_build_tgsi_context * bld_base, 508 struct lp_build_emit_data * emit_data); 509 510LLVMValueRef 511lp_build_emit_llvm( 512 struct lp_build_tgsi_context *bld_base, 513 unsigned tgsi_opcode, 514 struct lp_build_emit_data * emit_data); 515 516LLVMValueRef 517lp_build_emit_llvm_unary( 518 struct lp_build_tgsi_context *bld_base, 519 unsigned tgsi_opcode, 520 LLVMValueRef arg0); 521 522LLVMValueRef 523lp_build_emit_llvm_binary( 524 struct lp_build_tgsi_context *bld_base, 525 unsigned tgsi_opcode, 526 LLVMValueRef arg0, 527 LLVMValueRef arg1); 528 529LLVMValueRef 530lp_build_emit_llvm_ternary( 531 struct lp_build_tgsi_context *bld_base, 532 unsigned tgsi_opcode, 533 LLVMValueRef arg0, 534 LLVMValueRef arg1, 535 LLVMValueRef arg2); 536 537boolean 538lp_build_tgsi_inst_llvm( 539 struct lp_build_tgsi_context * bld_base, 540 const struct tgsi_full_instruction *inst); 541 542LLVMValueRef 543lp_build_emit_fetch( 544 struct lp_build_tgsi_context *bld_base, 545 const struct tgsi_full_instruction *inst, 546 unsigned src_op, 547 const unsigned chan_index); 548 549boolean 550lp_build_tgsi_llvm( 551 struct lp_build_tgsi_context * bld_base, 552 const struct tgsi_token *tokens); 553 554#endif /* LP_BLD_TGSI_H */ 555