1 #ifndef VERTEXSTAGEEXPORT_H 2 #define VERTEXSTAGEEXPORT_H 3 4 #include "sfn_shader_base.h" 5 #include <queue> 6 7 namespace r600 { 8 9 class VertexStage : public ShaderFromNirProcessor { 10 public: 11 using ShaderFromNirProcessor::ShaderFromNirProcessor; 12 13 virtual PValue primitive_id() = 0; 14 }; 15 16 class VertexStageExportBase 17 { 18 public: 19 VertexStageExportBase(VertexStage& proc); 20 virtual ~VertexStageExportBase(); 21 virtual void finalize_exports() = 0; 22 virtual bool do_process_outputs(nir_variable *output); 23 24 virtual void emit_shader_start(); 25 26 virtual void scan_store_output(nir_intrinsic_instr* instr); 27 bool store_output(nir_intrinsic_instr* instr); 28 protected: 29 30 struct store_loc { 31 unsigned frac; 32 unsigned location; 33 unsigned driver_location; 34 int data_loc; 35 }; 36 virtual bool do_store_output(const store_loc& store_info, nir_intrinsic_instr* instr) = 0; 37 38 VertexStage& m_proc; 39 int m_cur_clip_pos; 40 GPRVector m_clip_vertex; 41 }; 42 43 44 class VertexStageWithOutputInfo: public VertexStageExportBase 45 { 46 protected: 47 VertexStageWithOutputInfo(VertexStage& proc); 48 void scan_store_output(nir_intrinsic_instr* instr) override; 49 void emit_shader_start() override; 50 bool do_process_outputs(nir_variable *output) override; 51 protected: 52 unsigned param_id(unsigned driver_location); 53 unsigned current_param() const; 54 private: 55 std::priority_queue<unsigned, std::vector<unsigned>, std::greater<unsigned> > m_param_driver_locations; 56 std::map<unsigned, unsigned> m_param_map; 57 unsigned m_current_param; 58 }; 59 60 61 class VertexStageExportForFS : public VertexStageWithOutputInfo 62 { 63 public: 64 VertexStageExportForFS(VertexStage& proc, 65 const pipe_stream_output_info *so_info, 66 r600_pipe_shader *pipe_shader, 67 const r600_shader_key& key); 68 69 void finalize_exports() override; 70 private: 71 bool do_store_output(const store_loc& store_info, nir_intrinsic_instr* instr) override; 72 73 bool emit_varying_param(const store_loc& store_info, nir_intrinsic_instr* instr); 74 bool emit_varying_pos(const store_loc& store_info, nir_intrinsic_instr* instr, 75 std::array<uint32_t, 4> *swizzle_override = nullptr); 76 bool emit_clip_vertices(const store_loc &store_info, nir_intrinsic_instr* instr); 77 bool emit_stream(int stream); 78 79 ExportInstruction *m_last_param_export; 80 ExportInstruction *m_last_pos_export; 81 82 int m_num_clip_dist; 83 int m_enabled_stream_buffers_mask; 84 const pipe_stream_output_info *m_so_info; 85 r600_pipe_shader *m_pipe_shader; 86 const r600_shader_key& m_key; 87 88 89 }; 90 91 class VertexStageExportForGS : public VertexStageWithOutputInfo 92 { 93 public: 94 VertexStageExportForGS(VertexStage& proc, 95 const r600_shader *gs_shader); 96 void finalize_exports() override; 97 98 private: 99 bool do_store_output(const store_loc& store_info, nir_intrinsic_instr* instr) override; 100 unsigned m_num_clip_dist; 101 const r600_shader *m_gs_shader; 102 }; 103 104 class VertexStageExportForES : public VertexStageExportBase 105 { 106 public: 107 VertexStageExportForES(VertexStage& proc); 108 void finalize_exports() override; 109 private: 110 bool do_store_output(const store_loc& store_info, nir_intrinsic_instr* instr) override; 111 }; 112 113 114 } 115 116 #endif // VERTEXSTAGEEXPORT_H 117