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