1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2010 Intel Corporation
3*61046927SAndroid Build Coastguard Worker *
4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker *
11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker * Software.
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker *
23*61046927SAndroid Build Coastguard Worker * Authors:
24*61046927SAndroid Build Coastguard Worker * Eric Anholt <[email protected]>
25*61046927SAndroid Build Coastguard Worker *
26*61046927SAndroid Build Coastguard Worker */
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker #ifndef BRW_FS_H
29*61046927SAndroid Build Coastguard Worker #define BRW_FS_H
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker #include "brw_cfg.h"
32*61046927SAndroid Build Coastguard Worker #include "brw_compiler.h"
33*61046927SAndroid Build Coastguard Worker #include "brw_ir_allocator.h"
34*61046927SAndroid Build Coastguard Worker #include "brw_ir_fs.h"
35*61046927SAndroid Build Coastguard Worker #include "brw_fs_live_variables.h"
36*61046927SAndroid Build Coastguard Worker #include "brw_ir_performance.h"
37*61046927SAndroid Build Coastguard Worker #include "compiler/nir/nir.h"
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker struct bblock_t;
40*61046927SAndroid Build Coastguard Worker namespace {
41*61046927SAndroid Build Coastguard Worker struct acp_entry;
42*61046927SAndroid Build Coastguard Worker }
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker struct fs_visitor;
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker namespace brw {
47*61046927SAndroid Build Coastguard Worker /**
48*61046927SAndroid Build Coastguard Worker * Register pressure analysis of a shader. Estimates how many registers
49*61046927SAndroid Build Coastguard Worker * are live at any point of the program in GRF units.
50*61046927SAndroid Build Coastguard Worker */
51*61046927SAndroid Build Coastguard Worker struct register_pressure {
52*61046927SAndroid Build Coastguard Worker register_pressure(const fs_visitor *v);
53*61046927SAndroid Build Coastguard Worker ~register_pressure();
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker analysis_dependency_class
dependency_classregister_pressure56*61046927SAndroid Build Coastguard Worker dependency_class() const
57*61046927SAndroid Build Coastguard Worker {
58*61046927SAndroid Build Coastguard Worker return (DEPENDENCY_INSTRUCTION_IDENTITY |
59*61046927SAndroid Build Coastguard Worker DEPENDENCY_INSTRUCTION_DATA_FLOW |
60*61046927SAndroid Build Coastguard Worker DEPENDENCY_VARIABLES);
61*61046927SAndroid Build Coastguard Worker }
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker bool
validateregister_pressure64*61046927SAndroid Build Coastguard Worker validate(const fs_visitor *) const
65*61046927SAndroid Build Coastguard Worker {
66*61046927SAndroid Build Coastguard Worker /* FINISHME */
67*61046927SAndroid Build Coastguard Worker return true;
68*61046927SAndroid Build Coastguard Worker }
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker unsigned *regs_live_at_ip;
71*61046927SAndroid Build Coastguard Worker };
72*61046927SAndroid Build Coastguard Worker
73*61046927SAndroid Build Coastguard Worker class def_analysis {
74*61046927SAndroid Build Coastguard Worker public:
75*61046927SAndroid Build Coastguard Worker def_analysis(const fs_visitor *v);
76*61046927SAndroid Build Coastguard Worker ~def_analysis();
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker fs_inst *
get(const brw_reg & reg)79*61046927SAndroid Build Coastguard Worker get(const brw_reg ®) const
80*61046927SAndroid Build Coastguard Worker {
81*61046927SAndroid Build Coastguard Worker return reg.file == VGRF && reg.nr < def_count ?
82*61046927SAndroid Build Coastguard Worker def_insts[reg.nr] : NULL;
83*61046927SAndroid Build Coastguard Worker }
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker bblock_t *
get_block(const brw_reg & reg)86*61046927SAndroid Build Coastguard Worker get_block(const brw_reg ®) const
87*61046927SAndroid Build Coastguard Worker {
88*61046927SAndroid Build Coastguard Worker return reg.file == VGRF && reg.nr < def_count ?
89*61046927SAndroid Build Coastguard Worker def_blocks[reg.nr] : NULL;
90*61046927SAndroid Build Coastguard Worker }
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker uint32_t
get_use_count(const brw_reg & reg)93*61046927SAndroid Build Coastguard Worker get_use_count(const brw_reg ®) const
94*61046927SAndroid Build Coastguard Worker {
95*61046927SAndroid Build Coastguard Worker return reg.file == VGRF && reg.nr < def_count ?
96*61046927SAndroid Build Coastguard Worker def_use_counts[reg.nr] : 0;
97*61046927SAndroid Build Coastguard Worker }
98*61046927SAndroid Build Coastguard Worker
count()99*61046927SAndroid Build Coastguard Worker unsigned count() const { return def_count; }
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker void print_stats(const fs_visitor *) const;
102*61046927SAndroid Build Coastguard Worker
103*61046927SAndroid Build Coastguard Worker analysis_dependency_class
dependency_class()104*61046927SAndroid Build Coastguard Worker dependency_class() const
105*61046927SAndroid Build Coastguard Worker {
106*61046927SAndroid Build Coastguard Worker return DEPENDENCY_INSTRUCTION_IDENTITY |
107*61046927SAndroid Build Coastguard Worker DEPENDENCY_INSTRUCTION_DATA_FLOW |
108*61046927SAndroid Build Coastguard Worker DEPENDENCY_VARIABLES |
109*61046927SAndroid Build Coastguard Worker DEPENDENCY_BLOCKS;
110*61046927SAndroid Build Coastguard Worker }
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Worker bool validate(const fs_visitor *) const;
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker private:
115*61046927SAndroid Build Coastguard Worker void mark_invalid(int);
116*61046927SAndroid Build Coastguard Worker bool fully_defines(const fs_visitor *v, fs_inst *);
117*61046927SAndroid Build Coastguard Worker void update_for_reads(const idom_tree &idom, bblock_t *block, fs_inst *);
118*61046927SAndroid Build Coastguard Worker void update_for_write(const fs_visitor *v, bblock_t *block, fs_inst *);
119*61046927SAndroid Build Coastguard Worker
120*61046927SAndroid Build Coastguard Worker fs_inst **def_insts;
121*61046927SAndroid Build Coastguard Worker bblock_t **def_blocks;
122*61046927SAndroid Build Coastguard Worker uint32_t *def_use_counts;
123*61046927SAndroid Build Coastguard Worker unsigned def_count;
124*61046927SAndroid Build Coastguard Worker };
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker
127*61046927SAndroid Build Coastguard Worker #define UBO_START ((1 << 16) - 4)
128*61046927SAndroid Build Coastguard Worker
129*61046927SAndroid Build Coastguard Worker /**
130*61046927SAndroid Build Coastguard Worker * Scratch data used when compiling a GLSL geometry shader.
131*61046927SAndroid Build Coastguard Worker */
132*61046927SAndroid Build Coastguard Worker struct brw_gs_compile
133*61046927SAndroid Build Coastguard Worker {
134*61046927SAndroid Build Coastguard Worker struct brw_gs_prog_key key;
135*61046927SAndroid Build Coastguard Worker struct intel_vue_map input_vue_map;
136*61046927SAndroid Build Coastguard Worker
137*61046927SAndroid Build Coastguard Worker unsigned control_data_bits_per_vertex;
138*61046927SAndroid Build Coastguard Worker unsigned control_data_header_size_bits;
139*61046927SAndroid Build Coastguard Worker };
140*61046927SAndroid Build Coastguard Worker
141*61046927SAndroid Build Coastguard Worker namespace brw {
142*61046927SAndroid Build Coastguard Worker class fs_builder;
143*61046927SAndroid Build Coastguard Worker }
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker struct shader_stats {
146*61046927SAndroid Build Coastguard Worker const char *scheduler_mode;
147*61046927SAndroid Build Coastguard Worker unsigned promoted_constants;
148*61046927SAndroid Build Coastguard Worker unsigned spill_count;
149*61046927SAndroid Build Coastguard Worker unsigned fill_count;
150*61046927SAndroid Build Coastguard Worker unsigned max_register_pressure;
151*61046927SAndroid Build Coastguard Worker };
152*61046927SAndroid Build Coastguard Worker
153*61046927SAndroid Build Coastguard Worker /** Register numbers for thread payload fields. */
154*61046927SAndroid Build Coastguard Worker struct thread_payload {
155*61046927SAndroid Build Coastguard Worker /** The number of thread payload registers the hardware will supply. */
156*61046927SAndroid Build Coastguard Worker uint8_t num_regs;
157*61046927SAndroid Build Coastguard Worker
158*61046927SAndroid Build Coastguard Worker virtual ~thread_payload() = default;
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker protected:
thread_payloadthread_payload161*61046927SAndroid Build Coastguard Worker thread_payload() : num_regs() {}
162*61046927SAndroid Build Coastguard Worker };
163*61046927SAndroid Build Coastguard Worker
164*61046927SAndroid Build Coastguard Worker struct vs_thread_payload : public thread_payload {
165*61046927SAndroid Build Coastguard Worker vs_thread_payload(const fs_visitor &v);
166*61046927SAndroid Build Coastguard Worker
167*61046927SAndroid Build Coastguard Worker brw_reg urb_handles;
168*61046927SAndroid Build Coastguard Worker };
169*61046927SAndroid Build Coastguard Worker
170*61046927SAndroid Build Coastguard Worker struct tcs_thread_payload : public thread_payload {
171*61046927SAndroid Build Coastguard Worker tcs_thread_payload(const fs_visitor &v);
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker brw_reg patch_urb_output;
174*61046927SAndroid Build Coastguard Worker brw_reg primitive_id;
175*61046927SAndroid Build Coastguard Worker brw_reg icp_handle_start;
176*61046927SAndroid Build Coastguard Worker };
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard Worker struct tes_thread_payload : public thread_payload {
179*61046927SAndroid Build Coastguard Worker tes_thread_payload(const fs_visitor &v);
180*61046927SAndroid Build Coastguard Worker
181*61046927SAndroid Build Coastguard Worker brw_reg patch_urb_input;
182*61046927SAndroid Build Coastguard Worker brw_reg primitive_id;
183*61046927SAndroid Build Coastguard Worker brw_reg coords[3];
184*61046927SAndroid Build Coastguard Worker brw_reg urb_output;
185*61046927SAndroid Build Coastguard Worker };
186*61046927SAndroid Build Coastguard Worker
187*61046927SAndroid Build Coastguard Worker struct gs_thread_payload : public thread_payload {
188*61046927SAndroid Build Coastguard Worker gs_thread_payload(fs_visitor &v);
189*61046927SAndroid Build Coastguard Worker
190*61046927SAndroid Build Coastguard Worker brw_reg urb_handles;
191*61046927SAndroid Build Coastguard Worker brw_reg primitive_id;
192*61046927SAndroid Build Coastguard Worker brw_reg instance_id;
193*61046927SAndroid Build Coastguard Worker brw_reg icp_handle_start;
194*61046927SAndroid Build Coastguard Worker };
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker struct fs_thread_payload : public thread_payload {
197*61046927SAndroid Build Coastguard Worker fs_thread_payload(const fs_visitor &v,
198*61046927SAndroid Build Coastguard Worker bool &source_depth_to_render_target);
199*61046927SAndroid Build Coastguard Worker
200*61046927SAndroid Build Coastguard Worker uint8_t subspan_coord_reg[2];
201*61046927SAndroid Build Coastguard Worker uint8_t source_depth_reg[2];
202*61046927SAndroid Build Coastguard Worker uint8_t source_w_reg[2];
203*61046927SAndroid Build Coastguard Worker uint8_t aa_dest_stencil_reg[2];
204*61046927SAndroid Build Coastguard Worker uint8_t dest_depth_reg[2];
205*61046927SAndroid Build Coastguard Worker uint8_t sample_pos_reg[2];
206*61046927SAndroid Build Coastguard Worker uint8_t sample_mask_in_reg[2];
207*61046927SAndroid Build Coastguard Worker uint8_t barycentric_coord_reg[BRW_BARYCENTRIC_MODE_COUNT][2];
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard Worker uint8_t depth_w_coef_reg;
210*61046927SAndroid Build Coastguard Worker uint8_t pc_bary_coef_reg;
211*61046927SAndroid Build Coastguard Worker uint8_t npc_bary_coef_reg;
212*61046927SAndroid Build Coastguard Worker uint8_t sample_offsets_reg;
213*61046927SAndroid Build Coastguard Worker };
214*61046927SAndroid Build Coastguard Worker
215*61046927SAndroid Build Coastguard Worker struct cs_thread_payload : public thread_payload {
216*61046927SAndroid Build Coastguard Worker cs_thread_payload(const fs_visitor &v);
217*61046927SAndroid Build Coastguard Worker
218*61046927SAndroid Build Coastguard Worker void load_subgroup_id(const brw::fs_builder &bld, brw_reg &dest) const;
219*61046927SAndroid Build Coastguard Worker
220*61046927SAndroid Build Coastguard Worker brw_reg local_invocation_id[3];
221*61046927SAndroid Build Coastguard Worker
222*61046927SAndroid Build Coastguard Worker protected:
223*61046927SAndroid Build Coastguard Worker brw_reg subgroup_id_;
224*61046927SAndroid Build Coastguard Worker };
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker struct task_mesh_thread_payload : public cs_thread_payload {
227*61046927SAndroid Build Coastguard Worker task_mesh_thread_payload(fs_visitor &v);
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker brw_reg extended_parameter_0;
230*61046927SAndroid Build Coastguard Worker brw_reg local_index;
231*61046927SAndroid Build Coastguard Worker brw_reg inline_parameter;
232*61046927SAndroid Build Coastguard Worker
233*61046927SAndroid Build Coastguard Worker brw_reg urb_output;
234*61046927SAndroid Build Coastguard Worker
235*61046927SAndroid Build Coastguard Worker /* URB to read Task memory inputs. Only valid for MESH stage. */
236*61046927SAndroid Build Coastguard Worker brw_reg task_urb_input;
237*61046927SAndroid Build Coastguard Worker };
238*61046927SAndroid Build Coastguard Worker
239*61046927SAndroid Build Coastguard Worker struct bs_thread_payload : public thread_payload {
240*61046927SAndroid Build Coastguard Worker bs_thread_payload(const fs_visitor &v);
241*61046927SAndroid Build Coastguard Worker
242*61046927SAndroid Build Coastguard Worker brw_reg global_arg_ptr;
243*61046927SAndroid Build Coastguard Worker brw_reg local_arg_ptr;
244*61046927SAndroid Build Coastguard Worker
245*61046927SAndroid Build Coastguard Worker void load_shader_type(const brw::fs_builder &bld, brw_reg &dest) const;
246*61046927SAndroid Build Coastguard Worker };
247*61046927SAndroid Build Coastguard Worker
248*61046927SAndroid Build Coastguard Worker enum instruction_scheduler_mode {
249*61046927SAndroid Build Coastguard Worker SCHEDULE_PRE,
250*61046927SAndroid Build Coastguard Worker SCHEDULE_PRE_NON_LIFO,
251*61046927SAndroid Build Coastguard Worker SCHEDULE_PRE_LIFO,
252*61046927SAndroid Build Coastguard Worker SCHEDULE_POST,
253*61046927SAndroid Build Coastguard Worker SCHEDULE_NONE,
254*61046927SAndroid Build Coastguard Worker };
255*61046927SAndroid Build Coastguard Worker
256*61046927SAndroid Build Coastguard Worker class instruction_scheduler;
257*61046927SAndroid Build Coastguard Worker
258*61046927SAndroid Build Coastguard Worker /**
259*61046927SAndroid Build Coastguard Worker * The fragment shader front-end.
260*61046927SAndroid Build Coastguard Worker *
261*61046927SAndroid Build Coastguard Worker * Translates either GLSL IR or Mesa IR (for ARB_fragment_program) into FS IR.
262*61046927SAndroid Build Coastguard Worker */
263*61046927SAndroid Build Coastguard Worker struct fs_visitor
264*61046927SAndroid Build Coastguard Worker {
265*61046927SAndroid Build Coastguard Worker public:
266*61046927SAndroid Build Coastguard Worker fs_visitor(const struct brw_compiler *compiler,
267*61046927SAndroid Build Coastguard Worker const struct brw_compile_params *params,
268*61046927SAndroid Build Coastguard Worker const brw_base_prog_key *key,
269*61046927SAndroid Build Coastguard Worker struct brw_stage_prog_data *prog_data,
270*61046927SAndroid Build Coastguard Worker const nir_shader *shader,
271*61046927SAndroid Build Coastguard Worker unsigned dispatch_width,
272*61046927SAndroid Build Coastguard Worker bool needs_register_pressure,
273*61046927SAndroid Build Coastguard Worker bool debug_enabled);
274*61046927SAndroid Build Coastguard Worker fs_visitor(const struct brw_compiler *compiler,
275*61046927SAndroid Build Coastguard Worker const struct brw_compile_params *params,
276*61046927SAndroid Build Coastguard Worker const brw_wm_prog_key *key,
277*61046927SAndroid Build Coastguard Worker struct brw_wm_prog_data *prog_data,
278*61046927SAndroid Build Coastguard Worker const nir_shader *shader,
279*61046927SAndroid Build Coastguard Worker unsigned dispatch_width,
280*61046927SAndroid Build Coastguard Worker unsigned num_polygons,
281*61046927SAndroid Build Coastguard Worker bool needs_register_pressure,
282*61046927SAndroid Build Coastguard Worker bool debug_enabled);
283*61046927SAndroid Build Coastguard Worker fs_visitor(const struct brw_compiler *compiler,
284*61046927SAndroid Build Coastguard Worker const struct brw_compile_params *params,
285*61046927SAndroid Build Coastguard Worker struct brw_gs_compile *gs_compile,
286*61046927SAndroid Build Coastguard Worker struct brw_gs_prog_data *prog_data,
287*61046927SAndroid Build Coastguard Worker const nir_shader *shader,
288*61046927SAndroid Build Coastguard Worker bool needs_register_pressure,
289*61046927SAndroid Build Coastguard Worker bool debug_enabled);
290*61046927SAndroid Build Coastguard Worker void init();
291*61046927SAndroid Build Coastguard Worker ~fs_visitor();
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Worker void import_uniforms(fs_visitor *v);
294*61046927SAndroid Build Coastguard Worker
295*61046927SAndroid Build Coastguard Worker void assign_curb_setup();
296*61046927SAndroid Build Coastguard Worker void convert_attr_sources_to_hw_regs(fs_inst *inst);
297*61046927SAndroid Build Coastguard Worker void calculate_payload_ranges(bool allow_spilling,
298*61046927SAndroid Build Coastguard Worker unsigned payload_node_count,
299*61046927SAndroid Build Coastguard Worker int *payload_last_use_ip) const;
300*61046927SAndroid Build Coastguard Worker void assign_constant_locations();
301*61046927SAndroid Build Coastguard Worker bool get_pull_locs(const brw_reg &src, unsigned *out_surf_index,
302*61046927SAndroid Build Coastguard Worker unsigned *out_pull_index);
303*61046927SAndroid Build Coastguard Worker void invalidate_analysis(brw::analysis_dependency_class c);
304*61046927SAndroid Build Coastguard Worker
305*61046927SAndroid Build Coastguard Worker void vfail(const char *msg, va_list args);
306*61046927SAndroid Build Coastguard Worker void fail(const char *msg, ...);
307*61046927SAndroid Build Coastguard Worker void limit_dispatch_width(unsigned n, const char *msg);
308*61046927SAndroid Build Coastguard Worker
309*61046927SAndroid Build Coastguard Worker void emit_urb_writes(const brw_reg &gs_vertex_count = brw_reg());
310*61046927SAndroid Build Coastguard Worker void emit_gs_control_data_bits(const brw_reg &vertex_count);
311*61046927SAndroid Build Coastguard Worker brw_reg gs_urb_channel_mask(const brw_reg &dword_index);
312*61046927SAndroid Build Coastguard Worker brw_reg gs_urb_per_slot_dword_index(const brw_reg &vertex_count);
313*61046927SAndroid Build Coastguard Worker bool mark_last_urb_write_with_eot();
314*61046927SAndroid Build Coastguard Worker void emit_cs_terminate();
315*61046927SAndroid Build Coastguard Worker
316*61046927SAndroid Build Coastguard Worker const struct brw_compiler *compiler;
317*61046927SAndroid Build Coastguard Worker void *log_data; /* Passed to compiler->*_log functions */
318*61046927SAndroid Build Coastguard Worker
319*61046927SAndroid Build Coastguard Worker const struct intel_device_info * const devinfo;
320*61046927SAndroid Build Coastguard Worker const nir_shader *nir;
321*61046927SAndroid Build Coastguard Worker
322*61046927SAndroid Build Coastguard Worker /** ralloc context for temporary data used during compile */
323*61046927SAndroid Build Coastguard Worker void *mem_ctx;
324*61046927SAndroid Build Coastguard Worker
325*61046927SAndroid Build Coastguard Worker /** List of fs_inst. */
326*61046927SAndroid Build Coastguard Worker exec_list instructions;
327*61046927SAndroid Build Coastguard Worker
328*61046927SAndroid Build Coastguard Worker cfg_t *cfg;
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker gl_shader_stage stage;
331*61046927SAndroid Build Coastguard Worker bool debug_enabled;
332*61046927SAndroid Build Coastguard Worker
333*61046927SAndroid Build Coastguard Worker brw::simple_allocator alloc;
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker const brw_base_prog_key *const key;
336*61046927SAndroid Build Coastguard Worker
337*61046927SAndroid Build Coastguard Worker struct brw_gs_compile *gs_compile;
338*61046927SAndroid Build Coastguard Worker
339*61046927SAndroid Build Coastguard Worker struct brw_stage_prog_data *prog_data;
340*61046927SAndroid Build Coastguard Worker
341*61046927SAndroid Build Coastguard Worker brw_analysis<brw::fs_live_variables, fs_visitor> live_analysis;
342*61046927SAndroid Build Coastguard Worker brw_analysis<brw::register_pressure, fs_visitor> regpressure_analysis;
343*61046927SAndroid Build Coastguard Worker brw_analysis<brw::performance, fs_visitor> performance_analysis;
344*61046927SAndroid Build Coastguard Worker brw_analysis<brw::idom_tree, fs_visitor> idom_analysis;
345*61046927SAndroid Build Coastguard Worker brw_analysis<brw::def_analysis, fs_visitor> def_analysis;
346*61046927SAndroid Build Coastguard Worker
347*61046927SAndroid Build Coastguard Worker /** Number of uniform variable components visited. */
348*61046927SAndroid Build Coastguard Worker unsigned uniforms;
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker /** Byte-offset for the next available spot in the scratch space buffer. */
351*61046927SAndroid Build Coastguard Worker unsigned last_scratch;
352*61046927SAndroid Build Coastguard Worker
353*61046927SAndroid Build Coastguard Worker /**
354*61046927SAndroid Build Coastguard Worker * Array mapping UNIFORM register numbers to the push parameter index,
355*61046927SAndroid Build Coastguard Worker * or -1 if this uniform register isn't being uploaded as a push constant.
356*61046927SAndroid Build Coastguard Worker */
357*61046927SAndroid Build Coastguard Worker int *push_constant_loc;
358*61046927SAndroid Build Coastguard Worker
359*61046927SAndroid Build Coastguard Worker brw_reg frag_depth;
360*61046927SAndroid Build Coastguard Worker brw_reg frag_stencil;
361*61046927SAndroid Build Coastguard Worker brw_reg sample_mask;
362*61046927SAndroid Build Coastguard Worker brw_reg outputs[VARYING_SLOT_MAX];
363*61046927SAndroid Build Coastguard Worker brw_reg dual_src_output;
364*61046927SAndroid Build Coastguard Worker int first_non_payload_grf;
365*61046927SAndroid Build Coastguard Worker
366*61046927SAndroid Build Coastguard Worker bool failed;
367*61046927SAndroid Build Coastguard Worker char *fail_msg;
368*61046927SAndroid Build Coastguard Worker
369*61046927SAndroid Build Coastguard Worker thread_payload *payload_;
370*61046927SAndroid Build Coastguard Worker
payloadfs_visitor371*61046927SAndroid Build Coastguard Worker thread_payload &payload() {
372*61046927SAndroid Build Coastguard Worker return *this->payload_;
373*61046927SAndroid Build Coastguard Worker }
374*61046927SAndroid Build Coastguard Worker
vs_payloadfs_visitor375*61046927SAndroid Build Coastguard Worker vs_thread_payload &vs_payload() {
376*61046927SAndroid Build Coastguard Worker assert(stage == MESA_SHADER_VERTEX);
377*61046927SAndroid Build Coastguard Worker return *static_cast<vs_thread_payload *>(this->payload_);
378*61046927SAndroid Build Coastguard Worker }
379*61046927SAndroid Build Coastguard Worker
tcs_payloadfs_visitor380*61046927SAndroid Build Coastguard Worker tcs_thread_payload &tcs_payload() {
381*61046927SAndroid Build Coastguard Worker assert(stage == MESA_SHADER_TESS_CTRL);
382*61046927SAndroid Build Coastguard Worker return *static_cast<tcs_thread_payload *>(this->payload_);
383*61046927SAndroid Build Coastguard Worker }
384*61046927SAndroid Build Coastguard Worker
tes_payloadfs_visitor385*61046927SAndroid Build Coastguard Worker tes_thread_payload &tes_payload() {
386*61046927SAndroid Build Coastguard Worker assert(stage == MESA_SHADER_TESS_EVAL);
387*61046927SAndroid Build Coastguard Worker return *static_cast<tes_thread_payload *>(this->payload_);
388*61046927SAndroid Build Coastguard Worker }
389*61046927SAndroid Build Coastguard Worker
gs_payloadfs_visitor390*61046927SAndroid Build Coastguard Worker gs_thread_payload &gs_payload() {
391*61046927SAndroid Build Coastguard Worker assert(stage == MESA_SHADER_GEOMETRY);
392*61046927SAndroid Build Coastguard Worker return *static_cast<gs_thread_payload *>(this->payload_);
393*61046927SAndroid Build Coastguard Worker }
394*61046927SAndroid Build Coastguard Worker
fs_payloadfs_visitor395*61046927SAndroid Build Coastguard Worker fs_thread_payload &fs_payload() {
396*61046927SAndroid Build Coastguard Worker assert(stage == MESA_SHADER_FRAGMENT);
397*61046927SAndroid Build Coastguard Worker return *static_cast<fs_thread_payload *>(this->payload_);
398*61046927SAndroid Build Coastguard Worker };
399*61046927SAndroid Build Coastguard Worker
fs_payloadfs_visitor400*61046927SAndroid Build Coastguard Worker const fs_thread_payload &fs_payload() const {
401*61046927SAndroid Build Coastguard Worker assert(stage == MESA_SHADER_FRAGMENT);
402*61046927SAndroid Build Coastguard Worker return *static_cast<const fs_thread_payload *>(this->payload_);
403*61046927SAndroid Build Coastguard Worker };
404*61046927SAndroid Build Coastguard Worker
cs_payloadfs_visitor405*61046927SAndroid Build Coastguard Worker cs_thread_payload &cs_payload() {
406*61046927SAndroid Build Coastguard Worker assert(gl_shader_stage_uses_workgroup(stage));
407*61046927SAndroid Build Coastguard Worker return *static_cast<cs_thread_payload *>(this->payload_);
408*61046927SAndroid Build Coastguard Worker }
409*61046927SAndroid Build Coastguard Worker
task_mesh_payloadfs_visitor410*61046927SAndroid Build Coastguard Worker task_mesh_thread_payload &task_mesh_payload() {
411*61046927SAndroid Build Coastguard Worker assert(stage == MESA_SHADER_TASK || stage == MESA_SHADER_MESH);
412*61046927SAndroid Build Coastguard Worker return *static_cast<task_mesh_thread_payload *>(this->payload_);
413*61046927SAndroid Build Coastguard Worker }
414*61046927SAndroid Build Coastguard Worker
bs_payloadfs_visitor415*61046927SAndroid Build Coastguard Worker bs_thread_payload &bs_payload() {
416*61046927SAndroid Build Coastguard Worker assert(stage >= MESA_SHADER_RAYGEN && stage <= MESA_SHADER_CALLABLE);
417*61046927SAndroid Build Coastguard Worker return *static_cast<bs_thread_payload *>(this->payload_);
418*61046927SAndroid Build Coastguard Worker }
419*61046927SAndroid Build Coastguard Worker
420*61046927SAndroid Build Coastguard Worker bool source_depth_to_render_target;
421*61046927SAndroid Build Coastguard Worker
422*61046927SAndroid Build Coastguard Worker brw_reg pixel_x;
423*61046927SAndroid Build Coastguard Worker brw_reg pixel_y;
424*61046927SAndroid Build Coastguard Worker brw_reg pixel_z;
425*61046927SAndroid Build Coastguard Worker brw_reg wpos_w;
426*61046927SAndroid Build Coastguard Worker brw_reg pixel_w;
427*61046927SAndroid Build Coastguard Worker brw_reg delta_xy[BRW_BARYCENTRIC_MODE_COUNT];
428*61046927SAndroid Build Coastguard Worker brw_reg final_gs_vertex_count;
429*61046927SAndroid Build Coastguard Worker brw_reg control_data_bits;
430*61046927SAndroid Build Coastguard Worker brw_reg invocation_id;
431*61046927SAndroid Build Coastguard Worker
432*61046927SAndroid Build Coastguard Worker unsigned grf_used;
433*61046927SAndroid Build Coastguard Worker bool spilled_any_registers;
434*61046927SAndroid Build Coastguard Worker bool needs_register_pressure;
435*61046927SAndroid Build Coastguard Worker
436*61046927SAndroid Build Coastguard Worker const unsigned dispatch_width; /**< 8, 16 or 32 */
437*61046927SAndroid Build Coastguard Worker const unsigned max_polygons;
438*61046927SAndroid Build Coastguard Worker unsigned max_dispatch_width;
439*61046927SAndroid Build Coastguard Worker
440*61046927SAndroid Build Coastguard Worker /* The API selected subgroup size */
441*61046927SAndroid Build Coastguard Worker unsigned api_subgroup_size; /**< 0, 8, 16, 32 */
442*61046927SAndroid Build Coastguard Worker
443*61046927SAndroid Build Coastguard Worker struct shader_stats shader_stats;
444*61046927SAndroid Build Coastguard Worker
445*61046927SAndroid Build Coastguard Worker void debug_optimizer(const nir_shader *nir,
446*61046927SAndroid Build Coastguard Worker const char *pass_name,
447*61046927SAndroid Build Coastguard Worker int iteration, int pass_num) const;
448*61046927SAndroid Build Coastguard Worker };
449*61046927SAndroid Build Coastguard Worker
450*61046927SAndroid Build Coastguard Worker void brw_print_instruction_to_file(const fs_visitor &s, const fs_inst *inst, FILE *file, const brw::def_analysis *defs);
451*61046927SAndroid Build Coastguard Worker void brw_print_instructions_to_file(const fs_visitor &s, FILE *file);
452*61046927SAndroid Build Coastguard Worker
453*61046927SAndroid Build Coastguard Worker /* Convenience functions based on the above. */
454*61046927SAndroid Build Coastguard Worker inline void brw_print_instruction(const fs_visitor &s, const fs_inst *inst, FILE *file = stderr, const brw::def_analysis *defs = nullptr) {
455*61046927SAndroid Build Coastguard Worker brw_print_instruction_to_file(s, inst, file, defs);
456*61046927SAndroid Build Coastguard Worker }
457*61046927SAndroid Build Coastguard Worker void brw_print_instructions(const fs_visitor &s, const char *name = nullptr);
458*61046927SAndroid Build Coastguard Worker
459*61046927SAndroid Build Coastguard Worker void brw_print_swsb(FILE *f, const struct intel_device_info *devinfo, const tgl_swsb swsb);
460*61046927SAndroid Build Coastguard Worker
461*61046927SAndroid Build Coastguard Worker /**
462*61046927SAndroid Build Coastguard Worker * Return the flag register used in fragment shaders to keep track of live
463*61046927SAndroid Build Coastguard Worker * samples. On Gfx7+ we use f1.0-f1.1 to allow discard jumps in SIMD32
464*61046927SAndroid Build Coastguard Worker * dispatch mode.
465*61046927SAndroid Build Coastguard Worker */
466*61046927SAndroid Build Coastguard Worker static inline unsigned
sample_mask_flag_subreg(const fs_visitor & s)467*61046927SAndroid Build Coastguard Worker sample_mask_flag_subreg(const fs_visitor &s)
468*61046927SAndroid Build Coastguard Worker {
469*61046927SAndroid Build Coastguard Worker assert(s.stage == MESA_SHADER_FRAGMENT);
470*61046927SAndroid Build Coastguard Worker return 2;
471*61046927SAndroid Build Coastguard Worker }
472*61046927SAndroid Build Coastguard Worker
473*61046927SAndroid Build Coastguard Worker /**
474*61046927SAndroid Build Coastguard Worker * The fragment shader code generator.
475*61046927SAndroid Build Coastguard Worker *
476*61046927SAndroid Build Coastguard Worker * Translates FS IR to actual i965 assembly code.
477*61046927SAndroid Build Coastguard Worker */
478*61046927SAndroid Build Coastguard Worker class fs_generator
479*61046927SAndroid Build Coastguard Worker {
480*61046927SAndroid Build Coastguard Worker public:
481*61046927SAndroid Build Coastguard Worker fs_generator(const struct brw_compiler *compiler,
482*61046927SAndroid Build Coastguard Worker const struct brw_compile_params *params,
483*61046927SAndroid Build Coastguard Worker struct brw_stage_prog_data *prog_data,
484*61046927SAndroid Build Coastguard Worker gl_shader_stage stage);
485*61046927SAndroid Build Coastguard Worker ~fs_generator();
486*61046927SAndroid Build Coastguard Worker
487*61046927SAndroid Build Coastguard Worker void enable_debug(const char *shader_name);
488*61046927SAndroid Build Coastguard Worker int generate_code(const cfg_t *cfg, int dispatch_width,
489*61046927SAndroid Build Coastguard Worker struct shader_stats shader_stats,
490*61046927SAndroid Build Coastguard Worker const brw::performance &perf,
491*61046927SAndroid Build Coastguard Worker struct brw_compile_stats *stats,
492*61046927SAndroid Build Coastguard Worker unsigned max_polygons = 0);
493*61046927SAndroid Build Coastguard Worker void add_const_data(void *data, unsigned size);
494*61046927SAndroid Build Coastguard Worker void add_resume_sbt(unsigned num_resume_shaders, uint64_t *sbt);
495*61046927SAndroid Build Coastguard Worker const unsigned *get_assembly();
496*61046927SAndroid Build Coastguard Worker
497*61046927SAndroid Build Coastguard Worker private:
498*61046927SAndroid Build Coastguard Worker void generate_send(fs_inst *inst,
499*61046927SAndroid Build Coastguard Worker struct brw_reg dst,
500*61046927SAndroid Build Coastguard Worker struct brw_reg desc,
501*61046927SAndroid Build Coastguard Worker struct brw_reg ex_desc,
502*61046927SAndroid Build Coastguard Worker struct brw_reg payload,
503*61046927SAndroid Build Coastguard Worker struct brw_reg payload2);
504*61046927SAndroid Build Coastguard Worker void generate_barrier(fs_inst *inst, struct brw_reg src);
505*61046927SAndroid Build Coastguard Worker void generate_ddx(const fs_inst *inst,
506*61046927SAndroid Build Coastguard Worker struct brw_reg dst, struct brw_reg src);
507*61046927SAndroid Build Coastguard Worker void generate_ddy(const fs_inst *inst,
508*61046927SAndroid Build Coastguard Worker struct brw_reg dst, struct brw_reg src);
509*61046927SAndroid Build Coastguard Worker void generate_scratch_header(fs_inst *inst,
510*61046927SAndroid Build Coastguard Worker struct brw_reg dst, struct brw_reg src);
511*61046927SAndroid Build Coastguard Worker
512*61046927SAndroid Build Coastguard Worker void generate_halt(fs_inst *inst);
513*61046927SAndroid Build Coastguard Worker
514*61046927SAndroid Build Coastguard Worker void generate_mov_indirect(fs_inst *inst,
515*61046927SAndroid Build Coastguard Worker struct brw_reg dst,
516*61046927SAndroid Build Coastguard Worker struct brw_reg reg,
517*61046927SAndroid Build Coastguard Worker struct brw_reg indirect_byte_offset);
518*61046927SAndroid Build Coastguard Worker
519*61046927SAndroid Build Coastguard Worker void generate_shuffle(fs_inst *inst,
520*61046927SAndroid Build Coastguard Worker struct brw_reg dst,
521*61046927SAndroid Build Coastguard Worker struct brw_reg src,
522*61046927SAndroid Build Coastguard Worker struct brw_reg idx);
523*61046927SAndroid Build Coastguard Worker
524*61046927SAndroid Build Coastguard Worker void generate_quad_swizzle(const fs_inst *inst,
525*61046927SAndroid Build Coastguard Worker struct brw_reg dst, struct brw_reg src,
526*61046927SAndroid Build Coastguard Worker unsigned swiz);
527*61046927SAndroid Build Coastguard Worker
528*61046927SAndroid Build Coastguard Worker bool patch_halt_jumps();
529*61046927SAndroid Build Coastguard Worker
530*61046927SAndroid Build Coastguard Worker const struct brw_compiler *compiler;
531*61046927SAndroid Build Coastguard Worker const struct brw_compile_params *params;
532*61046927SAndroid Build Coastguard Worker
533*61046927SAndroid Build Coastguard Worker const struct intel_device_info *devinfo;
534*61046927SAndroid Build Coastguard Worker
535*61046927SAndroid Build Coastguard Worker struct brw_codegen *p;
536*61046927SAndroid Build Coastguard Worker struct brw_stage_prog_data * const prog_data;
537*61046927SAndroid Build Coastguard Worker
538*61046927SAndroid Build Coastguard Worker unsigned dispatch_width; /**< 8, 16 or 32 */
539*61046927SAndroid Build Coastguard Worker
540*61046927SAndroid Build Coastguard Worker exec_list discard_halt_patches;
541*61046927SAndroid Build Coastguard Worker bool debug_flag;
542*61046927SAndroid Build Coastguard Worker const char *shader_name;
543*61046927SAndroid Build Coastguard Worker gl_shader_stage stage;
544*61046927SAndroid Build Coastguard Worker void *mem_ctx;
545*61046927SAndroid Build Coastguard Worker };
546*61046927SAndroid Build Coastguard Worker
547*61046927SAndroid Build Coastguard Worker namespace brw {
548*61046927SAndroid Build Coastguard Worker brw_reg
549*61046927SAndroid Build Coastguard Worker fetch_payload_reg(const brw::fs_builder &bld, uint8_t regs[2],
550*61046927SAndroid Build Coastguard Worker brw_reg_type type = BRW_TYPE_F,
551*61046927SAndroid Build Coastguard Worker unsigned n = 1);
552*61046927SAndroid Build Coastguard Worker
553*61046927SAndroid Build Coastguard Worker brw_reg
554*61046927SAndroid Build Coastguard Worker fetch_barycentric_reg(const brw::fs_builder &bld, uint8_t regs[2]);
555*61046927SAndroid Build Coastguard Worker
556*61046927SAndroid Build Coastguard Worker inline brw_reg
dynamic_msaa_flags(const struct brw_wm_prog_data * wm_prog_data)557*61046927SAndroid Build Coastguard Worker dynamic_msaa_flags(const struct brw_wm_prog_data *wm_prog_data)
558*61046927SAndroid Build Coastguard Worker {
559*61046927SAndroid Build Coastguard Worker return brw_uniform_reg(wm_prog_data->msaa_flags_param, BRW_TYPE_UD);
560*61046927SAndroid Build Coastguard Worker }
561*61046927SAndroid Build Coastguard Worker
562*61046927SAndroid Build Coastguard Worker void
563*61046927SAndroid Build Coastguard Worker check_dynamic_msaa_flag(const fs_builder &bld,
564*61046927SAndroid Build Coastguard Worker const struct brw_wm_prog_data *wm_prog_data,
565*61046927SAndroid Build Coastguard Worker enum intel_msaa_flags flag);
566*61046927SAndroid Build Coastguard Worker
567*61046927SAndroid Build Coastguard Worker bool
568*61046927SAndroid Build Coastguard Worker lower_src_modifiers(fs_visitor *v, bblock_t *block, fs_inst *inst, unsigned i);
569*61046927SAndroid Build Coastguard Worker }
570*61046927SAndroid Build Coastguard Worker
571*61046927SAndroid Build Coastguard Worker void shuffle_from_32bit_read(const brw::fs_builder &bld,
572*61046927SAndroid Build Coastguard Worker const brw_reg &dst,
573*61046927SAndroid Build Coastguard Worker const brw_reg &src,
574*61046927SAndroid Build Coastguard Worker uint32_t first_component,
575*61046927SAndroid Build Coastguard Worker uint32_t components);
576*61046927SAndroid Build Coastguard Worker
577*61046927SAndroid Build Coastguard Worker enum brw_barycentric_mode brw_barycentric_mode(const struct brw_wm_prog_key *key,
578*61046927SAndroid Build Coastguard Worker nir_intrinsic_instr *intr);
579*61046927SAndroid Build Coastguard Worker
580*61046927SAndroid Build Coastguard Worker uint32_t brw_fb_write_msg_control(const fs_inst *inst,
581*61046927SAndroid Build Coastguard Worker const struct brw_wm_prog_data *prog_data);
582*61046927SAndroid Build Coastguard Worker
583*61046927SAndroid Build Coastguard Worker void brw_compute_urb_setup_index(struct brw_wm_prog_data *wm_prog_data);
584*61046927SAndroid Build Coastguard Worker
585*61046927SAndroid Build Coastguard Worker bool brw_nir_lower_simd(nir_shader *nir, unsigned dispatch_width);
586*61046927SAndroid Build Coastguard Worker
587*61046927SAndroid Build Coastguard Worker brw_reg brw_sample_mask_reg(const brw::fs_builder &bld);
588*61046927SAndroid Build Coastguard Worker void brw_emit_predicate_on_sample_mask(const brw::fs_builder &bld, fs_inst *inst);
589*61046927SAndroid Build Coastguard Worker
590*61046927SAndroid Build Coastguard Worker int brw_get_subgroup_id_param_index(const intel_device_info *devinfo,
591*61046927SAndroid Build Coastguard Worker const brw_stage_prog_data *prog_data);
592*61046927SAndroid Build Coastguard Worker
593*61046927SAndroid Build Coastguard Worker void nir_to_brw(fs_visitor *s);
594*61046927SAndroid Build Coastguard Worker
595*61046927SAndroid Build Coastguard Worker #ifndef NDEBUG
596*61046927SAndroid Build Coastguard Worker void brw_fs_validate(const fs_visitor &s);
597*61046927SAndroid Build Coastguard Worker #else
brw_fs_validate(const fs_visitor & s)598*61046927SAndroid Build Coastguard Worker static inline void brw_fs_validate(const fs_visitor &s) {}
599*61046927SAndroid Build Coastguard Worker #endif
600*61046927SAndroid Build Coastguard Worker
601*61046927SAndroid Build Coastguard Worker void brw_calculate_cfg(fs_visitor &s);
602*61046927SAndroid Build Coastguard Worker
603*61046927SAndroid Build Coastguard Worker void brw_fs_optimize(fs_visitor &s);
604*61046927SAndroid Build Coastguard Worker
605*61046927SAndroid Build Coastguard Worker instruction_scheduler *brw_prepare_scheduler(fs_visitor &s, void *mem_ctx);
606*61046927SAndroid Build Coastguard Worker void brw_schedule_instructions_pre_ra(fs_visitor &s, instruction_scheduler *sched,
607*61046927SAndroid Build Coastguard Worker instruction_scheduler_mode mode);
608*61046927SAndroid Build Coastguard Worker void brw_schedule_instructions_post_ra(fs_visitor &s);
609*61046927SAndroid Build Coastguard Worker
610*61046927SAndroid Build Coastguard Worker void brw_allocate_registers(fs_visitor &s, bool allow_spilling);
611*61046927SAndroid Build Coastguard Worker bool brw_assign_regs(fs_visitor &s, bool allow_spilling, bool spill_all);
612*61046927SAndroid Build Coastguard Worker void brw_assign_regs_trivial(fs_visitor &s);
613*61046927SAndroid Build Coastguard Worker
614*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_3src_null_dest(fs_visitor &s);
615*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_alu_restrictions(fs_visitor &s);
616*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_barycentrics(fs_visitor &s);
617*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_constant_loads(fs_visitor &s);
618*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_derivatives(fs_visitor &s);
619*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_dpas(fs_visitor &s);
620*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_find_live_channel(fs_visitor &s);
621*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_integer_multiplication(fs_visitor &s);
622*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_load_subgroup_invocation(fs_visitor &s);
623*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_indirect_mov(fs_visitor &s);
624*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_logical_sends(fs_visitor &s);
625*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_pack(fs_visitor &s);
626*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_load_payload(fs_visitor &s);
627*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_regioning(fs_visitor &s);
628*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_scoreboard(fs_visitor &s);
629*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_sends_overlapping_payload(fs_visitor &s);
630*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_simd_width(fs_visitor &s);
631*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_csel(fs_visitor &s);
632*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_sub_sat(fs_visitor &s);
633*61046927SAndroid Build Coastguard Worker bool brw_fs_lower_uniform_pull_constant_loads(fs_visitor &s);
634*61046927SAndroid Build Coastguard Worker void brw_fs_lower_vgrfs_to_fixed_grfs(fs_visitor &s);
635*61046927SAndroid Build Coastguard Worker
636*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_algebraic(fs_visitor &s);
637*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_bank_conflicts(fs_visitor &s);
638*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_cmod_propagation(fs_visitor &s);
639*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_combine_constants(fs_visitor &s);
640*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_compact_virtual_grfs(fs_visitor &s);
641*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_copy_propagation(fs_visitor &s);
642*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_copy_propagation_defs(fs_visitor &s);
643*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_cse_defs(fs_visitor &s);
644*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_dead_code_eliminate(fs_visitor &s);
645*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_eliminate_find_live_channel(fs_visitor &s);
646*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_register_coalesce(fs_visitor &s);
647*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_remove_extra_rounding_modes(fs_visitor &s);
648*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_remove_redundant_halts(fs_visitor &s);
649*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_saturate_propagation(fs_visitor &s);
650*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_split_sends(fs_visitor &s);
651*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_split_virtual_grfs(fs_visitor &s);
652*61046927SAndroid Build Coastguard Worker bool brw_fs_opt_zero_samples(fs_visitor &s);
653*61046927SAndroid Build Coastguard Worker
654*61046927SAndroid Build Coastguard Worker bool brw_fs_workaround_emit_dummy_mov_instruction(fs_visitor &s);
655*61046927SAndroid Build Coastguard Worker bool brw_fs_workaround_memory_fence_before_eot(fs_visitor &s);
656*61046927SAndroid Build Coastguard Worker bool brw_fs_workaround_nomask_control_flow(fs_visitor &s);
657*61046927SAndroid Build Coastguard Worker
658*61046927SAndroid Build Coastguard Worker /* Helpers. */
659*61046927SAndroid Build Coastguard Worker unsigned brw_fs_get_lowered_simd_width(const fs_visitor *shader,
660*61046927SAndroid Build Coastguard Worker const fs_inst *inst);
661*61046927SAndroid Build Coastguard Worker
662*61046927SAndroid Build Coastguard Worker #endif /* BRW_FS_H */
663