3 * Copyright © 2011-2015 Intel Corporation
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
28 #include "brw_shader.h"
29 #include "brw_context.h"
35 class src_reg
: public backend_reg
38 DECLARE_RALLOC_CXX_OPERATORS(src_reg
)
42 src_reg(enum brw_reg_file file
, int nr
, const glsl_type
*type
);
44 src_reg(struct ::brw_reg reg
);
46 bool equals(const src_reg
&r
) const;
48 src_reg(class vec4_visitor
*v
, const struct glsl_type
*type
);
49 src_reg(class vec4_visitor
*v
, const struct glsl_type
*type
, int size
);
51 explicit src_reg(const dst_reg
®
);
57 retype(src_reg reg
, enum brw_reg_type type
)
64 offset(src_reg reg
, unsigned delta
)
67 (reg
.file
!= ARF
&& reg
.file
!= FIXED_GRF
&& reg
.file
!= IMM
));
68 reg
.reg_offset
+= delta
;
73 * Reswizzle a given source register.
77 swizzle(src_reg reg
, unsigned swizzle
)
80 reg
.ud
= brw_swizzle_immediate(reg
.type
, reg
.ud
, swizzle
);
82 reg
.swizzle
= brw_compose_swizzle(swizzle
, reg
.swizzle
);
90 assert(reg
.file
!= IMM
);
91 reg
.negate
= !reg
.negate
;
96 is_uniform(const src_reg
®
)
98 return (reg
.file
== IMM
|| reg
.file
== UNIFORM
|| reg
.is_null()) &&
99 (!reg
.reladdr
|| is_uniform(*reg
.reladdr
));
102 class dst_reg
: public backend_reg
105 DECLARE_RALLOC_CXX_OPERATORS(dst_reg
)
110 dst_reg(enum brw_reg_file file
, int nr
);
111 dst_reg(enum brw_reg_file file
, int nr
, const glsl_type
*type
,
113 dst_reg(enum brw_reg_file file
, int nr
, brw_reg_type type
,
115 dst_reg(struct ::brw_reg reg
);
116 dst_reg(class vec4_visitor
*v
, const struct glsl_type
*type
);
118 explicit dst_reg(const src_reg
®
);
120 bool equals(const dst_reg
&r
) const;
125 static inline dst_reg
126 retype(dst_reg reg
, enum brw_reg_type type
)
132 static inline dst_reg
133 offset(dst_reg reg
, unsigned delta
)
136 (reg
.file
!= ARF
&& reg
.file
!= FIXED_GRF
&& reg
.file
!= IMM
));
137 reg
.reg_offset
+= delta
;
141 static inline dst_reg
142 writemask(dst_reg reg
, unsigned mask
)
144 assert(reg
.file
!= IMM
);
145 assert((reg
.writemask
& mask
) != 0);
146 reg
.writemask
&= mask
;
150 class vec4_instruction
: public backend_instruction
{
152 DECLARE_RALLOC_CXX_OPERATORS(vec4_instruction
)
154 vec4_instruction(enum opcode opcode
,
155 const dst_reg
&dst
= dst_reg(),
156 const src_reg
&src0
= src_reg(),
157 const src_reg
&src1
= src_reg(),
158 const src_reg
&src2
= src_reg());
163 enum brw_urb_write_flags urb_write_flags
;
165 unsigned sol_binding
; /**< gen6: SOL binding table index */
166 bool sol_final_write
; /**< gen6: send commit message */
167 unsigned sol_vertex
; /**< gen6: used for setting dst index in SVB header */
169 bool is_send_from_grf();
170 unsigned regs_read(unsigned arg
) const;
171 bool can_reswizzle(const struct brw_device_info
*devinfo
, int dst_writemask
,
172 int swizzle
, int swizzle_mask
);
173 void reswizzle(int dst_writemask
, int swizzle
);
174 bool can_do_source_mods(const struct brw_device_info
*devinfo
);
175 bool can_do_writemask(const struct brw_device_info
*devinfo
);
176 bool can_change_types() const;
177 bool has_source_and_destination_hazard() const;
181 return predicate
|| opcode
== VS_OPCODE_UNPACK_FLAGS_SIMD4X2
;
184 bool reads_flag(unsigned c
)
186 if (opcode
== VS_OPCODE_UNPACK_FLAGS_SIMD4X2
)
190 case BRW_PREDICATE_NONE
:
192 case BRW_PREDICATE_ALIGN16_REPLICATE_X
:
194 case BRW_PREDICATE_ALIGN16_REPLICATE_Y
:
196 case BRW_PREDICATE_ALIGN16_REPLICATE_Z
:
198 case BRW_PREDICATE_ALIGN16_REPLICATE_W
:
207 return (conditional_mod
&& (opcode
!= BRW_OPCODE_SEL
&&
208 opcode
!= BRW_OPCODE_IF
&&
209 opcode
!= BRW_OPCODE_WHILE
));
214 * Make the execution of \p inst dependent on the evaluation of a possibly
215 * inverted predicate.
217 inline vec4_instruction
*
218 set_predicate_inv(enum brw_predicate pred
, bool inverse
,
219 vec4_instruction
*inst
)
221 inst
->predicate
= pred
;
222 inst
->predicate_inverse
= inverse
;
227 * Make the execution of \p inst dependent on the evaluation of a predicate.
229 inline vec4_instruction
*
230 set_predicate(enum brw_predicate pred
, vec4_instruction
*inst
)
232 return set_predicate_inv(pred
, false, inst
);
236 * Write the result of evaluating the condition given by \p mod to a flag
239 inline vec4_instruction
*
240 set_condmod(enum brw_conditional_mod mod
, vec4_instruction
*inst
)
242 inst
->conditional_mod
= mod
;
247 * Clamp the result of \p inst to the saturation range of its destination
250 inline vec4_instruction
*
251 set_saturate(bool saturate
, vec4_instruction
*inst
)
253 inst
->saturate
= saturate
;
257 } /* namespace brw */