xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/r600/sfn/sfn_shader_vs.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /* -*- mesa-c++  -*-
2  * Copyright 2022 Collabora LTD
3  * Author: Gert Wollny <[email protected]>
4  * SPDX-License-Identifier: MIT
5  */
6 
7 #ifndef SFN_SHADER_VS_H
8 #define SFN_SHADER_VS_H
9 
10 #include "sfn_shader.h"
11 
12 namespace r600 {
13 
14 class VertexStageShader : public Shader {
15 protected:
16    using Shader::Shader;
17 
18 public:
primitive_id()19    PRegister primitive_id() const { return m_primitive_id; }
set_primitive_id(PRegister prim_id)20    void set_primitive_id(PRegister prim_id) { m_primitive_id = prim_id; }
21 
22    void combine_enabled_stream_buffers_mask(uint32_t mask);
23    uint32_t enabled_stream_buffers_mask() const override;
24 
25 private:
26    PRegister m_primitive_id{nullptr};
27    uint32_t m_enabled_stream_buffers_mask{0};
28 };
29 
30 class VertexExportStage : public Allocate {
31 public:
32    VertexExportStage(VertexStageShader *parent);
33 
34    bool store_output(nir_intrinsic_instr& intr);
35 
36    virtual void finalize() = 0;
37 
38    virtual void get_shader_info(r600_shader *sh_info) const = 0;
39 
40 protected:
41    struct store_loc {
42       unsigned frac;
43       unsigned location;
44       unsigned driver_location;
45       int data_loc;
46    };
47 
48    virtual bool do_store_output(const store_loc& store_info,
49                                 nir_intrinsic_instr& intr) = 0;
50 
51    VertexStageShader *m_parent;
52 
53 private:
54 };
55 
56 class VertexExportForFs : public VertexExportStage {
57    friend VertexExportStage;
58 
59 public:
60    VertexExportForFs(VertexStageShader *parent,
61                      const pipe_stream_output_info *so_info,
62                      const r600_shader_key& key);
63 
64    void finalize() override;
65 
66    void get_shader_info(r600_shader *sh_info) const override;
67 
68 private:
69    bool do_store_output(const store_loc& store_info, nir_intrinsic_instr& intr) override;
70 
71    bool emit_varying_pos(const store_loc& store_info,
72                          nir_intrinsic_instr& intr,
73                          std::array<uint8_t, 4> *swizzle_override = nullptr);
74    bool emit_varying_param(const store_loc& store_info, nir_intrinsic_instr& intr);
75 
76    bool emit_clip_vertices(const store_loc& store_info, const nir_intrinsic_instr& instr);
77 
78    bool emit_stream(int stream);
79 
80    const RegisterVec4 *output_register(int loc) const;
81 
82    ExportInstr *m_last_param_export{nullptr};
83    ExportInstr *m_last_pos_export{nullptr};
84 
85    int m_num_clip_dist{0};
86    int m_next_param{0};
87    uint8_t m_cc_dist_mask{0};
88    uint8_t m_clip_dist_write{0};
89    int m_cur_clip_pos{1};
90    bool m_writes_point_size{false};
91    bool m_out_misc_write{false};
92    bool m_vs_out_layer{false};
93    bool m_vs_as_gs_a{false};
94    bool m_out_edgeflag{false};
95    bool m_out_viewport{false};
96    bool m_out_point_size{false};
97    RegisterVec4 m_clip_vertex;
98 
99    const pipe_stream_output_info *m_so_info{nullptr};
100 
101    template <typename Key, typename T>
102    using unordered_map_alloc = std::unordered_map<Key,
103                                                   T,
104                                                   std::hash<Key>,
105                                                   std::equal_to<Key>,
106                                                   Allocator<std::pair<const Key, T>>>;
107 
108    unordered_map_alloc<int, RegisterVec4 *> m_output_registers;
109 };
110 
111 class VertexExportForGS : public VertexExportStage {
112 public:
113    VertexExportForGS(VertexStageShader *parent, const r600_shader *gs_shader);
114    void finalize() override;
115 
116    void get_shader_info(r600_shader *sh_info) const override;
117 
118 private:
119    bool do_store_output(const store_loc& store_info, nir_intrinsic_instr& intr) override;
120    unsigned m_num_clip_dist{0};
121    bool m_vs_out_viewport{false};
122    bool m_vs_out_misc_write{false};
123 
124    const r600_shader *m_gs_shader;
125 };
126 
127 class VertexExportForTCS : public VertexExportStage {
128 public:
129    VertexExportForTCS(VertexStageShader *parent);
130    void finalize() override;
131    void get_shader_info(r600_shader *sh_info) const override;
132 
133 private:
134    bool do_store_output(const store_loc& store_info, nir_intrinsic_instr& intr) override;
135 };
136 
137 class VertexShader : public VertexStageShader {
138 public:
139    VertexShader(const pipe_stream_output_info *so_info,
140                 r600_shader *gs_shader,
141                 const r600_shader_key& key);
142 
143    bool load_input(nir_intrinsic_instr *intr) override;
144    bool store_output(nir_intrinsic_instr *intr) override;
145 
146    bool process_stage_intrinsic(nir_intrinsic_instr *intr) override;
147 
148 private:
149    bool do_scan_instruction(nir_instr *instr) override;
150    int do_allocate_reserved_registers() override;
151 
152    void do_finalize() override;
153 
154    bool read_prop(std::istream& is) override;
155 
156    void do_print_properties(std::ostream& os) const override;
157    void do_get_shader_info(r600_shader *sh_info) override;
158 
159    VertexExportStage *m_export_stage{nullptr};
160    int m_last_vertex_attribute_register{0};
161    PRegister m_vertex_id{nullptr};
162    PRegister m_instance_id{nullptr};
163    PRegister m_rel_vertex_id{nullptr};
164    bool m_vs_as_gs_a;
165 };
166 
167 } // namespace r600
168 
169 #endif
170