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