Tizen 2.0 Release
[profile/ivi/osmesa.git] / src / mesa / drivers / dri / r300 / compiler / radeon_program_constants.h
1 /*
2  * Copyright (C) 2009 Nicolai Haehnle.
3  *
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining
7  * a 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, sublicense, 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
16  * portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21  * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  */
27
28 #ifndef RADEON_PROGRAM_CONSTANTS_H
29 #define RADEON_PROGRAM_CONSTANTS_H
30
31 typedef enum {
32         RC_SATURATE_NONE = 0,
33         RC_SATURATE_ZERO_ONE,
34         RC_SATURATE_MINUS_PLUS_ONE
35 } rc_saturate_mode;
36
37 typedef enum {
38         RC_TEXTURE_2D_ARRAY,
39         RC_TEXTURE_1D_ARRAY,
40         RC_TEXTURE_CUBE,
41         RC_TEXTURE_3D,
42         RC_TEXTURE_RECT,
43         RC_TEXTURE_2D,
44         RC_TEXTURE_1D
45 } rc_texture_target;
46
47 typedef enum {
48         /**
49          * Used to indicate unused register descriptions and
50          * source register that use a constant swizzle.
51          */
52         RC_FILE_NONE = 0,
53         RC_FILE_TEMPORARY,
54
55         /**
56          * Input register.
57          *
58          * \note The compiler attaches no implicit semantics to input registers.
59          * Fragment/vertex program specific semantics must be defined explicitly
60          * using the appropriate compiler interfaces.
61          */
62         RC_FILE_INPUT,
63
64         /**
65          * Output register.
66          *
67          * \note The compiler attaches no implicit semantics to input registers.
68          * Fragment/vertex program specific semantics must be defined explicitly
69          * using the appropriate compiler interfaces.
70          */
71         RC_FILE_OUTPUT,
72         RC_FILE_ADDRESS,
73
74         /**
75          * Indicates a constant from the \ref rc_constant_list .
76          */
77         RC_FILE_CONSTANT,
78
79         /**
80          * Indicates a special register, see RC_SPECIAL_xxx.
81          */
82         RC_FILE_SPECIAL,
83
84         /**
85          * Indicates this register should use the result of the presubtract
86          * operation.
87          */
88         RC_FILE_PRESUB
89 } rc_register_file;
90
91 enum {
92         /** R500 fragment program ALU result "register" */
93         RC_SPECIAL_ALU_RESULT = 0,
94
95         /** Must be last */
96         RC_NUM_SPECIAL_REGISTERS
97 };
98
99 #define RC_REGISTER_INDEX_BITS 10
100 #define RC_REGISTER_MAX_INDEX (1 << RC_REGISTER_INDEX_BITS)
101
102 typedef enum {
103         RC_SWIZZLE_X = 0,
104         RC_SWIZZLE_Y,
105         RC_SWIZZLE_Z,
106         RC_SWIZZLE_W,
107         RC_SWIZZLE_ZERO,
108         RC_SWIZZLE_ONE,
109         RC_SWIZZLE_HALF,
110         RC_SWIZZLE_UNUSED
111 } rc_swizzle;
112
113 #define RC_MAKE_SWIZZLE(a,b,c,d) (((a)<<0) | ((b)<<3) | ((c)<<6) | ((d)<<9))
114 #define RC_MAKE_SWIZZLE_SMEAR(a) RC_MAKE_SWIZZLE((a),(a),(a),(a))
115 #define GET_SWZ(swz, idx)      (((swz) >> ((idx)*3)) & 0x7)
116 #define GET_BIT(msk, idx)      (((msk) >> (idx)) & 0x1)
117 #define SET_SWZ(swz, idx, newv) \
118         do { \
119                 (swz) = ((swz) & ~(7 << ((idx)*3))) | ((newv) << ((idx)*3)); \
120         } while(0)
121
122 #define RC_SWIZZLE_XYZW RC_MAKE_SWIZZLE(RC_SWIZZLE_X, RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_W)
123 #define RC_SWIZZLE_XYZ0 RC_MAKE_SWIZZLE(RC_SWIZZLE_X, RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_ZERO)
124 #define RC_SWIZZLE_XYZZ RC_MAKE_SWIZZLE(RC_SWIZZLE_X, RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_Z)
125 #define RC_SWIZZLE_XXXX RC_MAKE_SWIZZLE_SMEAR(RC_SWIZZLE_X)
126 #define RC_SWIZZLE_YYYY RC_MAKE_SWIZZLE_SMEAR(RC_SWIZZLE_Y)
127 #define RC_SWIZZLE_ZZZZ RC_MAKE_SWIZZLE_SMEAR(RC_SWIZZLE_Z)
128 #define RC_SWIZZLE_WWWW RC_MAKE_SWIZZLE_SMEAR(RC_SWIZZLE_W)
129 #define RC_SWIZZLE_0000 RC_MAKE_SWIZZLE_SMEAR(RC_SWIZZLE_ZERO)
130 #define RC_SWIZZLE_1111 RC_MAKE_SWIZZLE_SMEAR(RC_SWIZZLE_ONE)
131 #define RC_SWIZZLE_HHHH RC_MAKE_SWIZZLE_SMEAR(RC_SWIZZLE_HALF)
132 #define RC_SWIZZLE_UUUU RC_MAKE_SWIZZLE_SMEAR(RC_SWIZZLE_UNUSED)
133
134 /**
135  * \name Bitmasks for components of vectors.
136  *
137  * Used for write masks, negation masks, etc.
138  */
139 /*@{*/
140 #define RC_MASK_NONE 0
141 #define RC_MASK_X 1
142 #define RC_MASK_Y 2
143 #define RC_MASK_Z 4
144 #define RC_MASK_W 8
145 #define RC_MASK_XY (RC_MASK_X|RC_MASK_Y)
146 #define RC_MASK_XYZ (RC_MASK_X|RC_MASK_Y|RC_MASK_Z)
147 #define RC_MASK_XYW (RC_MASK_X|RC_MASK_Y|RC_MASK_W)
148 #define RC_MASK_XYZW (RC_MASK_X|RC_MASK_Y|RC_MASK_Z|RC_MASK_W)
149 /*@}*/
150
151 typedef enum {
152         RC_ALURESULT_NONE = 0,
153         RC_ALURESULT_X,
154         RC_ALURESULT_W
155 } rc_write_aluresult;
156
157 typedef enum {
158         RC_PRESUB_NONE = 0,
159
160         /** 1 - 2 * src0 */
161         RC_PRESUB_BIAS,
162
163         /** src1 - src0 */
164         RC_PRESUB_SUB,
165
166         /** src1 + src0 */
167         RC_PRESUB_ADD,
168
169         /** 1 - src0 */
170         RC_PRESUB_INV
171 } rc_presubtract_op;
172
173 static inline int rc_presubtract_src_reg_count(rc_presubtract_op op){
174         switch(op){
175         case RC_PRESUB_BIAS:
176         case RC_PRESUB_INV:
177                 return 1;
178         case RC_PRESUB_ADD:
179         case RC_PRESUB_SUB:
180                 return 2;
181         default:
182                 return 0;
183         }
184 }
185
186 #define RC_SOURCE_NONE  0x0
187 #define RC_SOURCE_RGB   0x1
188 #define RC_SOURCE_ALPHA 0x2
189
190 #endif /* RADEON_PROGRAM_CONSTANTS_H */