tgsi_util.c revision 4a49301e
1/**************************************************************************
2 *
3 * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28#include "util/u_debug.h"
29#include "pipe/p_shader_tokens.h"
30#include "tgsi_parse.h"
31#include "tgsi_build.h"
32#include "tgsi_util.h"
33
34union pointer_hack
35{
36   void *pointer;
37   uint64_t uint64;
38};
39
40void *
41tgsi_align_128bit(
42   void *unaligned )
43{
44   union pointer_hack ph;
45
46   ph.uint64 = 0;
47   ph.pointer = unaligned;
48   ph.uint64 = (ph.uint64 + 15) & ~15;
49   return ph.pointer;
50}
51
52unsigned
53tgsi_util_get_src_register_swizzle(
54   const struct tgsi_src_register *reg,
55   unsigned component )
56{
57   switch( component ) {
58   case 0:
59      return reg->SwizzleX;
60   case 1:
61      return reg->SwizzleY;
62   case 2:
63      return reg->SwizzleZ;
64   case 3:
65      return reg->SwizzleW;
66   default:
67      assert( 0 );
68   }
69   return 0;
70}
71
72
73unsigned
74tgsi_util_get_full_src_register_swizzle(
75   const struct tgsi_full_src_register  *reg,
76   unsigned component )
77{
78   return tgsi_util_get_src_register_swizzle(
79      &reg->SrcRegister,
80      component );
81}
82
83void
84tgsi_util_set_src_register_swizzle(
85   struct tgsi_src_register *reg,
86   unsigned swizzle,
87   unsigned component )
88{
89   switch( component ) {
90   case 0:
91      reg->SwizzleX = swizzle;
92      break;
93   case 1:
94      reg->SwizzleY = swizzle;
95      break;
96   case 2:
97      reg->SwizzleZ = swizzle;
98      break;
99   case 3:
100      reg->SwizzleW = swizzle;
101      break;
102   default:
103      assert( 0 );
104   }
105}
106
107unsigned
108tgsi_util_get_full_src_register_sign_mode(
109   const struct  tgsi_full_src_register *reg,
110   unsigned component )
111{
112   unsigned sign_mode;
113
114   if( reg->SrcRegisterExtMod.Absolute ) {
115      /* Consider only the post-abs negation. */
116
117      if( reg->SrcRegisterExtMod.Negate ) {
118         sign_mode = TGSI_UTIL_SIGN_SET;
119      }
120      else {
121         sign_mode = TGSI_UTIL_SIGN_CLEAR;
122      }
123   }
124   else {
125      /* Accumulate the three negations. */
126
127      unsigned negate;
128
129      negate = reg->SrcRegister.Negate;
130
131      if( reg->SrcRegisterExtMod.Negate ) {
132         negate = !negate;
133      }
134
135      if( negate ) {
136         sign_mode = TGSI_UTIL_SIGN_TOGGLE;
137      }
138      else {
139         sign_mode = TGSI_UTIL_SIGN_KEEP;
140      }
141   }
142
143   return sign_mode;
144}
145
146void
147tgsi_util_set_full_src_register_sign_mode(
148   struct tgsi_full_src_register *reg,
149   unsigned sign_mode )
150{
151   switch (sign_mode)
152   {
153   case TGSI_UTIL_SIGN_CLEAR:
154      reg->SrcRegister.Negate = 0;
155      reg->SrcRegisterExtMod.Absolute = 1;
156      reg->SrcRegisterExtMod.Negate = 0;
157      break;
158
159   case TGSI_UTIL_SIGN_SET:
160      reg->SrcRegister.Negate = 0;
161      reg->SrcRegisterExtMod.Absolute = 1;
162      reg->SrcRegisterExtMod.Negate = 1;
163      break;
164
165   case TGSI_UTIL_SIGN_TOGGLE:
166      reg->SrcRegister.Negate = 1;
167      reg->SrcRegisterExtMod.Absolute = 0;
168      reg->SrcRegisterExtMod.Negate = 0;
169      break;
170
171   case TGSI_UTIL_SIGN_KEEP:
172      reg->SrcRegister.Negate = 0;
173      reg->SrcRegisterExtMod.Absolute = 0;
174      reg->SrcRegisterExtMod.Negate = 0;
175      break;
176
177   default:
178      assert( 0 );
179   }
180}
181