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