svga: texture from lod zero inside dynamic branching
[mesa.git] / src / gallium / drivers / svga / svga_tgsi_emit.h
1 /**********************************************************
2 * Copyright 2008-2009 VMware, Inc. All rights reserved.
3 *
4 * Permission is hereby granted, free of charge, to any person
5 * obtaining a copy of this software and associated documentation
6 * files (the "Software"), to deal in the Software without
7 * restriction, including without limitation the rights to use, copy,
8 * modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 *
24 **********************************************************/
25
26 #ifndef SVGA_TGSI_EMIT_H
27 #define SVGA_TGSI_EMIT_H
28
29 #include "tgsi/tgsi_scan.h"
30 #include "svga_hw_reg.h"
31 #include "svga_tgsi.h"
32 #include "svga3d_shaderdefs.h"
33
34 struct src_register
35 {
36 SVGA3dShaderSrcToken base;
37 SVGA3dShaderSrcToken indirect;
38 };
39
40
41 struct svga_arl_consts {
42 int number;
43 int idx;
44 int swizzle;
45 int arl_num;
46 };
47
48 /* Internal functions:
49 */
50
51 struct svga_shader_emitter
52 {
53 boolean use_sm30;
54
55 unsigned size;
56 char *buf;
57 char *ptr;
58
59 union svga_compile_key key;
60 struct tgsi_shader_info info;
61 int unit;
62
63 int imm_start;
64
65 int nr_hw_const;
66 int nr_hw_temp;
67
68 int insn_offset;
69
70 int internal_temp_count;
71 int internal_imm_count;
72
73 int internal_color_idx[2]; /* diffuse, specular */
74 int internal_color_count;
75
76 boolean emitted_vface;
77 boolean emit_frontface;
78 int internal_frontface_idx;
79
80 int ps30_input_count;
81
82 int dynamic_branching_level;
83
84 boolean in_main_func;
85
86 boolean created_zero_immediate;
87 int zero_immediate_idx;
88
89 boolean created_loop_const;
90 int loop_const_idx;
91
92 boolean created_sincos_consts;
93 int sincos_consts_idx;
94
95 unsigned label[32];
96 unsigned nr_labels;
97
98 struct src_register input_map[PIPE_MAX_ATTRIBS];
99 SVGA3dShaderDestToken output_map[PIPE_MAX_ATTRIBS];
100
101 struct src_register imm_0055;
102 SVGA3dShaderDestToken temp_pos;
103 SVGA3dShaderDestToken true_pos;
104
105 SVGA3dShaderDestToken temp_col[PIPE_MAX_COLOR_BUFS];
106 SVGA3dShaderDestToken true_col[PIPE_MAX_COLOR_BUFS];
107
108 SVGA3dShaderDestToken temp_psiz;
109 SVGA3dShaderDestToken true_psiz;
110
111 struct svga_arl_consts arl_consts[12];
112 int num_arl_consts;
113 int current_arl;
114 };
115
116
117 boolean svga_shader_emit_dword( struct svga_shader_emitter *emit,
118 unsigned dword );
119
120 boolean svga_shader_emit_dwords( struct svga_shader_emitter *emit,
121 const unsigned *dwords,
122 unsigned nr );
123
124 boolean svga_shader_emit_opcode( struct svga_shader_emitter *emit,
125 unsigned opcode );
126
127 boolean svga_shader_emit_instructions( struct svga_shader_emitter *emit,
128 const struct tgsi_token *tokens );
129
130 boolean svga_translate_decl_sm20( struct svga_shader_emitter *emit,
131 const struct tgsi_full_declaration *decl );
132
133 boolean svga_translate_decl_sm30( struct svga_shader_emitter *emit,
134 const struct tgsi_full_declaration *decl );
135
136
137 static INLINE boolean emit_dst( struct svga_shader_emitter *emit,
138 SVGA3dShaderDestToken dest )
139 {
140 assert(dest.reserved0);
141 return svga_shader_emit_dword( emit, dest.value );
142 }
143
144 static INLINE boolean emit_src( struct svga_shader_emitter *emit,
145 const struct src_register src )
146 {
147 if (src.base.relAddr) {
148 assert(src.base.reserved0);
149 assert(src.indirect.reserved0);
150 return (svga_shader_emit_dword( emit, src.base.value ) &&
151 svga_shader_emit_dword( emit, src.indirect.value ));
152 }
153 else {
154 assert(src.base.reserved0);
155 return svga_shader_emit_dword( emit, src.base.value );
156 }
157 }
158
159
160 static INLINE boolean emit_instruction( struct svga_shader_emitter *emit,
161 SVGA3dShaderInstToken opcode )
162 {
163 return svga_shader_emit_opcode( emit, opcode.value );
164 }
165
166
167 static INLINE boolean emit_op1( struct svga_shader_emitter *emit,
168 SVGA3dShaderInstToken inst,
169 SVGA3dShaderDestToken dest,
170 struct src_register src0 )
171 {
172 return (emit_instruction( emit, inst ) &&
173 emit_dst( emit, dest ) &&
174 emit_src( emit, src0 ));
175 }
176
177 static INLINE boolean emit_op2( struct svga_shader_emitter *emit,
178 SVGA3dShaderInstToken inst,
179 SVGA3dShaderDestToken dest,
180 struct src_register src0,
181 struct src_register src1 )
182 {
183 return (emit_instruction( emit, inst ) &&
184 emit_dst( emit, dest ) &&
185 emit_src( emit, src0 ) &&
186 emit_src( emit, src1 ));
187 }
188
189 static INLINE boolean emit_op3( struct svga_shader_emitter *emit,
190 SVGA3dShaderInstToken inst,
191 SVGA3dShaderDestToken dest,
192 struct src_register src0,
193 struct src_register src1,
194 struct src_register src2 )
195 {
196 return (emit_instruction( emit, inst ) &&
197 emit_dst( emit, dest ) &&
198 emit_src( emit, src0 ) &&
199 emit_src( emit, src1 ) &&
200 emit_src( emit, src2 ));
201 }
202
203
204 #define TRANSLATE_SWIZZLE(x,y,z,w) ((x) | ((y) << 2) | ((z) << 4) | ((w) << 6))
205 #define SWIZZLE_XYZW \
206 TRANSLATE_SWIZZLE(TGSI_SWIZZLE_X,TGSI_SWIZZLE_Y,TGSI_SWIZZLE_Z,TGSI_SWIZZLE_W)
207 #define SWIZZLE_XXXX \
208 TRANSLATE_SWIZZLE(TGSI_SWIZZLE_X,TGSI_SWIZZLE_X,TGSI_SWIZZLE_X,TGSI_SWIZZLE_X)
209 #define SWIZZLE_YYYY \
210 TRANSLATE_SWIZZLE(TGSI_SWIZZLE_Y,TGSI_SWIZZLE_Y,TGSI_SWIZZLE_Y,TGSI_SWIZZLE_Y)
211 #define SWIZZLE_ZZZZ \
212 TRANSLATE_SWIZZLE(TGSI_SWIZZLE_Z,TGSI_SWIZZLE_Z,TGSI_SWIZZLE_Z,TGSI_SWIZZLE_Z)
213 #define SWIZZLE_WWWW \
214 TRANSLATE_SWIZZLE(TGSI_SWIZZLE_W,TGSI_SWIZZLE_W,TGSI_SWIZZLE_W,TGSI_SWIZZLE_W)
215
216
217
218 static INLINE SVGA3dShaderInstToken
219 inst_token( unsigned opcode )
220 {
221 SVGA3dShaderInstToken inst;
222
223 inst.value = 0;
224 inst.op = opcode;
225
226 return inst;
227 }
228
229 static INLINE SVGA3dShaderDestToken
230 dst_register( unsigned file,
231 int number )
232 {
233 SVGA3dShaderDestToken dest;
234
235 dest.value = 0;
236 dest.num = number;
237 dest.type_upper = file >> 3;
238 dest.relAddr = 0;
239 dest.reserved1 = 0;
240 dest.mask = 0xf;
241 dest.dstMod = 0;
242 dest.shfScale = 0;
243 dest.type_lower = file & 0x7;
244 dest.reserved0 = 1; /* is_reg */
245
246 return dest;
247 }
248
249 static INLINE SVGA3dShaderDestToken
250 writemask( SVGA3dShaderDestToken dest,
251 unsigned mask )
252 {
253 dest.mask &= mask;
254 return dest;
255 }
256
257
258 static INLINE SVGA3dShaderSrcToken
259 src_token( unsigned file, int number )
260 {
261 SVGA3dShaderSrcToken src;
262
263 src.value = 0;
264 src.num = number;
265 src.type_upper = file >> 3;
266 src.relAddr = 0;
267 src.reserved1 = 0;
268 src.swizzle = SWIZZLE_XYZW;
269 src.srcMod = 0;
270 src.type_lower = file & 0x7;
271 src.reserved0 = 1; /* is_reg */
272
273 return src;
274 }
275
276
277 static INLINE struct src_register
278 absolute( struct src_register src )
279 {
280 src.base.srcMod = SVGA3DSRCMOD_ABS;
281
282 return src;
283 }
284
285
286 static INLINE struct src_register
287 negate( struct src_register src )
288 {
289 switch (src.base.srcMod) {
290 case SVGA3DSRCMOD_ABS:
291 src.base.srcMod = SVGA3DSRCMOD_ABSNEG;
292 break;
293 case SVGA3DSRCMOD_ABSNEG:
294 src.base.srcMod = SVGA3DSRCMOD_ABS;
295 break;
296 case SVGA3DSRCMOD_NEG:
297 src.base.srcMod = SVGA3DSRCMOD_NONE;
298 break;
299 case SVGA3DSRCMOD_NONE:
300 src.base.srcMod = SVGA3DSRCMOD_NEG;
301 break;
302 }
303 return src;
304 }
305
306
307 static INLINE struct src_register
308 src_register( unsigned file, int number )
309 {
310 struct src_register src;
311
312 src.base = src_token( file, number );
313 src.indirect.value = 0;
314
315 return src;
316 }
317
318 static INLINE SVGA3dShaderDestToken dst( struct src_register src )
319 {
320 return dst_register( SVGA3dShaderGetRegType( src.base.value ),
321 src.base.num );
322 }
323
324 static INLINE struct src_register src( SVGA3dShaderDestToken dst )
325 {
326 return src_register( SVGA3dShaderGetRegType( dst.value ),
327 dst.num );
328 }
329
330 static INLINE ubyte svga_tgsi_sampler_type( struct svga_shader_emitter *emit,
331 int idx )
332 {
333 switch (emit->key.fkey.tex[idx].texture_target) {
334 case PIPE_TEXTURE_1D:
335 return SVGA3DSAMP_2D;
336 case PIPE_TEXTURE_2D:
337 return SVGA3DSAMP_2D;
338 case PIPE_TEXTURE_3D:
339 return SVGA3DSAMP_VOLUME;
340 case PIPE_TEXTURE_CUBE:
341 return SVGA3DSAMP_CUBE;
342 }
343
344 return SVGA3DSAMP_UNKNOWN;
345 }
346
347 #endif