tgsi_util.c revision cdc920a0
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_util.h"
32
33union pointer_hack
34{
35   void *pointer;
36   uint64_t uint64;
37};
38
39void *
40tgsi_align_128bit(
41   void *unaligned )
42{
43   union pointer_hack ph;
44
45   ph.uint64 = 0;
46   ph.pointer = unaligned;
47   ph.uint64 = (ph.uint64 + 15) & ~15;
48   return ph.pointer;
49}
50
51unsigned
52tgsi_util_get_src_register_swizzle(
53   const struct tgsi_src_register *reg,
54   unsigned component )
55{
56   switch( component ) {
57   case 0:
58      return reg->SwizzleX;
59   case 1:
60      return reg->SwizzleY;
61   case 2:
62      return reg->SwizzleZ;
63   case 3:
64      return reg->SwizzleW;
65   default:
66      assert( 0 );
67   }
68   return 0;
69}
70
71
72unsigned
73tgsi_util_get_full_src_register_swizzle(
74   const struct tgsi_full_src_register  *reg,
75   unsigned component )
76{
77   return tgsi_util_get_src_register_swizzle(
78      &reg->Register,
79      component );
80}
81
82void
83tgsi_util_set_src_register_swizzle(
84   struct tgsi_src_register *reg,
85   unsigned swizzle,
86   unsigned component )
87{
88   switch( component ) {
89   case 0:
90      reg->SwizzleX = swizzle;
91      break;
92   case 1:
93      reg->SwizzleY = swizzle;
94      break;
95   case 2:
96      reg->SwizzleZ = swizzle;
97      break;
98   case 3:
99      reg->SwizzleW = swizzle;
100      break;
101   default:
102      assert( 0 );
103   }
104}
105
106unsigned
107tgsi_util_get_full_src_register_sign_mode(
108   const struct  tgsi_full_src_register *reg,
109   unsigned component )
110{
111   unsigned sign_mode;
112
113   if( reg->Register.Absolute ) {
114      /* Consider only the post-abs negation. */
115
116      if( reg->Register.Negate ) {
117         sign_mode = TGSI_UTIL_SIGN_SET;
118      }
119      else {
120         sign_mode = TGSI_UTIL_SIGN_CLEAR;
121      }
122   }
123   else {
124      if( reg->Register.Negate ) {
125         sign_mode = TGSI_UTIL_SIGN_TOGGLE;
126      }
127      else {
128         sign_mode = TGSI_UTIL_SIGN_KEEP;
129      }
130   }
131
132   return sign_mode;
133}
134
135void
136tgsi_util_set_full_src_register_sign_mode(
137   struct tgsi_full_src_register *reg,
138   unsigned sign_mode )
139{
140   switch (sign_mode)
141   {
142   case TGSI_UTIL_SIGN_CLEAR:
143      reg->Register.Negate = 0;
144      reg->Register.Absolute = 1;
145      break;
146
147   case TGSI_UTIL_SIGN_SET:
148      reg->Register.Absolute = 1;
149      reg->Register.Negate = 1;
150      break;
151
152   case TGSI_UTIL_SIGN_TOGGLE:
153      reg->Register.Negate = 1;
154      reg->Register.Absolute = 0;
155      break;
156
157   case TGSI_UTIL_SIGN_KEEP:
158      reg->Register.Negate = 0;
159      reg->Register.Absolute = 0;
160      break;
161
162   default:
163      assert( 0 );
164   }
165}
166