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