1 /* -*- mesa-c++ -*- 2 * Copyright 2022 Collabora LTD 3 * Author: Gert Wollny <[email protected]> 4 * SPDX-License-Identifier: MIT 5 */ 6 7 #ifndef R600_SFN_SHADER_FS_H 8 #define R600_SFN_SHADER_FS_H 9 10 #include "sfn_shader.h" 11 12 namespace r600 { 13 14 class FragmentShader : public Shader { 15 public: 16 FragmentShader(const r600_shader_key& key); 17 bool load_input(nir_intrinsic_instr *intr) override; 18 bool store_output(nir_intrinsic_instr *intr) override; 19 20 bool process_stage_intrinsic(nir_intrinsic_instr *intr) override; 21 image_size_const_offset()22 unsigned image_size_const_offset() override { return m_image_size_const_offset;} 23 24 protected: 25 static const int s_max_interpolators = 6; interpolators_used(int i)26 bool interpolators_used(int i) const { return m_interpolators_used.test(i); } 27 28 private: 29 bool load_interpolated_input(nir_intrinsic_instr *intr); 30 31 virtual int allocate_interpolators_or_inputs() = 0; 32 virtual bool load_input_hw(nir_intrinsic_instr *intr) = 0; 33 virtual bool process_stage_intrinsic_hw(nir_intrinsic_instr *intr) = 0; 34 virtual bool load_interpolated_input_hw(nir_intrinsic_instr *intr) = 0; 35 36 bool do_scan_instruction(nir_instr *instr) override; 37 int do_allocate_reserved_registers() override; 38 39 void do_get_shader_info(r600_shader *sh_info) override; 40 41 bool scan_input(nir_intrinsic_instr *instr, int index_src_id); 42 43 bool emit_export_pixel(nir_intrinsic_instr& intr); 44 bool emit_load_sample_mask_in(nir_intrinsic_instr *instr); 45 bool emit_load_helper_invocation(nir_intrinsic_instr *instr); 46 bool emit_load_sample_pos(nir_intrinsic_instr *instr); 47 void do_finalize() override; 48 49 bool read_prop(std::istream& is) override; 50 51 void do_print_properties(std::ostream& os) const override; 52 53 bool m_dual_source_blend{false}; 54 unsigned m_max_color_exports{0}; 55 unsigned m_export_highest{0}; 56 unsigned m_num_color_exports{0}; 57 unsigned m_color_export_mask{0}; 58 unsigned m_color_export_written_mask{0}; 59 ExportInstr *m_last_pixel_export{nullptr}; 60 61 std::bitset<s_max_interpolators> m_interpolators_used; 62 RegisterVec4 m_pos_input; 63 Register *m_face_input{nullptr}; 64 bool m_fs_write_all{false}; 65 bool m_uses_discard{false}; 66 bool m_gs_prim_id_input{false}; 67 Register *m_sample_id_reg{nullptr}; 68 Register *m_sample_mask_reg{nullptr}; 69 Register *m_helper_invocation{nullptr}; 70 int m_nsys_inputs{0}; 71 bool m_apply_sample_mask{false}; 72 int m_rat_base{0}; 73 int m_pos_driver_loc{0}; 74 int m_face_driver_loc{0}; 75 int m_image_size_const_offset{0}; 76 }; 77 78 class FragmentShaderR600 : public FragmentShader { 79 public: 80 using FragmentShader::FragmentShader; 81 82 private: 83 int allocate_interpolators_or_inputs() override; 84 bool load_input_hw(nir_intrinsic_instr *intr) override; 85 bool process_stage_intrinsic_hw(nir_intrinsic_instr *intr) override; 86 bool load_interpolated_input_hw(nir_intrinsic_instr *intr) override; 87 88 IOMap<RegisterVec4> m_interpolated_inputs; 89 }; 90 91 class FragmentShaderEG : public FragmentShader { 92 public: 93 using FragmentShader::FragmentShader; 94 95 private: 96 class Interpolator { 97 public: 98 Interpolator(); 99 bool enabled : 1; 100 unsigned ij_index : 4; 101 PRegister i; 102 PRegister j; 103 }; 104 105 struct InterpolateParams { 106 PVirtualValue i, j; 107 int base; 108 }; 109 110 int allocate_interpolators_or_inputs() override; 111 bool load_input_hw(nir_intrinsic_instr *intr) override; 112 bool process_stage_intrinsic_hw(nir_intrinsic_instr *intr) override; 113 bool load_interpolated_input_hw(nir_intrinsic_instr *intr) override; 114 115 bool load_barycentric_pixel(nir_intrinsic_instr *intr); 116 bool load_barycentric_at_sample(nir_intrinsic_instr *instr); 117 bool load_barycentric_at_offset(nir_intrinsic_instr *instr); 118 bool load_interpolated(RegisterVec4& dest, 119 const InterpolateParams& params, 120 int num_dest_comp, 121 int start_comp); 122 123 bool load_interpolated_one_comp(RegisterVec4& dest, 124 const InterpolateParams& params, 125 EAluOp op); 126 bool load_interpolated_two_comp(RegisterVec4& dest, 127 const InterpolateParams& params, 128 EAluOp op, 129 int writemask); 130 bool load_interpolated_two_comp_for_one(RegisterVec4& dest, 131 const InterpolateParams& params, 132 EAluOp op, 133 int dest_slot); 134 135 std::array<Interpolator, s_max_interpolators> m_interpolator; 136 }; 137 138 } // namespace r600 139 140 #endif 141