1 #include "pipe/p_debug.h"
2 #include "pipe/p_util.h"
3 #include "pipe/p_shader_tokens.h"
4 #include "tgsi_parse.h"
5 #include "tgsi_build.h"
11 unsigned long long uint64
;
18 union pointer_hack ph
;
21 ph
.pointer
= unaligned
;
22 ph
.uint64
= (ph
.uint64
+ 15) & ~15;
27 tgsi_util_get_src_register_swizzle(
28 const struct tgsi_src_register
*reg
,
47 tgsi_util_get_src_register_extswizzle(
48 const struct tgsi_src_register_ext_swz
*reg
,
53 return reg
->ExtSwizzleX
;
55 return reg
->ExtSwizzleY
;
57 return reg
->ExtSwizzleZ
;
59 return reg
->ExtSwizzleW
;
67 tgsi_util_get_full_src_register_extswizzle(
68 const struct tgsi_full_src_register
*reg
,
74 * First, calculate the extended swizzle for a given channel. This will give
75 * us either a channel index into the simple swizzle or a constant 1 or 0.
77 swizzle
= tgsi_util_get_src_register_extswizzle(
78 ®
->SrcRegisterExtSwz
,
81 assert (TGSI_SWIZZLE_X
== TGSI_EXTSWIZZLE_X
);
82 assert (TGSI_SWIZZLE_Y
== TGSI_EXTSWIZZLE_Y
);
83 assert (TGSI_SWIZZLE_Z
== TGSI_EXTSWIZZLE_Z
);
84 assert (TGSI_SWIZZLE_W
== TGSI_EXTSWIZZLE_W
);
85 assert (TGSI_EXTSWIZZLE_ZERO
> TGSI_SWIZZLE_W
);
86 assert (TGSI_EXTSWIZZLE_ONE
> TGSI_SWIZZLE_W
);
89 * Second, calculate the simple swizzle for the unswizzled channel index.
90 * Leave the constants intact, they are not affected by the simple swizzle.
92 if( swizzle
<= TGSI_SWIZZLE_W
) {
93 swizzle
= tgsi_util_get_src_register_swizzle(
102 tgsi_util_set_src_register_swizzle(
103 struct tgsi_src_register
*reg
,
107 switch( component
) {
109 reg
->SwizzleX
= swizzle
;
112 reg
->SwizzleY
= swizzle
;
115 reg
->SwizzleZ
= swizzle
;
118 reg
->SwizzleW
= swizzle
;
126 tgsi_util_set_src_register_extswizzle(
127 struct tgsi_src_register_ext_swz
*reg
,
131 switch( component
) {
133 reg
->ExtSwizzleX
= swizzle
;
136 reg
->ExtSwizzleY
= swizzle
;
139 reg
->ExtSwizzleZ
= swizzle
;
142 reg
->ExtSwizzleW
= swizzle
;
150 tgsi_util_get_src_register_extnegate(
151 const struct tgsi_src_register_ext_swz
*reg
,
154 switch( component
) {
170 tgsi_util_set_src_register_extnegate(
171 struct tgsi_src_register_ext_swz
*reg
,
175 switch( component
) {
177 reg
->NegateX
= negate
;
180 reg
->NegateY
= negate
;
183 reg
->NegateZ
= negate
;
186 reg
->NegateW
= negate
;
194 tgsi_util_get_full_src_register_sign_mode(
195 const struct tgsi_full_src_register
*reg
,
200 if( reg
->SrcRegisterExtMod
.Absolute
) {
201 /* Consider only the post-abs negation. */
203 if( reg
->SrcRegisterExtMod
.Negate
) {
204 sign_mode
= TGSI_UTIL_SIGN_SET
;
207 sign_mode
= TGSI_UTIL_SIGN_CLEAR
;
211 /* Accumulate the three negations. */
215 negate
= reg
->SrcRegister
.Negate
;
216 if( tgsi_util_get_src_register_extnegate( ®
->SrcRegisterExtSwz
, component
) ) {
219 if( reg
->SrcRegisterExtMod
.Negate
) {
224 sign_mode
= TGSI_UTIL_SIGN_TOGGLE
;
227 sign_mode
= TGSI_UTIL_SIGN_KEEP
;
235 tgsi_util_set_full_src_register_sign_mode(
236 struct tgsi_full_src_register
*reg
,
239 reg
->SrcRegisterExtSwz
.NegateX
= 0;
240 reg
->SrcRegisterExtSwz
.NegateY
= 0;
241 reg
->SrcRegisterExtSwz
.NegateZ
= 0;
242 reg
->SrcRegisterExtSwz
.NegateW
= 0;
246 case TGSI_UTIL_SIGN_CLEAR
:
247 reg
->SrcRegister
.Negate
= 0;
248 reg
->SrcRegisterExtMod
.Absolute
= 1;
249 reg
->SrcRegisterExtMod
.Negate
= 0;
252 case TGSI_UTIL_SIGN_SET
:
253 reg
->SrcRegister
.Negate
= 0;
254 reg
->SrcRegisterExtMod
.Absolute
= 1;
255 reg
->SrcRegisterExtMod
.Negate
= 1;
258 case TGSI_UTIL_SIGN_TOGGLE
:
259 reg
->SrcRegister
.Negate
= 1;
260 reg
->SrcRegisterExtMod
.Absolute
= 0;
261 reg
->SrcRegisterExtMod
.Negate
= 0;
264 case TGSI_UTIL_SIGN_KEEP
:
265 reg
->SrcRegister
.Negate
= 0;
266 reg
->SrcRegisterExtMod
.Absolute
= 0;
267 reg
->SrcRegisterExtMod
.Negate
= 0;