xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/r600/sfn/sfn_instr_fetch.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 INSTR_FETCH_H
8 #define INSTR_FETCH_H
9 
10 #include "sfn_instr.h"
11 
12 namespace r600 {
13 
14 class ValueFactory;
15 
16 class FetchInstr : public InstrWithVectorResult {
17 public:
18    enum EFlags {
19       fetch_whole_quad,
20       use_const_field,
21       format_comp_signed,
22       srf_mode,
23       buf_no_stride,
24       alt_const,
25       use_tc,
26       vpm,
27       is_mega_fetch,
28       uncached,
29       indexed,
30       wait_ack,
31       unknown
32    };
33 
34    enum EPrintSkip {
35       fmt,
36       ftype,
37       mfc,
38       count
39    };
40 
41    FetchInstr(EVFetchInstr opcode,
42               const RegisterVec4& dst,
43               const RegisterVec4::Swizzle& dest_swizzle,
44               PRegister src,
45               uint32_t src_offset,
46               EVFetchType fetch_type,
47               EVTXDataFormat data_format,
48               EVFetchNumFormat num_format,
49               EVFetchEndianSwap endian_swap,
50               uint32_t resource_id,
51               PRegister resource_offset);
52 
53    void accept(ConstInstrVisitor& visitor) const override;
54    void accept(InstrVisitor& visitor) override;
55 
set_src(PRegister src)56    void set_src(PRegister src) { m_src = src; }
src()57    const auto& src() const
58    {
59       assert(m_src);
60       return *m_src;
61    }
src_offset()62    uint32_t src_offset() const { return m_src_offset; }
63 
fetch_type()64    EVFetchType fetch_type() const { return m_fetch_type; }
data_format()65    EVTXDataFormat data_format() const { return m_data_format; }
set_num_format(EVFetchNumFormat nf)66    void set_num_format(EVFetchNumFormat nf) { m_num_format = nf; }
num_format()67    EVFetchNumFormat num_format() const { return m_num_format; }
endian_swap()68    EVFetchEndianSwap endian_swap() const { return m_endian_swap; }
69 
mega_fetch_count()70    uint32_t mega_fetch_count() const { return m_mega_fetch_count; }
array_base()71    uint32_t array_base() const { return m_array_base; }
array_size()72    uint32_t array_size() const { return m_array_size; }
elm_size()73    uint32_t elm_size() const { return m_elm_size; }
74 
reset_fetch_flag(EFlags flag)75    void reset_fetch_flag(EFlags flag) { m_tex_flags.reset(flag); }
set_fetch_flag(EFlags flag)76    void set_fetch_flag(EFlags flag) { m_tex_flags.set(flag); }
has_fetch_flag(EFlags flag)77    bool has_fetch_flag(EFlags flag) const { return m_tex_flags.test(flag); }
78 
opcode()79    EVFetchInstr opcode() const { return m_opcode; }
80 
81    bool is_equal_to(const FetchInstr& rhs) const;
82 
83    static Instr::Pointer from_string(std::istream& is, ValueFactory& vf);
84 
set_mfc(int mfc)85    void set_mfc(int mfc)
86    {
87       m_tex_flags.set(is_mega_fetch);
88       m_mega_fetch_count = mfc;
89    }
set_array_base(int arrb)90    void set_array_base(int arrb) { m_array_base = arrb; }
set_array_size(int arrs)91    void set_array_size(int arrs) { m_array_size = arrs; }
92 
set_element_size(int size)93    void set_element_size(int size) { m_elm_size = size; }
set_print_skip(EPrintSkip skip)94    void set_print_skip(EPrintSkip skip) { m_skip_print.set(skip); }
slots()95    uint32_t slots() const override { return 1; };
96 
97    bool replace_source(PRegister old_src, PVirtualValue new_src) override;
98 
99 protected:
100    static Instr::Pointer
101    from_string_impl(std::istream& is, EVFetchInstr opcode, ValueFactory& vf);
102 
override_opname(const char * opname)103    void override_opname(const char *opname) { m_opname = opname; }
104 
105 private:
106    bool do_ready() const override;
107 
108    void do_print(std::ostream& os) const override;
109 
110    void set_param_from_string(const std::string& next_token);
111    void set_flag_from_string(const std::string& next_token);
112 
113    static const std::map<EVTXDataFormat, const char *> s_data_format_map;
114    static const std::map<const char *, EFlags> s_flag_map;
115 
116    bool propagate_death() override;
117 
118    EVFetchInstr m_opcode;
119 
120    PRegister m_src;
121    uint32_t m_src_offset;
122 
123    EVFetchType m_fetch_type;
124    EVTXDataFormat m_data_format;
125    EVFetchNumFormat m_num_format;
126    EVFetchEndianSwap m_endian_swap;
127 
128    std::bitset<EFlags::unknown> m_tex_flags;
129    std::bitset<EPrintSkip::count> m_skip_print;
130 
131    uint32_t m_mega_fetch_count;
132    uint32_t m_array_base;
133    uint32_t m_array_size;
134    uint32_t m_elm_size;
135 
136    std::string m_opname;
137 };
138 
139 class QueryBufferSizeInstr : public FetchInstr {
140 public:
141    QueryBufferSizeInstr(const RegisterVec4& dst,
142                         const RegisterVec4::Swizzle& swizzle,
143                         uint32_t resid);
144    static Instr::Pointer from_string(std::istream& is, ValueFactory& vf);
145 };
146 
147 class LoadFromBuffer : public FetchInstr {
148 public:
149    LoadFromBuffer(const RegisterVec4& dst,
150                   const RegisterVec4::Swizzle& swizzle,
151                   PRegister addr,
152                   uint32_t addr_offset,
153                   uint32_t resid,
154                   PRegister res_offset,
155                   EVTXDataFormat data_format);
156    static Instr::Pointer from_string(std::istream& is, ValueFactory& vf);
157 };
158 
159 class LoadFromScratch : public FetchInstr {
160 public:
161    LoadFromScratch(const RegisterVec4& dst,
162                    const RegisterVec4::Swizzle& swizzle,
163                    PVirtualValue addr,
164                    uint32_t offset);
165    static Instr::Pointer from_string(std::istream& is, ValueFactory& vf);
166 };
167 
168 } // namespace r600
169 #endif // INSTR_FETCH_H
170