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
27 #include "pipe/p_shader_tokens.h"
28 #include "tgsi/tgsi_parse.h"
29 #include "util/u_memory.h"
30
31 #include "svga_tgsi_emit.h"
32
33
34 /**
35 * Translate TGSI semantic info into SVGA3d semantic info.
36 * This is called for VS outputs and PS inputs only.
37 */
38 static boolean
translate_vs_ps_semantic(struct svga_shader_emitter * emit,struct tgsi_declaration_semantic semantic,unsigned * usage,unsigned * idx)39 translate_vs_ps_semantic(struct svga_shader_emitter *emit,
40 struct tgsi_declaration_semantic semantic,
41 unsigned *usage,
42 unsigned *idx)
43 {
44 switch (semantic.Name) {
45 case TGSI_SEMANTIC_POSITION:
46 *idx = semantic.Index;
47 *usage = SVGA3D_DECLUSAGE_POSITION;
48 break;
49 case TGSI_SEMANTIC_COLOR:
50 *idx = semantic.Index;
51 *usage = SVGA3D_DECLUSAGE_COLOR;
52 break;
53 case TGSI_SEMANTIC_BCOLOR:
54 *idx = semantic.Index + 2; /* sharing with COLOR */
55 *usage = SVGA3D_DECLUSAGE_COLOR;
56 break;
57 case TGSI_SEMANTIC_FOG:
58 *idx = 0;
59 assert(semantic.Index == 0);
60 *usage = SVGA3D_DECLUSAGE_TEXCOORD;
61 break;
62 case TGSI_SEMANTIC_PSIZE:
63 *idx = semantic.Index;
64 *usage = SVGA3D_DECLUSAGE_PSIZE;
65 break;
66 case TGSI_SEMANTIC_GENERIC:
67 *idx = svga_remap_generic_index(emit->key.generic_remap_table,
68 semantic.Index);
69 *usage = SVGA3D_DECLUSAGE_TEXCOORD;
70 break;
71 case TGSI_SEMANTIC_NORMAL:
72 *idx = semantic.Index;
73 *usage = SVGA3D_DECLUSAGE_NORMAL;
74 break;
75 case TGSI_SEMANTIC_CLIPDIST:
76 case TGSI_SEMANTIC_CLIPVERTEX:
77 /* XXX at this time we don't support clip distance or clip vertices */
78 debug_warn_once("unsupported clip distance/vertex attribute\n");
79 *usage = SVGA3D_DECLUSAGE_TEXCOORD;
80 *idx = 0;
81 return TRUE;
82 default:
83 assert(0);
84 *usage = SVGA3D_DECLUSAGE_TEXCOORD;
85 *idx = 0;
86 return FALSE;
87 }
88
89 return TRUE;
90 }
91
92
93 /**
94 * Emit a PS input (or VS depth/fog output) register declaration.
95 * For example, if usage = SVGA3D_DECLUSAGE_TEXCOORD, reg.num = 1, and
96 * index = 3, we'll emit "dcl_texcoord3 v1".
97 */
98 static boolean
emit_decl(struct svga_shader_emitter * emit,SVGA3dShaderDestToken reg,unsigned usage,unsigned index)99 emit_decl(struct svga_shader_emitter *emit,
100 SVGA3dShaderDestToken reg,
101 unsigned usage,
102 unsigned index)
103 {
104 SVGA3DOpDclArgs dcl;
105 SVGA3dShaderInstToken opcode;
106
107 /* check values against bitfield sizes */
108 assert(index < 16);
109 assert(usage <= SVGA3D_DECLUSAGE_MAX);
110
111 opcode = inst_token( SVGA3DOP_DCL );
112 dcl.values[0] = 0;
113 dcl.values[1] = 0;
114
115 dcl.dst = reg;
116 dcl.usage = usage;
117 dcl.index = index;
118 dcl.values[0] |= 1<<31;
119
120 return (emit_instruction(emit, opcode) &&
121 svga_shader_emit_dwords( emit, dcl.values, ARRAY_SIZE(dcl.values)));
122 }
123
124
125 /**
126 * Emit declaration for PS front/back-face input register.
127 */
128 static boolean
emit_vface_decl(struct svga_shader_emitter * emit)129 emit_vface_decl(struct svga_shader_emitter *emit)
130 {
131 if (!emit->emitted_vface) {
132 SVGA3dShaderDestToken reg =
133 dst_register(SVGA3DREG_MISCTYPE, SVGA3DMISCREG_FACE);
134
135 if (!emit_decl( emit, reg, 0, 0 ))
136 return FALSE;
137
138 emit->emitted_vface = TRUE;
139 }
140 return TRUE;
141 }
142
143
144 /**
145 * Emit PS input register to pass depth/fog coordinates.
146 * Note that this always goes into texcoord[0].
147 */
148 static boolean
ps30_input_emit_depth_fog(struct svga_shader_emitter * emit,struct src_register * out)149 ps30_input_emit_depth_fog( struct svga_shader_emitter *emit,
150 struct src_register *out )
151 {
152 struct src_register reg;
153
154 if (emit->emitted_depth_fog) {
155 *out = emit->ps_depth_fog;
156 return TRUE;
157 }
158
159 if (emit->ps30_input_count >= SVGA3D_INPUTREG_MAX)
160 return FALSE;
161
162 reg = src_register( SVGA3DREG_INPUT,
163 emit->ps30_input_count++ );
164
165 *out = emit->ps_depth_fog = reg;
166
167 emit->emitted_depth_fog = TRUE;
168
169 return emit_decl( emit, dst( reg ), SVGA3D_DECLUSAGE_TEXCOORD, 0 );
170 }
171
172
173 /**
174 * Process a PS input declaration.
175 * We'll emit a declaration like "dcl_texcoord1 v2"
176 */
177 static boolean
ps30_input(struct svga_shader_emitter * emit,struct tgsi_declaration_semantic semantic,unsigned idx)178 ps30_input(struct svga_shader_emitter *emit,
179 struct tgsi_declaration_semantic semantic,
180 unsigned idx)
181 {
182 unsigned usage, index;
183 SVGA3dShaderDestToken reg;
184
185 if (semantic.Name == TGSI_SEMANTIC_POSITION) {
186
187 emit->ps_true_pos = src_register( SVGA3DREG_MISCTYPE,
188 SVGA3DMISCREG_POSITION );
189 emit->ps_true_pos.base.swizzle = TRANSLATE_SWIZZLE( TGSI_SWIZZLE_X,
190 TGSI_SWIZZLE_Y,
191 TGSI_SWIZZLE_Y,
192 TGSI_SWIZZLE_Y );
193 reg = writemask( dst(emit->ps_true_pos),
194 TGSI_WRITEMASK_XY );
195 emit->ps_reads_pos = TRUE;
196
197 if (emit->info.reads_z) {
198 emit->ps_temp_pos = dst_register( SVGA3DREG_TEMP,
199 emit->nr_hw_temp );
200
201 emit->input_map[idx] = src_register( SVGA3DREG_TEMP,
202 emit->nr_hw_temp );
203 emit->nr_hw_temp++;
204
205 if (!ps30_input_emit_depth_fog( emit, &emit->ps_depth_pos ))
206 return FALSE;
207
208 emit->ps_depth_pos.base.swizzle = TRANSLATE_SWIZZLE( TGSI_SWIZZLE_Z,
209 TGSI_SWIZZLE_Z,
210 TGSI_SWIZZLE_Z,
211 TGSI_SWIZZLE_W );
212 }
213 else {
214 emit->input_map[idx] = emit->ps_true_pos;
215 }
216
217 return emit_decl( emit, reg, 0, 0 );
218 }
219 else if (emit->key.fs.light_twoside &&
220 (semantic.Name == TGSI_SEMANTIC_COLOR)) {
221
222 if (!translate_vs_ps_semantic( emit, semantic, &usage, &index ))
223 return FALSE;
224
225 emit->internal_color_idx[emit->internal_color_count] = idx;
226 emit->input_map[idx] = src_register( SVGA3DREG_INPUT, emit->ps30_input_count );
227 emit->ps30_input_count++;
228 emit->internal_color_count++;
229
230 reg = dst( emit->input_map[idx] );
231
232 if (!emit_decl( emit, reg, usage, index ))
233 return FALSE;
234
235 semantic.Name = TGSI_SEMANTIC_BCOLOR;
236 if (!translate_vs_ps_semantic( emit, semantic, &usage, &index ))
237 return FALSE;
238
239 if (emit->ps30_input_count >= SVGA3D_INPUTREG_MAX)
240 return FALSE;
241
242 reg = dst_register( SVGA3DREG_INPUT, emit->ps30_input_count++ );
243
244 if (!emit_decl( emit, reg, usage, index ))
245 return FALSE;
246
247 if (!emit_vface_decl( emit ))
248 return FALSE;
249
250 return TRUE;
251 }
252 else if (semantic.Name == TGSI_SEMANTIC_FACE) {
253 if (!emit_vface_decl( emit ))
254 return FALSE;
255 emit->emit_frontface = TRUE;
256 emit->internal_frontface_idx = idx;
257 return TRUE;
258 }
259 else if (semantic.Name == TGSI_SEMANTIC_FOG) {
260
261 assert(semantic.Index == 0);
262
263 if (!ps30_input_emit_depth_fog( emit, &emit->input_map[idx] ))
264 return FALSE;
265
266 emit->input_map[idx].base.swizzle = TRANSLATE_SWIZZLE( TGSI_SWIZZLE_X,
267 TGSI_SWIZZLE_X,
268 TGSI_SWIZZLE_X,
269 TGSI_SWIZZLE_X );
270
271 return TRUE;
272 }
273 else {
274
275 if (!translate_vs_ps_semantic( emit, semantic, &usage, &index ))
276 return FALSE;
277
278 if (emit->ps30_input_count >= SVGA3D_INPUTREG_MAX)
279 return FALSE;
280
281 emit->input_map[idx] = src_register( SVGA3DREG_INPUT, emit->ps30_input_count++ );
282 reg = dst( emit->input_map[idx] );
283
284 if (!emit_decl( emit, reg, usage, index ))
285 return FALSE;
286
287 if (semantic.Name == TGSI_SEMANTIC_GENERIC &&
288 emit->key.sprite_origin_lower_left &&
289 index >= 1 &&
290 emit->key.tex[index - 1].sprite_texgen) {
291 /* This is a sprite texture coord with lower-left origin.
292 * We need to invert the texture T coordinate since the SVGA3D
293 * device only supports an upper-left origin.
294 */
295 unsigned unit = index - 1;
296
297 emit->inverted_texcoords |= (1 << unit);
298
299 /* save original texcoord reg */
300 emit->ps_true_texcoord[unit] = emit->input_map[idx];
301
302 /* this temp register will be the results of the MAD instruction */
303 emit->ps_inverted_texcoord[unit] =
304 src_register(SVGA3DREG_TEMP, emit->nr_hw_temp);
305 emit->nr_hw_temp++;
306
307 emit->ps_inverted_texcoord_input[unit] = idx;
308
309 /* replace input_map entry with the temp register */
310 emit->input_map[idx] = emit->ps_inverted_texcoord[unit];
311 }
312
313 return TRUE;
314 }
315
316 }
317
318
319 /**
320 * Process a PS output declaration.
321 * Note that we don't actually emit a SVGA3DOpDcl for PS outputs.
322 * \idx register index, such as OUT[2] (not semantic index)
323 */
324 static boolean
ps30_output(struct svga_shader_emitter * emit,struct tgsi_declaration_semantic semantic,unsigned idx)325 ps30_output(struct svga_shader_emitter *emit,
326 struct tgsi_declaration_semantic semantic,
327 unsigned idx)
328 {
329 switch (semantic.Name) {
330 case TGSI_SEMANTIC_COLOR:
331 if (emit->unit == PIPE_SHADER_FRAGMENT) {
332 if (emit->key.fs.white_fragments) {
333 /* Used for XOR logicop mode */
334 emit->output_map[idx] = dst_register( SVGA3DREG_TEMP,
335 emit->nr_hw_temp++ );
336 emit->temp_color_output[idx] = emit->output_map[idx];
337 emit->true_color_output[idx] = dst_register(SVGA3DREG_COLOROUT,
338 semantic.Index);
339 }
340 else if (emit->key.fs.write_color0_to_n_cbufs) {
341 /* We'll write color output [0] to all render targets.
342 * Prepare all the output registers here, but only when the
343 * semantic.Index == 0 so we don't do this more than once.
344 */
345 if (semantic.Index == 0) {
346 unsigned i;
347 for (i = 0; i < emit->key.fs.write_color0_to_n_cbufs; i++) {
348 emit->output_map[idx+i] = dst_register(SVGA3DREG_TEMP,
349 emit->nr_hw_temp++);
350 emit->temp_color_output[i] = emit->output_map[idx+i];
351 emit->true_color_output[i] = dst_register(SVGA3DREG_COLOROUT,
352 i);
353 }
354 }
355 }
356 else {
357 emit->output_map[idx] =
358 dst_register(SVGA3DREG_COLOROUT, semantic.Index);
359 }
360 }
361 else {
362 emit->output_map[idx] = dst_register( SVGA3DREG_COLOROUT,
363 semantic.Index );
364 }
365 break;
366 case TGSI_SEMANTIC_POSITION:
367 emit->output_map[idx] = dst_register( SVGA3DREG_TEMP,
368 emit->nr_hw_temp++ );
369 emit->temp_pos = emit->output_map[idx];
370 emit->true_pos = dst_register( SVGA3DREG_DEPTHOUT,
371 semantic.Index );
372 break;
373 default:
374 assert(0);
375 /* A wild stab in the dark. */
376 emit->output_map[idx] = dst_register( SVGA3DREG_COLOROUT, 0 );
377 break;
378 }
379
380 return TRUE;
381 }
382
383
384 /**
385 * Declare a VS input register.
386 * We still make up the input semantics the same as in 2.0
387 */
388 static boolean
vs30_input(struct svga_shader_emitter * emit,struct tgsi_declaration_semantic semantic,unsigned idx)389 vs30_input(struct svga_shader_emitter *emit,
390 struct tgsi_declaration_semantic semantic,
391 unsigned idx)
392 {
393 SVGA3DOpDclArgs dcl;
394 SVGA3dShaderInstToken opcode;
395 unsigned usage, index;
396
397 opcode = inst_token( SVGA3DOP_DCL );
398 dcl.values[0] = 0;
399 dcl.values[1] = 0;
400
401 emit->input_map[idx] = src_register( SVGA3DREG_INPUT, idx );
402 dcl.dst = dst_register( SVGA3DREG_INPUT, idx );
403
404 assert(dcl.dst.reserved0);
405
406 svga_generate_vdecl_semantics( idx, &usage, &index );
407
408 dcl.usage = usage;
409 dcl.index = index;
410 dcl.values[0] |= 1<<31;
411
412 return (emit_instruction(emit, opcode) &&
413 svga_shader_emit_dwords( emit, dcl.values, ARRAY_SIZE(dcl.values)));
414 }
415
416
417 /**
418 * Declare VS output for holding depth/fog.
419 */
420 static boolean
vs30_output_emit_depth_fog(struct svga_shader_emitter * emit,SVGA3dShaderDestToken * out)421 vs30_output_emit_depth_fog(struct svga_shader_emitter *emit,
422 SVGA3dShaderDestToken *out)
423 {
424 SVGA3dShaderDestToken reg;
425
426 if (emit->emitted_depth_fog) {
427 *out = emit->vs_depth_fog;
428 return TRUE;
429 }
430
431 reg = dst_register( SVGA3DREG_OUTPUT, emit->vs30_output_count++ );
432
433 *out = emit->vs_depth_fog = reg;
434
435 emit->emitted_depth_fog = TRUE;
436
437 return emit_decl( emit, reg, SVGA3D_DECLUSAGE_TEXCOORD, 0 );
438 }
439
440
441 /**
442 * Declare a VS output.
443 * VS3.0 outputs have proper declarations and semantic info for
444 * matching against PS inputs.
445 */
446 static boolean
vs30_output(struct svga_shader_emitter * emit,struct tgsi_declaration_semantic semantic,unsigned idx)447 vs30_output(struct svga_shader_emitter *emit,
448 struct tgsi_declaration_semantic semantic,
449 unsigned idx)
450 {
451 SVGA3DOpDclArgs dcl;
452 SVGA3dShaderInstToken opcode;
453 unsigned usage, index;
454
455 opcode = inst_token( SVGA3DOP_DCL );
456 dcl.values[0] = 0;
457 dcl.values[1] = 0;
458
459 if (!translate_vs_ps_semantic( emit, semantic, &usage, &index ))
460 return FALSE;
461
462 if (emit->vs30_output_count >= SVGA3D_OUTPUTREG_MAX)
463 return FALSE;
464
465 dcl.dst = dst_register( SVGA3DREG_OUTPUT, emit->vs30_output_count++ );
466 dcl.usage = usage;
467 dcl.index = index;
468 dcl.values[0] |= 1<<31;
469
470 if (semantic.Name == TGSI_SEMANTIC_POSITION) {
471 assert(idx == 0);
472 emit->output_map[idx] = dst_register( SVGA3DREG_TEMP,
473 emit->nr_hw_temp++ );
474 emit->temp_pos = emit->output_map[idx];
475 emit->true_pos = dcl.dst;
476
477 /* Grab an extra output for the depth output */
478 if (!vs30_output_emit_depth_fog( emit, &emit->depth_pos ))
479 return FALSE;
480
481 }
482 else if (semantic.Name == TGSI_SEMANTIC_PSIZE) {
483 emit->output_map[idx] = dst_register( SVGA3DREG_TEMP,
484 emit->nr_hw_temp++ );
485 emit->temp_psiz = emit->output_map[idx];
486
487 /* This has the effect of not declaring psiz (below) and not
488 * emitting the final MOV to true_psiz in the postamble.
489 */
490 if (!emit->key.vs.allow_psiz)
491 return TRUE;
492
493 emit->true_psiz = dcl.dst;
494 }
495 else if (semantic.Name == TGSI_SEMANTIC_FOG) {
496 /*
497 * Fog is shared with depth.
498 * So we need to decrement out_count since emit_depth_fog will increment it.
499 */
500 emit->vs30_output_count--;
501
502 if (!vs30_output_emit_depth_fog( emit, &emit->output_map[idx] ))
503 return FALSE;
504
505 return TRUE;
506 }
507 else {
508 emit->output_map[idx] = dcl.dst;
509 }
510
511 return (emit_instruction(emit, opcode) &&
512 svga_shader_emit_dwords( emit, dcl.values, ARRAY_SIZE(dcl.values)));
513 }
514
515
516 /** Translate PIPE_TEXTURE_x to SVGA3DSAMP_x */
517 static ubyte
svga_tgsi_sampler_type(const struct svga_shader_emitter * emit,int idx)518 svga_tgsi_sampler_type(const struct svga_shader_emitter *emit, int idx)
519 {
520 switch (emit->sampler_target[idx]) {
521 case TGSI_TEXTURE_1D:
522 return SVGA3DSAMP_2D;
523 case TGSI_TEXTURE_2D:
524 case TGSI_TEXTURE_RECT:
525 return SVGA3DSAMP_2D;
526 case TGSI_TEXTURE_3D:
527 return SVGA3DSAMP_VOLUME;
528 case TGSI_TEXTURE_CUBE:
529 return SVGA3DSAMP_CUBE;
530 }
531
532 return SVGA3DSAMP_UNKNOWN;
533 }
534
535
536 static boolean
ps30_sampler(struct svga_shader_emitter * emit,unsigned idx)537 ps30_sampler( struct svga_shader_emitter *emit,
538 unsigned idx )
539 {
540 SVGA3DOpDclArgs dcl;
541 SVGA3dShaderInstToken opcode;
542
543 opcode = inst_token( SVGA3DOP_DCL );
544 dcl.values[0] = 0;
545 dcl.values[1] = 0;
546
547 dcl.dst = dst_register( SVGA3DREG_SAMPLER, idx );
548 dcl.type = svga_tgsi_sampler_type( emit, idx );
549 dcl.values[0] |= 1<<31;
550
551 return (emit_instruction(emit, opcode) &&
552 svga_shader_emit_dwords( emit, dcl.values, ARRAY_SIZE(dcl.values)));
553 }
554
555 boolean
svga_shader_emit_samplers_decl(struct svga_shader_emitter * emit)556 svga_shader_emit_samplers_decl( struct svga_shader_emitter *emit )
557 {
558 unsigned i;
559
560 for (i = 0; i < emit->num_samplers; i++) {
561 if (!ps30_sampler(emit, i))
562 return FALSE;
563 }
564 return TRUE;
565 }
566
567 boolean
svga_translate_decl_sm30(struct svga_shader_emitter * emit,const struct tgsi_full_declaration * decl)568 svga_translate_decl_sm30( struct svga_shader_emitter *emit,
569 const struct tgsi_full_declaration *decl )
570 {
571 unsigned first = decl->Range.First;
572 unsigned last = decl->Range.Last;
573 unsigned idx;
574
575 for( idx = first; idx <= last; idx++ ) {
576 boolean ok = TRUE;
577
578 switch (decl->Declaration.File) {
579 case TGSI_FILE_SAMPLER:
580 assert (emit->unit == PIPE_SHADER_FRAGMENT);
581 /* just keep track of the number of samplers here.
582 * Will emit the declaration in the helpers function.
583 */
584 emit->num_samplers = MAX2(emit->num_samplers, decl->Range.Last + 1);
585 break;
586
587 case TGSI_FILE_INPUT:
588 if (emit->unit == PIPE_SHADER_VERTEX)
589 ok = vs30_input( emit, decl->Semantic, idx );
590 else
591 ok = ps30_input( emit, decl->Semantic, idx );
592 break;
593
594 case TGSI_FILE_OUTPUT:
595 if (emit->unit == PIPE_SHADER_VERTEX)
596 ok = vs30_output( emit, decl->Semantic, idx );
597 else
598 ok = ps30_output( emit, decl->Semantic, idx );
599 break;
600
601 case TGSI_FILE_SAMPLER_VIEW:
602 {
603 unsigned unit = decl->Range.First;
604 assert(decl->Range.First == decl->Range.Last);
605 emit->sampler_target[unit] = decl->SamplerView.Resource;
606 }
607 break;
608
609 default:
610 /* don't need to declare other vars */
611 ok = TRUE;
612 }
613
614 if (!ok)
615 return FALSE;
616 }
617
618 return TRUE;
619 }
620