1 #include "pipe/p_util.h"
2 #include "pipe/p_shader_tokens.h"
3 #include "tgsi_parse.h"
4 #include "tgsi_build.h"
10 unsigned long long uint64
;
17 union pointer_hack ph
;
20 ph
.pointer
= unaligned
;
21 ph
.uint64
= (ph
.uint64
+ 15) & ~15;
26 tgsi_util_get_src_register_swizzle(
27 const struct tgsi_src_register
*reg
,
46 tgsi_util_get_src_register_extswizzle(
47 const struct tgsi_src_register_ext_swz
*reg
,
52 return reg
->ExtSwizzleX
;
54 return reg
->ExtSwizzleY
;
56 return reg
->ExtSwizzleZ
;
58 return reg
->ExtSwizzleW
;
66 tgsi_util_get_full_src_register_extswizzle(
67 const struct tgsi_full_src_register
*reg
,
73 * First, calculate the extended swizzle for a given channel. This will give
74 * us either a channel index into the simple swizzle or a constant 1 or 0.
76 swizzle
= tgsi_util_get_src_register_extswizzle(
77 ®
->SrcRegisterExtSwz
,
80 assert (TGSI_SWIZZLE_X
== TGSI_EXTSWIZZLE_X
);
81 assert (TGSI_SWIZZLE_Y
== TGSI_EXTSWIZZLE_Y
);
82 assert (TGSI_SWIZZLE_Z
== TGSI_EXTSWIZZLE_Z
);
83 assert (TGSI_SWIZZLE_W
== TGSI_EXTSWIZZLE_W
);
84 assert (TGSI_EXTSWIZZLE_ZERO
> TGSI_SWIZZLE_W
);
85 assert (TGSI_EXTSWIZZLE_ONE
> TGSI_SWIZZLE_W
);
88 * Second, calculate the simple swizzle for the unswizzled channel index.
89 * Leave the constants intact, they are not affected by the simple swizzle.
91 if( swizzle
<= TGSI_SWIZZLE_W
) {
92 swizzle
= tgsi_util_get_src_register_swizzle(
101 tgsi_util_set_src_register_swizzle(
102 struct tgsi_src_register
*reg
,
106 switch( component
) {
108 reg
->SwizzleX
= swizzle
;
111 reg
->SwizzleY
= swizzle
;
114 reg
->SwizzleZ
= swizzle
;
117 reg
->SwizzleW
= swizzle
;
125 tgsi_util_set_src_register_extswizzle(
126 struct tgsi_src_register_ext_swz
*reg
,
130 switch( component
) {
132 reg
->ExtSwizzleX
= swizzle
;
135 reg
->ExtSwizzleY
= swizzle
;
138 reg
->ExtSwizzleZ
= swizzle
;
141 reg
->ExtSwizzleW
= swizzle
;
149 tgsi_util_get_src_register_extnegate(
150 const struct tgsi_src_register_ext_swz
*reg
,
153 switch( component
) {
169 tgsi_util_set_src_register_extnegate(
170 struct tgsi_src_register_ext_swz
*reg
,
174 switch( component
) {
176 reg
->NegateX
= negate
;
179 reg
->NegateY
= negate
;
182 reg
->NegateZ
= negate
;
185 reg
->NegateW
= negate
;
193 tgsi_util_get_full_src_register_sign_mode(
194 const struct tgsi_full_src_register
*reg
,
199 if( reg
->SrcRegisterExtMod
.Absolute
) {
200 /* Consider only the post-abs negation. */
202 if( reg
->SrcRegisterExtMod
.Negate
) {
203 sign_mode
= TGSI_UTIL_SIGN_SET
;
206 sign_mode
= TGSI_UTIL_SIGN_CLEAR
;
210 /* Accumulate the three negations. */
214 negate
= reg
->SrcRegister
.Negate
;
215 if( tgsi_util_get_src_register_extnegate( ®
->SrcRegisterExtSwz
, component
) ) {
218 if( reg
->SrcRegisterExtMod
.Negate
) {
223 sign_mode
= TGSI_UTIL_SIGN_TOGGLE
;
226 sign_mode
= TGSI_UTIL_SIGN_KEEP
;
234 tgsi_util_set_full_src_register_sign_mode(
235 struct tgsi_full_src_register
*reg
,
238 reg
->SrcRegisterExtSwz
.NegateX
= 0;
239 reg
->SrcRegisterExtSwz
.NegateY
= 0;
240 reg
->SrcRegisterExtSwz
.NegateZ
= 0;
241 reg
->SrcRegisterExtSwz
.NegateW
= 0;
245 case TGSI_UTIL_SIGN_CLEAR
:
246 reg
->SrcRegister
.Negate
= 0;
247 reg
->SrcRegisterExtMod
.Absolute
= 1;
248 reg
->SrcRegisterExtMod
.Negate
= 0;
251 case TGSI_UTIL_SIGN_SET
:
252 reg
->SrcRegister
.Negate
= 0;
253 reg
->SrcRegisterExtMod
.Absolute
= 1;
254 reg
->SrcRegisterExtMod
.Negate
= 1;
257 case TGSI_UTIL_SIGN_TOGGLE
:
258 reg
->SrcRegister
.Negate
= 1;
259 reg
->SrcRegisterExtMod
.Absolute
= 0;
260 reg
->SrcRegisterExtMod
.Negate
= 0;
263 case TGSI_UTIL_SIGN_KEEP
:
264 reg
->SrcRegister
.Negate
= 0;
265 reg
->SrcRegisterExtMod
.Absolute
= 0;
266 reg
->SrcRegisterExtMod
.Negate
= 0;