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