xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/r600/sfn/sfn_shader_fs.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 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