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