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