xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/r600/sfn/sfn_shader_gs.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright 2021 Collabora LTD
3  * Author: Gert Wollny <[email protected]>
4  * SPDX-License-Identifier: MIT
5  */
6 
7 #ifndef SFN_GEOMETRYSHADER_H
8 #define SFN_GEOMETRYSHADER_H
9 
10 #include "sfn_instr_export.h"
11 #include "sfn_shader.h"
12 
13 namespace r600 {
14 
15 class GeometryShader : public Shader {
16 public:
17    GeometryShader(const r600_shader_key& key);
18 
19 private:
20    bool do_scan_instruction(nir_instr *instr) override;
21    int do_allocate_reserved_registers() override;
22 
23    bool process_stage_intrinsic(nir_intrinsic_instr *intr) override;
24 
25    bool process_store_output(nir_intrinsic_instr *intr);
26    bool process_load_input(nir_intrinsic_instr *intr);
27 
28    void do_finalize() override;
29 
30    void do_get_shader_info(r600_shader *sh_info) override;
31 
32    bool read_prop(std::istream& is) override;
33    void do_print_properties(std::ostream& os) const override;
34 
35    void emit_adj_fix();
36 
37    bool emit_load_per_vertex_input(nir_intrinsic_instr *instr);
38 
load_input(UNUSED nir_intrinsic_instr * intr)39    bool load_input(UNUSED nir_intrinsic_instr *intr) override
40    {
41       unreachable("load_input must be lowered in GS");
42    };
43    bool store_output(nir_intrinsic_instr *instr) override;
44    bool emit_vertex(nir_intrinsic_instr *instr, bool cut);
45 
46    std::array<PRegister, 6> m_per_vertex_offsets{nullptr};
47    PRegister m_primitive_id{nullptr};
48    PRegister m_invocation_id{nullptr};
49    std::array<PRegister, 4> m_export_base{nullptr};
50 
51    unsigned m_ring_item_sizes[4]{0};
52 
53    bool m_tri_strip_adj_fix{false};
54    bool m_first_vertex_emitted{false};
55    int m_offset{0};
56    int m_next_input_ring_offset{0};
57    int m_cc_dist_mask{0};
58    int m_clip_dist_write{0};
59    int m_cur_ring_output{0};
60    bool m_gs_tri_strip_adj_fix{false};
61    uint64_t m_input_mask{0};
62    unsigned m_noutputs{0};
63    bool m_out_viewport{false};
64    bool m_out_misc_write{false};
65 
66    std::map<int, MemRingOutInstr *> m_streamout_data;
67 };
68 
69 } // namespace r600
70 
71 #endif // GEOMETRYSHADER_H
72