nir/opt_vectorize: Add a callback for filtering of vectorizing.
[mesa.git] / src / gallium / drivers / r600 / sfn / sfn_emitssboinstruction.h
1 #ifndef SFN_EMITSSBOINSTRUCTION_H
2 #define SFN_EMITSSBOINSTRUCTION_H
3
4 #include "sfn_emitinstruction.h"
5 #include "sfn_instruction_gds.h"
6
7 namespace r600 {
8
9 class EmitSSBOInstruction: public EmitInstruction {
10 public:
11 EmitSSBOInstruction(ShaderFromNirProcessor& processor);
12
13 void set_ssbo_offset(int offset);
14
15 void set_require_rat_return_address();
16 bool load_rat_return_address();
17 bool load_atomic_inc_limits();
18
19 private:
20 bool do_emit(nir_instr *instr);
21
22 bool emit_atomic(const nir_intrinsic_instr* instr);
23 bool emit_unary_atomic(const nir_intrinsic_instr* instr);
24 bool emit_atomic_add(const nir_intrinsic_instr* instr);
25 bool emit_atomic_inc(const nir_intrinsic_instr* instr);
26 bool emit_atomic_pre_dec(const nir_intrinsic_instr* instr);
27
28 bool emit_load_ssbo(const nir_intrinsic_instr* instr);
29 bool emit_store_ssbo(const nir_intrinsic_instr* instr);
30
31 bool emit_image_size(const nir_intrinsic_instr *intrin);
32 bool emit_image_load(const nir_intrinsic_instr *intrin);
33 bool emit_image_store(const nir_intrinsic_instr *intrin);
34 bool emit_ssbo_atomic_op(const nir_intrinsic_instr *intrin);
35 bool emit_buffer_size(const nir_intrinsic_instr *intrin);
36
37 bool fetch_return_value(const nir_intrinsic_instr *intrin);
38
39 ESDOp get_opcode(nir_intrinsic_op opcode);
40 RatInstruction::ERatOp get_rat_opcode(const nir_intrinsic_op opcode, pipe_format format) const;
41
42 GPRVector make_dest(const nir_intrinsic_instr* instr);
43
44 PValue m_atomic_update;
45
46 bool m_require_rat_return_address;
47 GPRVector m_rat_return_address;
48 int m_ssbo_image_offset;
49 };
50
51 }
52
53 #endif // SFN_EMITSSBOINSTRUCTION_H