1 /* -*- mesa-c++  -*-
2  *
3  * Copyright (c) 2018-2019 Collabora LTD
4  *
5  * Author: Gert Wollny <gert.wollny@collabora.com>
6  *
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the "Software"),
9  * to deal in the Software without restriction, including without limitation
10  * on the rights to use, copy, modify, merge, publish, distribute, sub
11  * license, and/or sell copies of the Software, and to permit persons to whom
12  * the Software is furnished to do so, subject to the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the next
15  * paragraph) shall be included in all copies or substantial portions of the
16  * Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24  * USE OR OTHER DEALINGS IN THE SOFTWARE.
25  */
26 
27 #ifndef SFN_INSTRUCTION_FETCH_H
28 #define SFN_INSTRUCTION_FETCH_H
29 
30 #include "sfn_instruction_base.h"
31 
32 namespace r600 {
33 
34 class FetchInstruction : public Instruction {
35 public:
36 
37    FetchInstruction(EVFetchInstr vc_opcode,
38                     EVFetchType fetch_type,
39                     EVTXDataFormat data_format,
40                     EVFetchNumFormat num_format,
41                     EVFetchEndianSwap endian_swap,
42                     const PValue src,
43                     const GPRVector dst,
44                     uint32_t offset,
45                     bool is_mega_fetch,
46                     uint32_t mega_fetch_count,
47                     uint32_t buffer_id,
48                     uint32_t semantic_id,
49 
50                     EBufferIndexMode buffer_index_mode,
51                     bool uncached,
52                     bool indexed,
53                     int array_base,
54                     int array_size,
55                     int elm_size,
56                     PValue buffer_offset,
57                     const std::array<int, 4>& dest_swizzle);
58 
59    FetchInstruction(EVFetchInstr op,
60                     EVFetchType type,
61                     GPRVector dst,
62                     PValue src, int offset,
63                     int buffer_id, PValue buffer_offset,
64                     EBufferIndexMode cp_rel,
65                     bool use_const_field = false);
66 
67    FetchInstruction(GPRVector dst,
68                     PValue src,
69                     int buffer_id,
70                     PValue buffer_offset,
71                     EVTXDataFormat format,
72                     EVFetchNumFormat num_format);
73 
74    FetchInstruction(GPRVector dst,
75                     PValue src,
76                     int buffer_id,
77                     EBufferIndexMode cp_rel);
78 
79    FetchInstruction(GPRVector dst, PValue src, int scratch_size);
80 
81    void replace_values(const ValueSet& candiates, PValue new_value) override;
vc_opcode()82    EVFetchInstr vc_opcode() const { return m_vc_opcode;}
fetch_type()83    EVFetchType fetch_type() const { return m_fetch_type;}
84 
data_format()85    EVTXDataFormat data_format() const { return m_data_format;}
num_format()86    EVFetchNumFormat num_format() const { return m_num_format;}
endian_swap()87    EVFetchEndianSwap endian_swap() const { return m_endian_swap;}
88 
src()89    const Value& src() const { return *m_src;}
dst()90    const GPRVector& dst() const { return m_dst;}
offset()91    uint32_t offset() const { return m_offset;}
92 
is_mega_fetchconst()93    bool is_mega_fetchconst() { return m_is_mega_fetch;}
mega_fetch_count()94    uint32_t mega_fetch_count() const { return m_mega_fetch_count;}
95 
buffer_id()96    uint32_t buffer_id() const { return m_buffer_id;}
semantic_id()97    uint32_t semantic_id() const { return m_semantic_id;}
buffer_index_mode()98    EBufferIndexMode buffer_index_mode() const{ return m_buffer_index_mode;}
99 
is_signed()100    bool is_signed() const { return m_flags.test(vtx_format_comp_signed);}
use_const_fields()101    bool use_const_fields() const { return m_flags.test(vtx_use_const_field);}
102 
srf_mode_no_zero()103    bool srf_mode_no_zero() const { return m_flags.test(vtx_srf_mode);}
104 
set_flag(EVFetchFlagShift flag)105    void set_flag(EVFetchFlagShift flag) {m_flags.set(flag);}
106 
uncached()107    bool uncached() const {return m_uncached; }
indexed()108    bool indexed() const {return m_indexed; }
array_base()109    int array_base()const {return m_array_base; }
array_size()110    int array_size() const {return m_array_size; }
elm_size()111    int elm_size() const {return m_elm_size; }
112 
set_buffer_offset(PValue buffer_offset)113    void set_buffer_offset(PValue buffer_offset) {
114       m_buffer_offset = buffer_offset;
115       add_remappable_src_value(&m_buffer_offset);
116    }
buffer_offset()117    PValue buffer_offset() const { return m_buffer_offset; }
118 
119    void set_dest_swizzle(const std::array<int,4>& swz);
120    void set_format(EVTXDataFormat fmt);
121 
swz(int idx)122    int swz(int idx) const { return m_dest_swizzle[idx];}
123 
use_tc()124    bool use_tc() const {return m_flags.test(vtx_use_tc);}
125 
use_vpm()126    bool use_vpm() const {return m_flags.test(vtx_vpm);}
127 
128    void prelude_append(Instruction *instr);
129 
130    const std::vector<PInstruction>& prelude() const;
131 
has_prelude()132    bool has_prelude() const {return !m_prelude.empty();}
133 
134 private:
135    bool is_equal_to(const Instruction& lhs) const override;
136    void do_print(std::ostream& os) const override;
137 
138    EVFetchInstr m_vc_opcode;
139    EVFetchType m_fetch_type;
140 
141    EVTXDataFormat m_data_format;
142    EVFetchNumFormat m_num_format;
143    EVFetchEndianSwap m_endian_swap;
144 
145    PValue m_src;
146    GPRVector m_dst;
147    uint32_t m_offset;
148 
149    bool m_is_mega_fetch;
150    uint32_t m_mega_fetch_count;
151 
152    uint32_t m_buffer_id;
153    uint32_t m_semantic_id;
154 
155    EBufferIndexMode m_buffer_index_mode;
156    std::bitset<16> m_flags;
157    bool m_uncached;
158    bool m_indexed;
159    int m_array_base;
160    int m_array_size;
161    int m_elm_size;
162    PValue m_buffer_offset;
163    std::array<int, 4> m_dest_swizzle;
164    std::vector<PInstruction> m_prelude;
165 };
166 
167 class LoadFromScratch: public FetchInstruction {
168 public:
169    LoadFromScratch(GPRVector dst, PValue src, int scratch_size);
170 };
171 
172 class FetchGDSOpResult : public FetchInstruction {
173 public:
174    FetchGDSOpResult(const GPRVector dst, const PValue src);
175 };
176 
177 class FetchTCSIOParam : public FetchInstruction {
178 public:
179    FetchTCSIOParam(GPRVector dst, PValue src, int offset);
180 };
181 
182 }
183 
184 #endif // SFN_INSTRUCTION_FETCH_H
185