1 /*
2  Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3  Intel funded Tungsten Graphics to
4  develop this 3D driver.
5 
6  Permission is hereby granted, free of charge, to any person obtaining
7  a copy of this software and associated documentation files (the
8  "Software"), to deal in the Software without restriction, including
9  without limitation the rights to use, copy, modify, merge, publish,
10  distribute, sublicense, and/or sell copies of the Software, and to
11  permit persons to whom the Software is furnished to do so, subject to
12  the following conditions:
13 
14  The above copyright notice and this permission notice (including the
15  next paragraph) shall be included in all copies or substantial
16  portions of the Software.
17 
18  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21  IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22  LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23  OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24  WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 
26  **********************************************************************/
27  /*
28   * Authors:
29   *   Keith Whitwell <keithw@vmware.com>
30   */
31 
32 
33 #ifndef BRW_EU_H
34 #define BRW_EU_H
35 
36 #include <stdbool.h>
37 #include <stdio.h>
38 #include "brw_inst.h"
39 #include "brw_compiler.h"
40 #include "brw_eu_defines.h"
41 #include "brw_reg.h"
42 #include "brw_disasm_info.h"
43 
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47 
48 #define BRW_EU_MAX_INSN_STACK 5
49 
50 struct brw_insn_state {
51    /* One of BRW_EXECUTE_* */
52    unsigned exec_size:3;
53 
54    /* Group in units of channels */
55    unsigned group:5;
56 
57    /* Compression control on gen4-5 */
58    bool compressed:1;
59 
60    /* One of BRW_MASK_* */
61    unsigned mask_control:1;
62 
63    /* Scheduling info for Gen12+ */
64    struct tgl_swsb swsb;
65 
66    bool saturate:1;
67 
68    /* One of BRW_ALIGN_* */
69    unsigned access_mode:1;
70 
71    /* One of BRW_PREDICATE_* */
72    enum brw_predicate predicate:4;
73 
74    bool pred_inv:1;
75 
76    /* Flag subreg.  Bottom bit is subreg, top bit is reg */
77    unsigned flag_subreg:2;
78 
79    bool acc_wr_control:1;
80 };
81 
82 
83 /* A helper for accessing the last instruction emitted.  This makes it easy
84  * to set various bits on an instruction without having to create temporary
85  * variable and assign the emitted instruction to those.
86  */
87 #define brw_last_inst (&p->store[p->nr_insn - 1])
88 
89 struct brw_codegen {
90    brw_inst *store;
91    int store_size;
92    unsigned nr_insn;
93    unsigned int next_insn_offset;
94 
95    void *mem_ctx;
96 
97    /* Allow clients to push/pop instruction state:
98     */
99    struct brw_insn_state stack[BRW_EU_MAX_INSN_STACK];
100    struct brw_insn_state *current;
101 
102    /** Whether or not the user wants automatic exec sizes
103     *
104     * If true, codegen will try to automatically infer the exec size of an
105     * instruction from the width of the destination register.  If false, it
106     * will take whatever is set by brw_set_default_exec_size verbatim.
107     *
108     * This is set to true by default in brw_init_codegen.
109     */
110    bool automatic_exec_sizes;
111 
112    bool single_program_flow;
113    const struct gen_device_info *devinfo;
114 
115    /* Control flow stacks:
116     * - if_stack contains IF and ELSE instructions which must be patched
117     *   (and popped) once the matching ENDIF instruction is encountered.
118     *
119     *   Just store the instruction pointer(an index).
120     */
121    int *if_stack;
122    int if_stack_depth;
123    int if_stack_array_size;
124 
125    /**
126     * loop_stack contains the instruction pointers of the starts of loops which
127     * must be patched (and popped) once the matching WHILE instruction is
128     * encountered.
129     */
130    int *loop_stack;
131    /**
132     * pre-gen6, the BREAK and CONT instructions had to tell how many IF/ENDIF
133     * blocks they were popping out of, to fix up the mask stack.  This tracks
134     * the IF/ENDIF nesting in each current nested loop level.
135     */
136    int *if_depth_in_loop;
137    int loop_stack_depth;
138    int loop_stack_array_size;
139 
140    struct brw_shader_reloc *relocs;
141    int num_relocs;
142    int reloc_array_size;
143 };
144 
145 struct brw_label {
146    int offset;
147    int number;
148    struct brw_label *next;
149 };
150 
151 void brw_pop_insn_state( struct brw_codegen *p );
152 void brw_push_insn_state( struct brw_codegen *p );
153 unsigned brw_get_default_exec_size(struct brw_codegen *p);
154 unsigned brw_get_default_group(struct brw_codegen *p);
155 unsigned brw_get_default_access_mode(struct brw_codegen *p);
156 struct tgl_swsb brw_get_default_swsb(struct brw_codegen *p);
157 void brw_set_default_exec_size(struct brw_codegen *p, unsigned value);
158 void brw_set_default_mask_control( struct brw_codegen *p, unsigned value );
159 void brw_set_default_saturate( struct brw_codegen *p, bool enable );
160 void brw_set_default_access_mode( struct brw_codegen *p, unsigned access_mode );
161 void brw_inst_set_compression(const struct gen_device_info *devinfo,
162                               brw_inst *inst, bool on);
163 void brw_set_default_compression(struct brw_codegen *p, bool on);
164 void brw_inst_set_group(const struct gen_device_info *devinfo,
165                         brw_inst *inst, unsigned group);
166 void brw_set_default_group(struct brw_codegen *p, unsigned group);
167 void brw_set_default_compression_control(struct brw_codegen *p, enum brw_compression c);
168 void brw_set_default_predicate_control(struct brw_codegen *p, enum brw_predicate pc);
169 void brw_set_default_predicate_inverse(struct brw_codegen *p, bool predicate_inverse);
170 void brw_set_default_flag_reg(struct brw_codegen *p, int reg, int subreg);
171 void brw_set_default_acc_write_control(struct brw_codegen *p, unsigned value);
172 void brw_set_default_swsb(struct brw_codegen *p, struct tgl_swsb value);
173 
174 void brw_init_codegen(const struct gen_device_info *, struct brw_codegen *p,
175 		      void *mem_ctx);
176 bool brw_has_jip(const struct gen_device_info *devinfo, enum opcode opcode);
177 bool brw_has_uip(const struct gen_device_info *devinfo, enum opcode opcode);
178 const struct brw_label *brw_find_label(const struct brw_label *root, int offset);
179 void brw_create_label(struct brw_label **labels, int offset, void *mem_ctx);
180 int brw_disassemble_inst(FILE *file, const struct gen_device_info *devinfo,
181                          const struct brw_inst *inst, bool is_compacted,
182                          int offset, const struct brw_label *root_label);
183 const struct brw_label *brw_label_assembly(const struct gen_device_info *devinfo,
184                                            const void *assembly, int start, int end,
185                                            void *mem_ctx);
186 void brw_disassemble_with_labels(const struct gen_device_info *devinfo,
187                                  const void *assembly, int start, int end, FILE *out);
188 void brw_disassemble(const struct gen_device_info *devinfo,
189                      const void *assembly, int start, int end,
190                      const struct brw_label *root_label, FILE *out);
191 const struct brw_shader_reloc *brw_get_shader_relocs(struct brw_codegen *p,
192                                                      unsigned *num_relocs);
193 const unsigned *brw_get_program( struct brw_codegen *p, unsigned *sz );
194 
195 bool brw_try_override_assembly(struct brw_codegen *p, int start_offset,
196                                const char *identifier);
197 
198 void brw_realign(struct brw_codegen *p, unsigned align);
199 int brw_append_data(struct brw_codegen *p, void *data,
200                     unsigned size, unsigned align);
201 brw_inst *brw_next_insn(struct brw_codegen *p, unsigned opcode);
202 void brw_set_dest(struct brw_codegen *p, brw_inst *insn, struct brw_reg dest);
203 void brw_set_src0(struct brw_codegen *p, brw_inst *insn, struct brw_reg reg);
204 
205 void gen6_resolve_implied_move(struct brw_codegen *p,
206 			       struct brw_reg *src,
207 			       unsigned msg_reg_nr);
208 
209 /* Helpers for regular instructions:
210  */
211 #define ALU1(OP)				\
212 brw_inst *brw_##OP(struct brw_codegen *p,	\
213 	      struct brw_reg dest,		\
214 	      struct brw_reg src0);
215 
216 #define ALU2(OP)				\
217 brw_inst *brw_##OP(struct brw_codegen *p,	\
218 	      struct brw_reg dest,		\
219 	      struct brw_reg src0,		\
220 	      struct brw_reg src1);
221 
222 #define ALU3(OP)				\
223 brw_inst *brw_##OP(struct brw_codegen *p,	\
224 	      struct brw_reg dest,		\
225 	      struct brw_reg src0,		\
226 	      struct brw_reg src1,		\
227 	      struct brw_reg src2);
228 
229 ALU1(MOV)
ALU2(SEL)230 ALU2(SEL)
231 ALU1(NOT)
232 ALU2(AND)
233 ALU2(OR)
234 ALU2(XOR)
235 ALU2(SHR)
236 ALU2(SHL)
237 ALU1(DIM)
238 ALU2(ASR)
239 ALU2(ROL)
240 ALU2(ROR)
241 ALU3(CSEL)
242 ALU1(F32TO16)
243 ALU1(F16TO32)
244 ALU2(ADD)
245 ALU2(AVG)
246 ALU2(MUL)
247 ALU1(FRC)
248 ALU1(RNDD)
249 ALU1(RNDE)
250 ALU1(RNDU)
251 ALU1(RNDZ)
252 ALU2(MAC)
253 ALU2(MACH)
254 ALU1(LZD)
255 ALU2(DP4)
256 ALU2(DPH)
257 ALU2(DP3)
258 ALU2(DP2)
259 ALU2(LINE)
260 ALU2(PLN)
261 ALU3(MAD)
262 ALU3(LRP)
263 ALU1(BFREV)
264 ALU3(BFE)
265 ALU2(BFI1)
266 ALU3(BFI2)
267 ALU1(FBH)
268 ALU1(FBL)
269 ALU1(CBIT)
270 ALU2(ADDC)
271 ALU2(SUBB)
272 ALU2(MAC)
273 
274 #undef ALU1
275 #undef ALU2
276 #undef ALU3
277 
278 
279 /* Helpers for SEND instruction:
280  */
281 
282 /**
283  * Construct a message descriptor immediate with the specified common
284  * descriptor controls.
285  */
286 static inline uint32_t
287 brw_message_desc(const struct gen_device_info *devinfo,
288                  unsigned msg_length,
289                  unsigned response_length,
290                  bool header_present)
291 {
292    if (devinfo->gen >= 5) {
293       return (SET_BITS(msg_length, 28, 25) |
294               SET_BITS(response_length, 24, 20) |
295               SET_BITS(header_present, 19, 19));
296    } else {
297       return (SET_BITS(msg_length, 23, 20) |
298               SET_BITS(response_length, 19, 16));
299    }
300 }
301 
302 static inline unsigned
brw_message_desc_mlen(const struct gen_device_info * devinfo,uint32_t desc)303 brw_message_desc_mlen(const struct gen_device_info *devinfo, uint32_t desc)
304 {
305    if (devinfo->gen >= 5)
306       return GET_BITS(desc, 28, 25);
307    else
308       return GET_BITS(desc, 23, 20);
309 }
310 
311 static inline unsigned
brw_message_desc_rlen(const struct gen_device_info * devinfo,uint32_t desc)312 brw_message_desc_rlen(const struct gen_device_info *devinfo, uint32_t desc)
313 {
314    if (devinfo->gen >= 5)
315       return GET_BITS(desc, 24, 20);
316    else
317       return GET_BITS(desc, 19, 16);
318 }
319 
320 static inline bool
brw_message_desc_header_present(ASSERTED const struct gen_device_info * devinfo,uint32_t desc)321 brw_message_desc_header_present(ASSERTED const struct gen_device_info *devinfo,
322                                 uint32_t desc)
323 {
324    assert(devinfo->gen >= 5);
325    return GET_BITS(desc, 19, 19);
326 }
327 
328 static inline unsigned
brw_message_ex_desc(UNUSED const struct gen_device_info * devinfo,unsigned ex_msg_length)329 brw_message_ex_desc(UNUSED const struct gen_device_info *devinfo,
330                     unsigned ex_msg_length)
331 {
332    return SET_BITS(ex_msg_length, 9, 6);
333 }
334 
335 static inline unsigned
brw_message_ex_desc_ex_mlen(UNUSED const struct gen_device_info * devinfo,uint32_t ex_desc)336 brw_message_ex_desc_ex_mlen(UNUSED const struct gen_device_info *devinfo,
337                             uint32_t ex_desc)
338 {
339    return GET_BITS(ex_desc, 9, 6);
340 }
341 
342 static inline uint32_t
brw_urb_desc(const struct gen_device_info * devinfo,unsigned msg_type,bool per_slot_offset_present,bool channel_mask_present,unsigned global_offset)343 brw_urb_desc(const struct gen_device_info *devinfo,
344              unsigned msg_type,
345              bool per_slot_offset_present,
346              bool channel_mask_present,
347              unsigned global_offset)
348 {
349    if (devinfo->gen >= 8) {
350       return (SET_BITS(per_slot_offset_present, 17, 17) |
351               SET_BITS(channel_mask_present, 15, 15) |
352               SET_BITS(global_offset, 14, 4) |
353               SET_BITS(msg_type, 3, 0));
354    } else if (devinfo->gen >= 7) {
355       assert(!channel_mask_present);
356       return (SET_BITS(per_slot_offset_present, 16, 16) |
357               SET_BITS(global_offset, 13, 3) |
358               SET_BITS(msg_type, 3, 0));
359    } else {
360       unreachable("unhandled URB write generation");
361    }
362 }
363 
364 static inline uint32_t
brw_urb_desc_msg_type(ASSERTED const struct gen_device_info * devinfo,uint32_t desc)365 brw_urb_desc_msg_type(ASSERTED const struct gen_device_info *devinfo,
366                       uint32_t desc)
367 {
368    assert(devinfo->gen >= 7);
369    return GET_BITS(desc, 3, 0);
370 }
371 
372 /**
373  * Construct a message descriptor immediate with the specified sampler
374  * function controls.
375  */
376 static inline uint32_t
brw_sampler_desc(const struct gen_device_info * devinfo,unsigned binding_table_index,unsigned sampler,unsigned msg_type,unsigned simd_mode,unsigned return_format)377 brw_sampler_desc(const struct gen_device_info *devinfo,
378                  unsigned binding_table_index,
379                  unsigned sampler,
380                  unsigned msg_type,
381                  unsigned simd_mode,
382                  unsigned return_format)
383 {
384    const unsigned desc = (SET_BITS(binding_table_index, 7, 0) |
385                           SET_BITS(sampler, 11, 8));
386    if (devinfo->gen >= 7)
387       return (desc | SET_BITS(msg_type, 16, 12) |
388               SET_BITS(simd_mode, 18, 17));
389    else if (devinfo->gen >= 5)
390       return (desc | SET_BITS(msg_type, 15, 12) |
391               SET_BITS(simd_mode, 17, 16));
392    else if (devinfo->is_g4x)
393       return desc | SET_BITS(msg_type, 15, 12);
394    else
395       return (desc | SET_BITS(return_format, 13, 12) |
396               SET_BITS(msg_type, 15, 14));
397 }
398 
399 static inline unsigned
brw_sampler_desc_binding_table_index(UNUSED const struct gen_device_info * devinfo,uint32_t desc)400 brw_sampler_desc_binding_table_index(UNUSED const struct gen_device_info *devinfo,
401                                      uint32_t desc)
402 {
403    return GET_BITS(desc, 7, 0);
404 }
405 
406 static inline unsigned
brw_sampler_desc_sampler(UNUSED const struct gen_device_info * devinfo,uint32_t desc)407 brw_sampler_desc_sampler(UNUSED const struct gen_device_info *devinfo, uint32_t desc)
408 {
409    return GET_BITS(desc, 11, 8);
410 }
411 
412 static inline unsigned
brw_sampler_desc_msg_type(const struct gen_device_info * devinfo,uint32_t desc)413 brw_sampler_desc_msg_type(const struct gen_device_info *devinfo, uint32_t desc)
414 {
415    if (devinfo->gen >= 7)
416       return GET_BITS(desc, 16, 12);
417    else if (devinfo->gen >= 5 || devinfo->is_g4x)
418       return GET_BITS(desc, 15, 12);
419    else
420       return GET_BITS(desc, 15, 14);
421 }
422 
423 static inline unsigned
brw_sampler_desc_simd_mode(const struct gen_device_info * devinfo,uint32_t desc)424 brw_sampler_desc_simd_mode(const struct gen_device_info *devinfo, uint32_t desc)
425 {
426    assert(devinfo->gen >= 5);
427    if (devinfo->gen >= 7)
428       return GET_BITS(desc, 18, 17);
429    else
430       return GET_BITS(desc, 17, 16);
431 }
432 
433 static  inline unsigned
brw_sampler_desc_return_format(ASSERTED const struct gen_device_info * devinfo,uint32_t desc)434 brw_sampler_desc_return_format(ASSERTED const struct gen_device_info *devinfo,
435                                uint32_t desc)
436 {
437    assert(devinfo->gen == 4 && !devinfo->is_g4x);
438    return GET_BITS(desc, 13, 12);
439 }
440 
441 /**
442  * Construct a message descriptor for the dataport
443  */
444 static inline uint32_t
brw_dp_desc(const struct gen_device_info * devinfo,unsigned binding_table_index,unsigned msg_type,unsigned msg_control)445 brw_dp_desc(const struct gen_device_info *devinfo,
446             unsigned binding_table_index,
447             unsigned msg_type,
448             unsigned msg_control)
449 {
450    /* Prior to gen6, things are too inconsistent; use the dp_read/write_desc
451     * helpers instead.
452     */
453    assert(devinfo->gen >= 6);
454    const unsigned desc = SET_BITS(binding_table_index, 7, 0);
455    if (devinfo->gen >= 8) {
456       return (desc | SET_BITS(msg_control, 13, 8) |
457               SET_BITS(msg_type, 18, 14));
458    } else if (devinfo->gen >= 7) {
459       return (desc | SET_BITS(msg_control, 13, 8) |
460               SET_BITS(msg_type, 17, 14));
461    } else {
462       return (desc | SET_BITS(msg_control, 12, 8) |
463               SET_BITS(msg_type, 16, 13));
464    }
465 }
466 
467 static inline unsigned
brw_dp_desc_binding_table_index(UNUSED const struct gen_device_info * devinfo,uint32_t desc)468 brw_dp_desc_binding_table_index(UNUSED const struct gen_device_info *devinfo,
469                                 uint32_t desc)
470 {
471    return GET_BITS(desc, 7, 0);
472 }
473 
474 static inline unsigned
brw_dp_desc_msg_type(const struct gen_device_info * devinfo,uint32_t desc)475 brw_dp_desc_msg_type(const struct gen_device_info *devinfo, uint32_t desc)
476 {
477    assert(devinfo->gen >= 6);
478    if (devinfo->gen >= 8)
479       return GET_BITS(desc, 18, 14);
480    else if (devinfo->gen >= 7)
481       return GET_BITS(desc, 17, 14);
482    else
483       return GET_BITS(desc, 16, 13);
484 }
485 
486 static inline unsigned
brw_dp_desc_msg_control(const struct gen_device_info * devinfo,uint32_t desc)487 brw_dp_desc_msg_control(const struct gen_device_info *devinfo, uint32_t desc)
488 {
489    assert(devinfo->gen >= 6);
490    if (devinfo->gen >= 7)
491       return GET_BITS(desc, 13, 8);
492    else
493       return GET_BITS(desc, 12, 8);
494 }
495 
496 /**
497  * Construct a message descriptor immediate with the specified dataport read
498  * function controls.
499  */
500 static inline uint32_t
brw_dp_read_desc(const struct gen_device_info * devinfo,unsigned binding_table_index,unsigned msg_control,unsigned msg_type,unsigned target_cache)501 brw_dp_read_desc(const struct gen_device_info *devinfo,
502                  unsigned binding_table_index,
503                  unsigned msg_control,
504                  unsigned msg_type,
505                  unsigned target_cache)
506 {
507    if (devinfo->gen >= 6)
508       return brw_dp_desc(devinfo, binding_table_index, msg_type, msg_control);
509    else if (devinfo->gen >= 5 || devinfo->is_g4x)
510       return (SET_BITS(binding_table_index, 7, 0) |
511               SET_BITS(msg_control, 10, 8) |
512               SET_BITS(msg_type, 13, 11) |
513               SET_BITS(target_cache, 15, 14));
514    else
515       return (SET_BITS(binding_table_index, 7, 0) |
516               SET_BITS(msg_control, 11, 8) |
517               SET_BITS(msg_type, 13, 12) |
518               SET_BITS(target_cache, 15, 14));
519 }
520 
521 static inline unsigned
brw_dp_read_desc_msg_type(const struct gen_device_info * devinfo,uint32_t desc)522 brw_dp_read_desc_msg_type(const struct gen_device_info *devinfo, uint32_t desc)
523 {
524    if (devinfo->gen >= 6)
525       return brw_dp_desc_msg_type(devinfo, desc);
526    else if (devinfo->gen >= 5 || devinfo->is_g4x)
527       return GET_BITS(desc, 13, 11);
528    else
529       return GET_BITS(desc, 13, 12);
530 }
531 
532 static inline unsigned
brw_dp_read_desc_msg_control(const struct gen_device_info * devinfo,uint32_t desc)533 brw_dp_read_desc_msg_control(const struct gen_device_info *devinfo,
534                              uint32_t desc)
535 {
536    if (devinfo->gen >= 6)
537       return brw_dp_desc_msg_control(devinfo, desc);
538    else if (devinfo->gen >= 5 || devinfo->is_g4x)
539       return GET_BITS(desc, 10, 8);
540    else
541       return GET_BITS(desc, 11, 8);
542 }
543 
544 /**
545  * Construct a message descriptor immediate with the specified dataport write
546  * function controls.
547  */
548 static inline uint32_t
brw_dp_write_desc(const struct gen_device_info * devinfo,unsigned binding_table_index,unsigned msg_control,unsigned msg_type,unsigned last_render_target,unsigned send_commit_msg)549 brw_dp_write_desc(const struct gen_device_info *devinfo,
550                   unsigned binding_table_index,
551                   unsigned msg_control,
552                   unsigned msg_type,
553                   unsigned last_render_target,
554                   unsigned send_commit_msg)
555 {
556    assert(devinfo->gen <= 6 || !send_commit_msg);
557    if (devinfo->gen >= 6)
558       return brw_dp_desc(devinfo, binding_table_index, msg_type, msg_control) |
559              SET_BITS(last_render_target, 12, 12) |
560              SET_BITS(send_commit_msg, 17, 17);
561    else
562       return (SET_BITS(binding_table_index, 7, 0) |
563               SET_BITS(msg_control, 11, 8) |
564               SET_BITS(last_render_target, 11, 11) |
565               SET_BITS(msg_type, 14, 12) |
566               SET_BITS(send_commit_msg, 15, 15));
567 }
568 
569 static inline unsigned
brw_dp_write_desc_msg_type(const struct gen_device_info * devinfo,uint32_t desc)570 brw_dp_write_desc_msg_type(const struct gen_device_info *devinfo,
571                            uint32_t desc)
572 {
573    if (devinfo->gen >= 6)
574       return brw_dp_desc_msg_type(devinfo, desc);
575    else
576       return GET_BITS(desc, 14, 12);
577 }
578 
579 static inline unsigned
brw_dp_write_desc_msg_control(const struct gen_device_info * devinfo,uint32_t desc)580 brw_dp_write_desc_msg_control(const struct gen_device_info *devinfo,
581                               uint32_t desc)
582 {
583    if (devinfo->gen >= 6)
584       return brw_dp_desc_msg_control(devinfo, desc);
585    else
586       return GET_BITS(desc, 11, 8);
587 }
588 
589 static inline bool
brw_dp_write_desc_last_render_target(const struct gen_device_info * devinfo,uint32_t desc)590 brw_dp_write_desc_last_render_target(const struct gen_device_info *devinfo,
591                                      uint32_t desc)
592 {
593    if (devinfo->gen >= 6)
594       return GET_BITS(desc, 12, 12);
595    else
596       return GET_BITS(desc, 11, 11);
597 }
598 
599 static inline bool
brw_dp_write_desc_write_commit(const struct gen_device_info * devinfo,uint32_t desc)600 brw_dp_write_desc_write_commit(const struct gen_device_info *devinfo,
601                                uint32_t desc)
602 {
603    assert(devinfo->gen <= 6);
604    if (devinfo->gen >= 6)
605       return GET_BITS(desc, 17, 17);
606    else
607       return GET_BITS(desc, 15, 15);
608 }
609 
610 /**
611  * Construct a message descriptor immediate with the specified dataport
612  * surface function controls.
613  */
614 static inline uint32_t
brw_dp_surface_desc(const struct gen_device_info * devinfo,unsigned msg_type,unsigned msg_control)615 brw_dp_surface_desc(const struct gen_device_info *devinfo,
616                     unsigned msg_type,
617                     unsigned msg_control)
618 {
619    assert(devinfo->gen >= 7);
620    /* We'll OR in the binding table index later */
621    return brw_dp_desc(devinfo, 0, msg_type, msg_control);
622 }
623 
624 static inline uint32_t
brw_dp_untyped_atomic_desc(const struct gen_device_info * devinfo,unsigned exec_size,unsigned atomic_op,bool response_expected)625 brw_dp_untyped_atomic_desc(const struct gen_device_info *devinfo,
626                            unsigned exec_size, /**< 0 for SIMD4x2 */
627                            unsigned atomic_op,
628                            bool response_expected)
629 {
630    assert(exec_size <= 8 || exec_size == 16);
631 
632    unsigned msg_type;
633    if (devinfo->gen >= 8 || devinfo->is_haswell) {
634       if (exec_size > 0) {
635          msg_type = HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP;
636       } else {
637          msg_type = HSW_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_OP_SIMD4X2;
638       }
639    } else {
640       msg_type = GEN7_DATAPORT_DC_UNTYPED_ATOMIC_OP;
641    }
642 
643    const unsigned msg_control =
644       SET_BITS(atomic_op, 3, 0) |
645       SET_BITS(0 < exec_size && exec_size <= 8, 4, 4) |
646       SET_BITS(response_expected, 5, 5);
647 
648    return brw_dp_surface_desc(devinfo, msg_type, msg_control);
649 }
650 
651 static inline uint32_t
brw_dp_untyped_atomic_float_desc(const struct gen_device_info * devinfo,unsigned exec_size,unsigned atomic_op,bool response_expected)652 brw_dp_untyped_atomic_float_desc(const struct gen_device_info *devinfo,
653                                  unsigned exec_size,
654                                  unsigned atomic_op,
655                                  bool response_expected)
656 {
657    assert(exec_size <= 8 || exec_size == 16);
658    assert(devinfo->gen >= 9);
659 
660    assert(exec_size > 0);
661    const unsigned msg_type = GEN9_DATAPORT_DC_PORT1_UNTYPED_ATOMIC_FLOAT_OP;
662 
663    const unsigned msg_control =
664       SET_BITS(atomic_op, 1, 0) |
665       SET_BITS(exec_size <= 8, 4, 4) |
666       SET_BITS(response_expected, 5, 5);
667 
668    return brw_dp_surface_desc(devinfo, msg_type, msg_control);
669 }
670 
671 static inline unsigned
brw_mdc_cmask(unsigned num_channels)672 brw_mdc_cmask(unsigned num_channels)
673 {
674    /* See also MDC_CMASK in the SKL PRM Vol 2d. */
675    return 0xf & (0xf << num_channels);
676 }
677 
678 static inline uint32_t
brw_dp_untyped_surface_rw_desc(const struct gen_device_info * devinfo,unsigned exec_size,unsigned num_channels,bool write)679 brw_dp_untyped_surface_rw_desc(const struct gen_device_info *devinfo,
680                                unsigned exec_size, /**< 0 for SIMD4x2 */
681                                unsigned num_channels,
682                                bool write)
683 {
684    assert(exec_size <= 8 || exec_size == 16);
685 
686    unsigned msg_type;
687    if (write) {
688       if (devinfo->gen >= 8 || devinfo->is_haswell) {
689          msg_type = HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_WRITE;
690       } else {
691          msg_type = GEN7_DATAPORT_DC_UNTYPED_SURFACE_WRITE;
692       }
693    } else {
694       /* Read */
695       if (devinfo->gen >= 8 || devinfo->is_haswell) {
696          msg_type = HSW_DATAPORT_DC_PORT1_UNTYPED_SURFACE_READ;
697       } else {
698          msg_type = GEN7_DATAPORT_DC_UNTYPED_SURFACE_READ;
699       }
700    }
701 
702    /* SIMD4x2 is only valid for read messages on IVB; use SIMD8 instead */
703    if (write && devinfo->gen == 7 && !devinfo->is_haswell && exec_size == 0)
704       exec_size = 8;
705 
706    /* See also MDC_SM3 in the SKL PRM Vol 2d. */
707    const unsigned simd_mode = exec_size == 0 ? 0 : /* SIMD4x2 */
708                               exec_size <= 8 ? 2 : 1;
709 
710    const unsigned msg_control =
711       SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
712       SET_BITS(simd_mode, 5, 4);
713 
714    return brw_dp_surface_desc(devinfo, msg_type, msg_control);
715 }
716 
717 static inline unsigned
brw_mdc_ds(unsigned bit_size)718 brw_mdc_ds(unsigned bit_size)
719 {
720    switch (bit_size) {
721    case 8:
722       return GEN7_BYTE_SCATTERED_DATA_ELEMENT_BYTE;
723    case 16:
724       return GEN7_BYTE_SCATTERED_DATA_ELEMENT_WORD;
725    case 32:
726       return GEN7_BYTE_SCATTERED_DATA_ELEMENT_DWORD;
727    default:
728       unreachable("Unsupported bit_size for byte scattered messages");
729    }
730 }
731 
732 static inline uint32_t
brw_dp_byte_scattered_rw_desc(const struct gen_device_info * devinfo,unsigned exec_size,unsigned bit_size,bool write)733 brw_dp_byte_scattered_rw_desc(const struct gen_device_info *devinfo,
734                               unsigned exec_size,
735                               unsigned bit_size,
736                               bool write)
737 {
738    assert(exec_size <= 8 || exec_size == 16);
739 
740    assert(devinfo->gen > 7 || devinfo->is_haswell);
741    const unsigned msg_type =
742       write ? HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_WRITE :
743               HSW_DATAPORT_DC_PORT0_BYTE_SCATTERED_READ;
744 
745    assert(exec_size > 0);
746    const unsigned msg_control =
747       SET_BITS(exec_size == 16, 0, 0) |
748       SET_BITS(brw_mdc_ds(bit_size), 3, 2);
749 
750    return brw_dp_surface_desc(devinfo, msg_type, msg_control);
751 }
752 
753 static inline uint32_t
brw_dp_dword_scattered_rw_desc(const struct gen_device_info * devinfo,unsigned exec_size,bool write)754 brw_dp_dword_scattered_rw_desc(const struct gen_device_info *devinfo,
755                                unsigned exec_size,
756                                bool write)
757 {
758    assert(exec_size == 8 || exec_size == 16);
759 
760    unsigned msg_type;
761    if (write) {
762       if (devinfo->gen >= 6) {
763          msg_type = GEN6_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE;
764       } else {
765          msg_type = BRW_DATAPORT_WRITE_MESSAGE_DWORD_SCATTERED_WRITE;
766       }
767    } else {
768       if (devinfo->gen >= 7) {
769          msg_type = GEN7_DATAPORT_DC_DWORD_SCATTERED_READ;
770       } else if (devinfo->gen > 4 || devinfo->is_g4x) {
771          msg_type = G45_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ;
772       } else {
773          msg_type = BRW_DATAPORT_READ_MESSAGE_DWORD_SCATTERED_READ;
774       }
775    }
776 
777    const unsigned msg_control =
778       SET_BITS(1, 1, 1) | /* Legacy SIMD Mode */
779       SET_BITS(exec_size == 16, 0, 0);
780 
781    return brw_dp_surface_desc(devinfo, msg_type, msg_control);
782 }
783 
784 static inline uint32_t
brw_dp_oword_block_rw_desc(const struct gen_device_info * devinfo,bool align_16B,unsigned num_dwords,bool write)785 brw_dp_oword_block_rw_desc(const struct gen_device_info *devinfo,
786                            bool align_16B,
787                            unsigned num_dwords,
788                            bool write)
789 {
790    /* Writes can only have addresses aligned by OWORDs (16 Bytes). */
791    assert(!write || align_16B);
792 
793    const unsigned msg_type =
794       write ?     GEN7_DATAPORT_DC_OWORD_BLOCK_WRITE :
795       align_16B ? GEN7_DATAPORT_DC_OWORD_BLOCK_READ :
796                   GEN7_DATAPORT_DC_UNALIGNED_OWORD_BLOCK_READ;
797 
798    const unsigned msg_control =
799       SET_BITS(BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_dwords), 2, 0);
800 
801    return brw_dp_surface_desc(devinfo, msg_type, msg_control);
802 }
803 
804 static inline uint32_t
brw_dp_a64_untyped_surface_rw_desc(const struct gen_device_info * devinfo,unsigned exec_size,unsigned num_channels,bool write)805 brw_dp_a64_untyped_surface_rw_desc(const struct gen_device_info *devinfo,
806                                    unsigned exec_size, /**< 0 for SIMD4x2 */
807                                    unsigned num_channels,
808                                    bool write)
809 {
810    assert(exec_size <= 8 || exec_size == 16);
811    assert(devinfo->gen >= 8);
812 
813    unsigned msg_type =
814       write ? GEN8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_WRITE :
815               GEN8_DATAPORT_DC_PORT1_A64_UNTYPED_SURFACE_READ;
816 
817    /* See also MDC_SM3 in the SKL PRM Vol 2d. */
818    const unsigned simd_mode = exec_size == 0 ? 0 : /* SIMD4x2 */
819                               exec_size <= 8 ? 2 : 1;
820 
821    const unsigned msg_control =
822       SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
823       SET_BITS(simd_mode, 5, 4);
824 
825    return brw_dp_desc(devinfo, GEN8_BTI_STATELESS_NON_COHERENT,
826                       msg_type, msg_control);
827 }
828 
829 static inline uint32_t
brw_dp_a64_oword_block_rw_desc(const struct gen_device_info * devinfo,bool align_16B,unsigned num_dwords,bool write)830 brw_dp_a64_oword_block_rw_desc(const struct gen_device_info *devinfo,
831                                bool align_16B,
832                                unsigned num_dwords,
833                                bool write)
834 {
835    /* Writes can only have addresses aligned by OWORDs (16 Bytes). */
836    assert(!write || align_16B);
837 
838    unsigned msg_type =
839       write ? GEN9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_WRITE :
840               GEN9_DATAPORT_DC_PORT1_A64_OWORD_BLOCK_READ;
841 
842    unsigned msg_control =
843       SET_BITS(!align_16B, 4, 3) |
844       SET_BITS(BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_dwords), 2, 0);
845 
846    return brw_dp_desc(devinfo, GEN8_BTI_STATELESS_NON_COHERENT,
847                       msg_type, msg_control);
848 }
849 
850 /**
851  * Calculate the data size (see MDC_A64_DS in the "Structures" volume of the
852  * Skylake PRM).
853  */
854 static inline uint32_t
brw_mdc_a64_ds(unsigned elems)855 brw_mdc_a64_ds(unsigned elems)
856 {
857    switch (elems) {
858    case 1:  return 0;
859    case 2:  return 1;
860    case 4:  return 2;
861    case 8:  return 3;
862    default:
863       unreachable("Unsupported elmeent count for A64 scattered message");
864    }
865 }
866 
867 static inline uint32_t
brw_dp_a64_byte_scattered_rw_desc(const struct gen_device_info * devinfo,unsigned exec_size,unsigned bit_size,bool write)868 brw_dp_a64_byte_scattered_rw_desc(const struct gen_device_info *devinfo,
869                                   unsigned exec_size, /**< 0 for SIMD4x2 */
870                                   unsigned bit_size,
871                                   bool write)
872 {
873    assert(exec_size <= 8 || exec_size == 16);
874    assert(devinfo->gen >= 8);
875 
876    unsigned msg_type =
877       write ? GEN8_DATAPORT_DC_PORT1_A64_SCATTERED_WRITE :
878               GEN9_DATAPORT_DC_PORT1_A64_SCATTERED_READ;
879 
880    const unsigned msg_control =
881       SET_BITS(GEN8_A64_SCATTERED_SUBTYPE_BYTE, 1, 0) |
882       SET_BITS(brw_mdc_a64_ds(bit_size / 8), 3, 2) |
883       SET_BITS(exec_size == 16, 4, 4);
884 
885    return brw_dp_desc(devinfo, GEN8_BTI_STATELESS_NON_COHERENT,
886                       msg_type, msg_control);
887 }
888 
889 static inline uint32_t
brw_dp_a64_untyped_atomic_desc(const struct gen_device_info * devinfo,ASSERTED unsigned exec_size,unsigned bit_size,unsigned atomic_op,bool response_expected)890 brw_dp_a64_untyped_atomic_desc(const struct gen_device_info *devinfo,
891                                ASSERTED unsigned exec_size, /**< 0 for SIMD4x2 */
892                                unsigned bit_size,
893                                unsigned atomic_op,
894                                bool response_expected)
895 {
896    assert(exec_size == 8);
897    assert(devinfo->gen >= 8);
898    assert(bit_size == 32 || bit_size == 64);
899 
900    const unsigned msg_type = GEN8_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_OP;
901 
902    const unsigned msg_control =
903       SET_BITS(atomic_op, 3, 0) |
904       SET_BITS(bit_size == 64, 4, 4) |
905       SET_BITS(response_expected, 5, 5);
906 
907    return brw_dp_desc(devinfo, GEN8_BTI_STATELESS_NON_COHERENT,
908                       msg_type, msg_control);
909 }
910 
911 static inline uint32_t
brw_dp_a64_untyped_atomic_float_desc(const struct gen_device_info * devinfo,ASSERTED unsigned exec_size,unsigned atomic_op,bool response_expected)912 brw_dp_a64_untyped_atomic_float_desc(const struct gen_device_info *devinfo,
913                                      ASSERTED unsigned exec_size,
914                                      unsigned atomic_op,
915                                      bool response_expected)
916 {
917    assert(exec_size == 8);
918    assert(devinfo->gen >= 9);
919 
920    assert(exec_size > 0);
921    const unsigned msg_type = GEN9_DATAPORT_DC_PORT1_A64_UNTYPED_ATOMIC_FLOAT_OP;
922 
923    const unsigned msg_control =
924       SET_BITS(atomic_op, 1, 0) |
925       SET_BITS(response_expected, 5, 5);
926 
927    return brw_dp_desc(devinfo, GEN8_BTI_STATELESS_NON_COHERENT,
928                       msg_type, msg_control);
929 }
930 
931 static inline uint32_t
brw_dp_typed_atomic_desc(const struct gen_device_info * devinfo,unsigned exec_size,unsigned exec_group,unsigned atomic_op,bool response_expected)932 brw_dp_typed_atomic_desc(const struct gen_device_info *devinfo,
933                          unsigned exec_size,
934                          unsigned exec_group,
935                          unsigned atomic_op,
936                          bool response_expected)
937 {
938    assert(exec_size > 0 || exec_group == 0);
939    assert(exec_group % 8 == 0);
940 
941    unsigned msg_type;
942    if (devinfo->gen >= 8 || devinfo->is_haswell) {
943       if (exec_size == 0) {
944          msg_type = HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP_SIMD4X2;
945       } else {
946          msg_type = HSW_DATAPORT_DC_PORT1_TYPED_ATOMIC_OP;
947       }
948    } else {
949       /* SIMD4x2 typed surface R/W messages only exist on HSW+ */
950       assert(exec_size > 0);
951       msg_type = GEN7_DATAPORT_RC_TYPED_ATOMIC_OP;
952    }
953 
954    const bool high_sample_mask = (exec_group / 8) % 2 == 1;
955 
956    const unsigned msg_control =
957       SET_BITS(atomic_op, 3, 0) |
958       SET_BITS(high_sample_mask, 4, 4) |
959       SET_BITS(response_expected, 5, 5);
960 
961    return brw_dp_surface_desc(devinfo, msg_type, msg_control);
962 }
963 
964 static inline uint32_t
brw_dp_typed_surface_rw_desc(const struct gen_device_info * devinfo,unsigned exec_size,unsigned exec_group,unsigned num_channels,bool write)965 brw_dp_typed_surface_rw_desc(const struct gen_device_info *devinfo,
966                              unsigned exec_size,
967                              unsigned exec_group,
968                              unsigned num_channels,
969                              bool write)
970 {
971    assert(exec_size > 0 || exec_group == 0);
972    assert(exec_group % 8 == 0);
973 
974    /* Typed surface reads and writes don't support SIMD16 */
975    assert(exec_size <= 8);
976 
977    unsigned msg_type;
978    if (write) {
979       if (devinfo->gen >= 8 || devinfo->is_haswell) {
980          msg_type = HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_WRITE;
981       } else {
982          msg_type = GEN7_DATAPORT_RC_TYPED_SURFACE_WRITE;
983       }
984    } else {
985       if (devinfo->gen >= 8 || devinfo->is_haswell) {
986          msg_type = HSW_DATAPORT_DC_PORT1_TYPED_SURFACE_READ;
987       } else {
988          msg_type = GEN7_DATAPORT_RC_TYPED_SURFACE_READ;
989       }
990    }
991 
992    /* See also MDC_SG3 in the SKL PRM Vol 2d. */
993    unsigned msg_control;
994    if (devinfo->gen >= 8 || devinfo->is_haswell) {
995       /* See also MDC_SG3 in the SKL PRM Vol 2d. */
996       const unsigned slot_group = exec_size == 0 ? 0 : /* SIMD4x2 */
997                                   1 + ((exec_group / 8) % 2);
998 
999       msg_control =
1000          SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
1001          SET_BITS(slot_group, 5, 4);
1002    } else {
1003       /* SIMD4x2 typed surface R/W messages only exist on HSW+ */
1004       assert(exec_size > 0);
1005       const unsigned slot_group = ((exec_group / 8) % 2);
1006 
1007       msg_control =
1008          SET_BITS(brw_mdc_cmask(num_channels), 3, 0) |
1009          SET_BITS(slot_group, 5, 5);
1010    }
1011 
1012    return brw_dp_surface_desc(devinfo, msg_type, msg_control);
1013 }
1014 
1015 /**
1016  * Construct a message descriptor immediate with the specified pixel
1017  * interpolator function controls.
1018  */
1019 static inline uint32_t
brw_pixel_interp_desc(UNUSED const struct gen_device_info * devinfo,unsigned msg_type,bool noperspective,unsigned simd_mode,unsigned slot_group)1020 brw_pixel_interp_desc(UNUSED const struct gen_device_info *devinfo,
1021                       unsigned msg_type,
1022                       bool noperspective,
1023                       unsigned simd_mode,
1024                       unsigned slot_group)
1025 {
1026    return (SET_BITS(slot_group, 11, 11) |
1027            SET_BITS(msg_type, 13, 12) |
1028            SET_BITS(!!noperspective, 14, 14) |
1029            SET_BITS(simd_mode, 16, 16));
1030 }
1031 
1032 void brw_urb_WRITE(struct brw_codegen *p,
1033 		   struct brw_reg dest,
1034 		   unsigned msg_reg_nr,
1035 		   struct brw_reg src0,
1036                    enum brw_urb_write_flags flags,
1037 		   unsigned msg_length,
1038 		   unsigned response_length,
1039 		   unsigned offset,
1040 		   unsigned swizzle);
1041 
1042 /**
1043  * Send message to shared unit \p sfid with a possibly indirect descriptor \p
1044  * desc.  If \p desc is not an immediate it will be transparently loaded to an
1045  * address register using an OR instruction.
1046  */
1047 void
1048 brw_send_indirect_message(struct brw_codegen *p,
1049                           unsigned sfid,
1050                           struct brw_reg dst,
1051                           struct brw_reg payload,
1052                           struct brw_reg desc,
1053                           unsigned desc_imm,
1054                           bool eot);
1055 
1056 void
1057 brw_send_indirect_split_message(struct brw_codegen *p,
1058                                 unsigned sfid,
1059                                 struct brw_reg dst,
1060                                 struct brw_reg payload0,
1061                                 struct brw_reg payload1,
1062                                 struct brw_reg desc,
1063                                 unsigned desc_imm,
1064                                 struct brw_reg ex_desc,
1065                                 unsigned ex_desc_imm,
1066                                 bool eot);
1067 
1068 void brw_ff_sync(struct brw_codegen *p,
1069 		   struct brw_reg dest,
1070 		   unsigned msg_reg_nr,
1071 		   struct brw_reg src0,
1072 		   bool allocate,
1073 		   unsigned response_length,
1074 		   bool eot);
1075 
1076 void brw_svb_write(struct brw_codegen *p,
1077                    struct brw_reg dest,
1078                    unsigned msg_reg_nr,
1079                    struct brw_reg src0,
1080                    unsigned binding_table_index,
1081                    bool   send_commit_msg);
1082 
1083 brw_inst *brw_fb_WRITE(struct brw_codegen *p,
1084                        struct brw_reg payload,
1085                        struct brw_reg implied_header,
1086                        unsigned msg_control,
1087                        unsigned binding_table_index,
1088                        unsigned msg_length,
1089                        unsigned response_length,
1090                        bool eot,
1091                        bool last_render_target,
1092                        bool header_present);
1093 
1094 brw_inst *gen9_fb_READ(struct brw_codegen *p,
1095                        struct brw_reg dst,
1096                        struct brw_reg payload,
1097                        unsigned binding_table_index,
1098                        unsigned msg_length,
1099                        unsigned response_length,
1100                        bool per_sample);
1101 
1102 void brw_SAMPLE(struct brw_codegen *p,
1103 		struct brw_reg dest,
1104 		unsigned msg_reg_nr,
1105 		struct brw_reg src0,
1106 		unsigned binding_table_index,
1107 		unsigned sampler,
1108 		unsigned msg_type,
1109 		unsigned response_length,
1110 		unsigned msg_length,
1111 		unsigned header_present,
1112 		unsigned simd_mode,
1113 		unsigned return_format);
1114 
1115 void brw_adjust_sampler_state_pointer(struct brw_codegen *p,
1116                                       struct brw_reg header,
1117                                       struct brw_reg sampler_index);
1118 
1119 void gen4_math(struct brw_codegen *p,
1120 	       struct brw_reg dest,
1121 	       unsigned function,
1122 	       unsigned msg_reg_nr,
1123 	       struct brw_reg src,
1124 	       unsigned precision );
1125 
1126 void gen6_math(struct brw_codegen *p,
1127 	       struct brw_reg dest,
1128 	       unsigned function,
1129 	       struct brw_reg src0,
1130 	       struct brw_reg src1);
1131 
1132 void brw_oword_block_read(struct brw_codegen *p,
1133 			  struct brw_reg dest,
1134 			  struct brw_reg mrf,
1135 			  uint32_t offset,
1136 			  uint32_t bind_table_index);
1137 
1138 unsigned brw_scratch_surface_idx(const struct brw_codegen *p);
1139 
1140 void brw_oword_block_read_scratch(struct brw_codegen *p,
1141 				  struct brw_reg dest,
1142 				  struct brw_reg mrf,
1143 				  int num_regs,
1144 				  unsigned offset);
1145 
1146 void brw_oword_block_write_scratch(struct brw_codegen *p,
1147 				   struct brw_reg mrf,
1148 				   int num_regs,
1149 				   unsigned offset);
1150 
1151 void gen7_block_read_scratch(struct brw_codegen *p,
1152                              struct brw_reg dest,
1153                              int num_regs,
1154                              unsigned offset);
1155 
1156 void brw_shader_time_add(struct brw_codegen *p,
1157                          struct brw_reg payload,
1158                          uint32_t surf_index);
1159 
1160 /**
1161  * Return the generation-specific jump distance scaling factor.
1162  *
1163  * Given the number of instructions to jump, we need to scale by
1164  * some number to obtain the actual jump distance to program in an
1165  * instruction.
1166  */
1167 static inline unsigned
brw_jump_scale(const struct gen_device_info * devinfo)1168 brw_jump_scale(const struct gen_device_info *devinfo)
1169 {
1170    /* Broadwell measures jump targets in bytes. */
1171    if (devinfo->gen >= 8)
1172       return 16;
1173 
1174    /* Ironlake and later measure jump targets in 64-bit data chunks (in order
1175     * (to support compaction), so each 128-bit instruction requires 2 chunks.
1176     */
1177    if (devinfo->gen >= 5)
1178       return 2;
1179 
1180    /* Gen4 simply uses the number of 128-bit instructions. */
1181    return 1;
1182 }
1183 
1184 void brw_barrier(struct brw_codegen *p, struct brw_reg src);
1185 
1186 /* If/else/endif.  Works by manipulating the execution flags on each
1187  * channel.
1188  */
1189 brw_inst *brw_IF(struct brw_codegen *p, unsigned execute_size);
1190 brw_inst *gen6_IF(struct brw_codegen *p, enum brw_conditional_mod conditional,
1191                   struct brw_reg src0, struct brw_reg src1);
1192 
1193 void brw_ELSE(struct brw_codegen *p);
1194 void brw_ENDIF(struct brw_codegen *p);
1195 
1196 /* DO/WHILE loops:
1197  */
1198 brw_inst *brw_DO(struct brw_codegen *p, unsigned execute_size);
1199 
1200 brw_inst *brw_WHILE(struct brw_codegen *p);
1201 
1202 brw_inst *brw_BREAK(struct brw_codegen *p);
1203 brw_inst *brw_CONT(struct brw_codegen *p);
1204 brw_inst *brw_HALT(struct brw_codegen *p);
1205 
1206 /* Forward jumps:
1207  */
1208 void brw_land_fwd_jump(struct brw_codegen *p, int jmp_insn_idx);
1209 
1210 brw_inst *brw_JMPI(struct brw_codegen *p, struct brw_reg index,
1211                    unsigned predicate_control);
1212 
1213 void brw_NOP(struct brw_codegen *p);
1214 
1215 void brw_WAIT(struct brw_codegen *p);
1216 
1217 void brw_SYNC(struct brw_codegen *p, enum tgl_sync_function func);
1218 
1219 /* Special case: there is never a destination, execution size will be
1220  * taken from src0:
1221  */
1222 void brw_CMP(struct brw_codegen *p,
1223 	     struct brw_reg dest,
1224 	     unsigned conditional,
1225 	     struct brw_reg src0,
1226 	     struct brw_reg src1);
1227 
1228 void
1229 brw_untyped_atomic(struct brw_codegen *p,
1230                    struct brw_reg dst,
1231                    struct brw_reg payload,
1232                    struct brw_reg surface,
1233                    unsigned atomic_op,
1234                    unsigned msg_length,
1235                    bool response_expected,
1236                    bool header_present);
1237 
1238 void
1239 brw_untyped_surface_read(struct brw_codegen *p,
1240                          struct brw_reg dst,
1241                          struct brw_reg payload,
1242                          struct brw_reg surface,
1243                          unsigned msg_length,
1244                          unsigned num_channels);
1245 
1246 void
1247 brw_untyped_surface_write(struct brw_codegen *p,
1248                           struct brw_reg payload,
1249                           struct brw_reg surface,
1250                           unsigned msg_length,
1251                           unsigned num_channels,
1252                           bool header_present);
1253 
1254 void
1255 brw_memory_fence(struct brw_codegen *p,
1256                  struct brw_reg dst,
1257                  struct brw_reg src,
1258                  enum opcode send_op,
1259                  enum brw_message_target sfid,
1260                  bool commit_enable,
1261                  unsigned bti);
1262 
1263 void
1264 brw_pixel_interpolator_query(struct brw_codegen *p,
1265                              struct brw_reg dest,
1266                              struct brw_reg mrf,
1267                              bool noperspective,
1268                              unsigned mode,
1269                              struct brw_reg data,
1270                              unsigned msg_length,
1271                              unsigned response_length);
1272 
1273 void
1274 brw_find_live_channel(struct brw_codegen *p,
1275                       struct brw_reg dst,
1276                       struct brw_reg mask);
1277 
1278 void
1279 brw_broadcast(struct brw_codegen *p,
1280               struct brw_reg dst,
1281               struct brw_reg src,
1282               struct brw_reg idx);
1283 
1284 void
1285 brw_float_controls_mode(struct brw_codegen *p,
1286                         unsigned mode, unsigned mask);
1287 
1288 void
1289 brw_update_reloc_imm(const struct gen_device_info *devinfo,
1290                      brw_inst *inst,
1291                      uint32_t value);
1292 
1293 void
1294 brw_MOV_reloc_imm(struct brw_codegen *p,
1295                   struct brw_reg dst,
1296                   enum brw_reg_type src_type,
1297                   uint32_t id);
1298 
1299 /***********************************************************************
1300  * brw_eu_util.c:
1301  */
1302 
1303 void brw_copy_indirect_to_indirect(struct brw_codegen *p,
1304 				   struct brw_indirect dst_ptr,
1305 				   struct brw_indirect src_ptr,
1306 				   unsigned count);
1307 
1308 void brw_copy_from_indirect(struct brw_codegen *p,
1309 			    struct brw_reg dst,
1310 			    struct brw_indirect ptr,
1311 			    unsigned count);
1312 
1313 void brw_copy4(struct brw_codegen *p,
1314 	       struct brw_reg dst,
1315 	       struct brw_reg src,
1316 	       unsigned count);
1317 
1318 void brw_copy8(struct brw_codegen *p,
1319 	       struct brw_reg dst,
1320 	       struct brw_reg src,
1321 	       unsigned count);
1322 
1323 void brw_math_invert( struct brw_codegen *p,
1324 		      struct brw_reg dst,
1325 		      struct brw_reg src);
1326 
1327 void brw_set_src1(struct brw_codegen *p, brw_inst *insn, struct brw_reg reg);
1328 
1329 void brw_set_desc_ex(struct brw_codegen *p, brw_inst *insn,
1330                      unsigned desc, unsigned ex_desc);
1331 
1332 static inline void
brw_set_desc(struct brw_codegen * p,brw_inst * insn,unsigned desc)1333 brw_set_desc(struct brw_codegen *p, brw_inst *insn, unsigned desc)
1334 {
1335    brw_set_desc_ex(p, insn, desc, 0);
1336 }
1337 
1338 void brw_set_uip_jip(struct brw_codegen *p, int start_offset);
1339 
1340 enum brw_conditional_mod brw_negate_cmod(enum brw_conditional_mod cmod);
1341 enum brw_conditional_mod brw_swap_cmod(enum brw_conditional_mod cmod);
1342 
1343 /* brw_eu_compact.c */
1344 void brw_compact_instructions(struct brw_codegen *p, int start_offset,
1345                               struct disasm_info *disasm);
1346 void brw_uncompact_instruction(const struct gen_device_info *devinfo,
1347                                brw_inst *dst, brw_compact_inst *src);
1348 bool brw_try_compact_instruction(const struct gen_device_info *devinfo,
1349                                  brw_compact_inst *dst, const brw_inst *src);
1350 
1351 void brw_debug_compact_uncompact(const struct gen_device_info *devinfo,
1352                                  brw_inst *orig, brw_inst *uncompacted);
1353 
1354 /* brw_eu_validate.c */
1355 bool brw_validate_instruction(const struct gen_device_info *devinfo,
1356                               const brw_inst *inst, int offset,
1357                               struct disasm_info *disasm);
1358 bool brw_validate_instructions(const struct gen_device_info *devinfo,
1359                                const void *assembly, int start_offset, int end_offset,
1360                                struct disasm_info *disasm);
1361 
1362 static inline int
next_offset(const struct gen_device_info * devinfo,void * store,int offset)1363 next_offset(const struct gen_device_info *devinfo, void *store, int offset)
1364 {
1365    brw_inst *insn = (brw_inst *)((char *)store + offset);
1366 
1367    if (brw_inst_cmpt_control(devinfo, insn))
1368       return offset + 8;
1369    else
1370       return offset + 16;
1371 }
1372 
1373 struct opcode_desc {
1374    unsigned ir;
1375    unsigned hw;
1376    const char *name;
1377    int nsrc;
1378    int ndst;
1379    int gens;
1380 };
1381 
1382 const struct opcode_desc *
1383 brw_opcode_desc(const struct gen_device_info *devinfo, enum opcode opcode);
1384 
1385 const struct opcode_desc *
1386 brw_opcode_desc_from_hw(const struct gen_device_info *devinfo, unsigned hw);
1387 
1388 static inline unsigned
brw_opcode_encode(const struct gen_device_info * devinfo,enum opcode opcode)1389 brw_opcode_encode(const struct gen_device_info *devinfo, enum opcode opcode)
1390 {
1391    return brw_opcode_desc(devinfo, opcode)->hw;
1392 }
1393 
1394 static inline enum opcode
brw_opcode_decode(const struct gen_device_info * devinfo,unsigned hw)1395 brw_opcode_decode(const struct gen_device_info *devinfo, unsigned hw)
1396 {
1397    const struct opcode_desc *desc = brw_opcode_desc_from_hw(devinfo, hw);
1398    return desc ? (enum opcode)desc->ir : BRW_OPCODE_ILLEGAL;
1399 }
1400 
1401 static inline void
brw_inst_set_opcode(const struct gen_device_info * devinfo,brw_inst * inst,enum opcode opcode)1402 brw_inst_set_opcode(const struct gen_device_info *devinfo,
1403                     brw_inst *inst, enum opcode opcode)
1404 {
1405    brw_inst_set_hw_opcode(devinfo, inst, brw_opcode_encode(devinfo, opcode));
1406 }
1407 
1408 static inline enum opcode
brw_inst_opcode(const struct gen_device_info * devinfo,const brw_inst * inst)1409 brw_inst_opcode(const struct gen_device_info *devinfo, const brw_inst *inst)
1410 {
1411    return brw_opcode_decode(devinfo, brw_inst_hw_opcode(devinfo, inst));
1412 }
1413 
1414 static inline bool
is_3src(const struct gen_device_info * devinfo,enum opcode opcode)1415 is_3src(const struct gen_device_info *devinfo, enum opcode opcode)
1416 {
1417    const struct opcode_desc *desc = brw_opcode_desc(devinfo, opcode);
1418    return desc && desc->nsrc == 3;
1419 }
1420 
1421 /** Maximum SEND message length */
1422 #define BRW_MAX_MSG_LENGTH 15
1423 
1424 /** First MRF register used by pull loads */
1425 #define FIRST_SPILL_MRF(gen) ((gen) == 6 ? 21 : 13)
1426 
1427 /** First MRF register used by spills */
1428 #define FIRST_PULL_LOAD_MRF(gen) ((gen) == 6 ? 16 : 13)
1429 
1430 #ifdef __cplusplus
1431 }
1432 #endif
1433 
1434 #endif
1435