Drop GLcontext typedef and use struct gl_context instead
[mesa.git] / src / mesa / state_tracker / st_program.c
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 * Authors:
29 * Keith Whitwell <keith@tungstengraphics.com>
30 * Brian Paul
31 */
32
33
34 #include "main/imports.h"
35 #include "main/mtypes.h"
36 #include "program/prog_print.h"
37 #include "program/programopt.h"
38
39 #include "pipe/p_context.h"
40 #include "pipe/p_defines.h"
41 #include "pipe/p_shader_tokens.h"
42 #include "draw/draw_context.h"
43 #include "tgsi/tgsi_dump.h"
44 #include "tgsi/tgsi_ureg.h"
45
46 #include "st_debug.h"
47 #include "st_context.h"
48 #include "st_program.h"
49 #include "st_mesa_to_tgsi.h"
50 #include "cso_cache/cso_context.h"
51
52
53
54 /**
55 * Clean out any old compilations:
56 */
57 void
58 st_vp_release_varients( struct st_context *st,
59 struct st_vertex_program *stvp )
60 {
61 struct st_vp_varient *vpv;
62
63 for (vpv = stvp->varients; vpv; ) {
64 struct st_vp_varient *next = vpv->next;
65
66 if (vpv->driver_shader)
67 cso_delete_vertex_shader(st->cso_context, vpv->driver_shader);
68
69 #if FEATURE_feedback || FEATURE_rastpos
70 if (vpv->draw_shader)
71 draw_delete_vertex_shader( st->draw, vpv->draw_shader );
72 #endif
73
74 if (vpv->tgsi.tokens)
75 st_free_tokens(vpv->tgsi.tokens);
76
77 FREE( vpv );
78
79 vpv = next;
80 }
81
82 stvp->varients = NULL;
83 }
84
85
86
87
88 /**
89 * Translate a Mesa vertex shader into a TGSI shader.
90 * \param outputMapping to map vertex program output registers (VERT_RESULT_x)
91 * to TGSI output slots
92 * \param tokensOut destination for TGSI tokens
93 * \return pointer to cached pipe_shader object.
94 */
95 void
96 st_prepare_vertex_program(struct st_context *st,
97 struct st_vertex_program *stvp)
98 {
99 GLuint attr;
100
101 stvp->num_inputs = 0;
102 stvp->num_outputs = 0;
103
104 if (stvp->Base.IsPositionInvariant)
105 _mesa_insert_mvp_code(st->ctx, &stvp->Base);
106
107 assert(stvp->Base.Base.NumInstructions > 1);
108
109 /*
110 * Determine number of inputs, the mappings between VERT_ATTRIB_x
111 * and TGSI generic input indexes, plus input attrib semantic info.
112 */
113 for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
114 if (stvp->Base.Base.InputsRead & (1 << attr)) {
115 stvp->input_to_index[attr] = stvp->num_inputs;
116 stvp->index_to_input[stvp->num_inputs] = attr;
117 stvp->num_inputs++;
118 }
119 }
120 /* bit of a hack, presetup potentially unused edgeflag input */
121 stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs;
122 stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG;
123
124 /* Compute mapping of vertex program outputs to slots.
125 */
126 for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
127 if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) {
128 stvp->result_to_output[attr] = ~0;
129 }
130 else {
131 unsigned slot = stvp->num_outputs++;
132
133 stvp->result_to_output[attr] = slot;
134
135 switch (attr) {
136 case VERT_RESULT_HPOS:
137 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
138 stvp->output_semantic_index[slot] = 0;
139 break;
140 case VERT_RESULT_COL0:
141 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
142 stvp->output_semantic_index[slot] = 0;
143 break;
144 case VERT_RESULT_COL1:
145 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
146 stvp->output_semantic_index[slot] = 1;
147 break;
148 case VERT_RESULT_BFC0:
149 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
150 stvp->output_semantic_index[slot] = 0;
151 break;
152 case VERT_RESULT_BFC1:
153 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
154 stvp->output_semantic_index[slot] = 1;
155 break;
156 case VERT_RESULT_FOGC:
157 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
158 stvp->output_semantic_index[slot] = 0;
159 break;
160 case VERT_RESULT_PSIZ:
161 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
162 stvp->output_semantic_index[slot] = 0;
163 break;
164 case VERT_RESULT_EDGE:
165 assert(0);
166 break;
167
168 case VERT_RESULT_TEX0:
169 case VERT_RESULT_TEX1:
170 case VERT_RESULT_TEX2:
171 case VERT_RESULT_TEX3:
172 case VERT_RESULT_TEX4:
173 case VERT_RESULT_TEX5:
174 case VERT_RESULT_TEX6:
175 case VERT_RESULT_TEX7:
176 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
177 stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
178 break;
179
180 case VERT_RESULT_VAR0:
181 default:
182 assert(attr < VERT_RESULT_MAX);
183 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
184 stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 -
185 FRAG_ATTRIB_TEX0 +
186 attr -
187 VERT_RESULT_VAR0);
188 break;
189 }
190 }
191 }
192 /* similar hack to above, presetup potentially unused edgeflag output */
193 stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs;
194 stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG;
195 stvp->output_semantic_index[stvp->num_outputs] = 0;
196 }
197
198
199 struct st_vp_varient *
200 st_translate_vertex_program(struct st_context *st,
201 struct st_vertex_program *stvp,
202 const struct st_vp_varient_key *key)
203 {
204 struct st_vp_varient *vpv = CALLOC_STRUCT(st_vp_varient);
205 struct pipe_context *pipe = st->pipe;
206 struct ureg_program *ureg;
207 enum pipe_error error;
208 unsigned num_outputs;
209
210 _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT);
211 _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING);
212
213 ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
214 if (ureg == NULL) {
215 FREE(vpv);
216 return NULL;
217 }
218
219 vpv->num_inputs = stvp->num_inputs;
220 num_outputs = stvp->num_outputs;
221 if (key->passthrough_edgeflags) {
222 vpv->num_inputs++;
223 num_outputs++;
224 }
225
226 if (ST_DEBUG & DEBUG_MESA) {
227 _mesa_print_program(&stvp->Base.Base);
228 _mesa_print_program_parameters(st->ctx, &stvp->Base.Base);
229 debug_printf("\n");
230 }
231
232 error =
233 st_translate_mesa_program(st->ctx,
234 TGSI_PROCESSOR_VERTEX,
235 ureg,
236 &stvp->Base.Base,
237 /* inputs */
238 vpv->num_inputs,
239 stvp->input_to_index,
240 NULL, /* input semantic name */
241 NULL, /* input semantic index */
242 NULL,
243 /* outputs */
244 num_outputs,
245 stvp->result_to_output,
246 stvp->output_semantic_name,
247 stvp->output_semantic_index,
248 key->passthrough_edgeflags );
249
250 if (error)
251 goto fail;
252
253 vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL );
254 if (!vpv->tgsi.tokens)
255 goto fail;
256
257 ureg_destroy( ureg );
258
259 vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
260
261 if (ST_DEBUG & DEBUG_TGSI) {
262 tgsi_dump( vpv->tgsi.tokens, 0 );
263 debug_printf("\n");
264 }
265
266 return vpv;
267
268 fail:
269 debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);
270 _mesa_print_program(&stvp->Base.Base);
271 debug_assert(0);
272
273 ureg_destroy( ureg );
274 return NULL;
275 }
276
277
278
279 /**
280 * Translate a Mesa fragment shader into a TGSI shader.
281 * \return pointer to cached pipe_shader object.
282 */
283 void
284 st_translate_fragment_program(struct st_context *st,
285 struct st_fragment_program *stfp )
286 {
287 struct pipe_context *pipe = st->pipe;
288 GLuint outputMapping[FRAG_RESULT_MAX];
289 GLuint inputMapping[FRAG_ATTRIB_MAX];
290 GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */
291 GLuint attr;
292 enum pipe_error error;
293 const GLbitfield inputsRead = stfp->Base.Base.InputsRead;
294 struct ureg_program *ureg;
295
296 ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
297 ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
298 uint fs_num_inputs = 0;
299
300 ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
301 ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
302 uint fs_num_outputs = 0;
303
304 _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
305
306 /*
307 * Convert Mesa program inputs to TGSI input register semantics.
308 */
309 for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
310 if (inputsRead & (1 << attr)) {
311 const GLuint slot = fs_num_inputs++;
312
313 inputMapping[attr] = slot;
314
315 switch (attr) {
316 case FRAG_ATTRIB_WPOS:
317 input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
318 input_semantic_index[slot] = 0;
319 interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
320 break;
321 case FRAG_ATTRIB_COL0:
322 input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
323 input_semantic_index[slot] = 0;
324 interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
325 break;
326 case FRAG_ATTRIB_COL1:
327 input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
328 input_semantic_index[slot] = 1;
329 interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
330 break;
331 case FRAG_ATTRIB_FOGC:
332 input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
333 input_semantic_index[slot] = 0;
334 interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
335 break;
336 case FRAG_ATTRIB_FACE:
337 input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
338 input_semantic_index[slot] = 0;
339 interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
340 break;
341 /* In most cases, there is nothing special about these
342 * inputs, so adopt a convention to use the generic
343 * semantic name and the mesa FRAG_ATTRIB_ number as the
344 * index.
345 *
346 * All that is required is that the vertex shader labels
347 * its own outputs similarly, and that the vertex shader
348 * generates at least every output required by the
349 * fragment shader plus fixed-function hardware (such as
350 * BFC).
351 *
352 * There is no requirement that semantic indexes start at
353 * zero or be restricted to a particular range -- nobody
354 * should be building tables based on semantic index.
355 */
356 case FRAG_ATTRIB_PNTC:
357 case FRAG_ATTRIB_TEX0:
358 case FRAG_ATTRIB_TEX1:
359 case FRAG_ATTRIB_TEX2:
360 case FRAG_ATTRIB_TEX3:
361 case FRAG_ATTRIB_TEX4:
362 case FRAG_ATTRIB_TEX5:
363 case FRAG_ATTRIB_TEX6:
364 case FRAG_ATTRIB_TEX7:
365 case FRAG_ATTRIB_VAR0:
366 default:
367 /* Actually, let's try and zero-base this just for
368 * readability of the generated TGSI.
369 */
370 assert(attr >= FRAG_ATTRIB_TEX0);
371 input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
372 input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
373 if (attr == FRAG_ATTRIB_PNTC)
374 interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
375 else
376 interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
377 break;
378 }
379 }
380 else {
381 inputMapping[attr] = -1;
382 }
383 }
384
385 /*
386 * Semantics and mapping for outputs
387 */
388 {
389 uint numColors = 0;
390 GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
391
392 /* if z is written, emit that first */
393 if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
394 fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
395 fs_output_semantic_index[fs_num_outputs] = 0;
396 outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
397 fs_num_outputs++;
398 outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
399 }
400
401 if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
402 fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
403 fs_output_semantic_index[fs_num_outputs] = 0;
404 outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
405 fs_num_outputs++;
406 outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
407 }
408
409 /* handle remaning outputs (color) */
410 for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
411 if (outputsWritten & BITFIELD64_BIT(attr)) {
412 switch (attr) {
413 case FRAG_RESULT_DEPTH:
414 case FRAG_RESULT_STENCIL:
415 /* handled above */
416 assert(0);
417 break;
418 default:
419 assert(attr == FRAG_RESULT_COLOR ||
420 (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
421 fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
422 fs_output_semantic_index[fs_num_outputs] = numColors;
423 outputMapping[attr] = fs_num_outputs;
424 numColors++;
425 break;
426 }
427
428 fs_num_outputs++;
429 }
430 }
431 }
432
433 ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
434 if (ureg == NULL)
435 return;
436
437 if (ST_DEBUG & DEBUG_MESA) {
438 _mesa_print_program(&stfp->Base.Base);
439 _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
440 debug_printf("\n");
441 }
442
443 error =
444 st_translate_mesa_program(st->ctx,
445 TGSI_PROCESSOR_FRAGMENT,
446 ureg,
447 &stfp->Base.Base,
448 /* inputs */
449 fs_num_inputs,
450 inputMapping,
451 input_semantic_name,
452 input_semantic_index,
453 interpMode,
454 /* outputs */
455 fs_num_outputs,
456 outputMapping,
457 fs_output_semantic_name,
458 fs_output_semantic_index, FALSE );
459
460 stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
461 ureg_destroy( ureg );
462 stfp->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi);
463
464 if (ST_DEBUG & DEBUG_TGSI) {
465 tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
466 debug_printf("\n");
467 }
468 }
469
470 void
471 st_translate_geometry_program(struct st_context *st,
472 struct st_geometry_program *stgp)
473 {
474 GLuint inputMapping[GEOM_ATTRIB_MAX];
475 GLuint outputMapping[GEOM_RESULT_MAX];
476 struct pipe_context *pipe = st->pipe;
477 enum pipe_error error;
478 GLuint attr;
479 const GLbitfield inputsRead = stgp->Base.Base.InputsRead;
480 GLuint vslot = 0;
481 GLuint num_generic = 0;
482
483 uint gs_num_inputs = 0;
484 uint gs_builtin_inputs = 0;
485 uint gs_array_offset = 0;
486
487 ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
488 ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
489 uint gs_num_outputs = 0;
490
491 GLint i;
492 GLuint maxSlot = 0;
493 struct ureg_program *ureg;
494
495 _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT);
496 _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING);
497
498 ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY );
499 if (ureg == NULL) {
500 return;
501 }
502
503 /* which vertex output goes to the first geometry input */
504 vslot = 0;
505
506 memset(inputMapping, 0, sizeof(inputMapping));
507 memset(outputMapping, 0, sizeof(outputMapping));
508
509 /*
510 * Convert Mesa program inputs to TGSI input register semantics.
511 */
512 for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) {
513 if (inputsRead & (1 << attr)) {
514 const GLuint slot = gs_num_inputs;
515
516 gs_num_inputs++;
517
518 inputMapping[attr] = slot;
519
520 stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs;
521 stgp->input_to_index[attr] = vslot;
522 stgp->index_to_input[vslot] = attr;
523 ++vslot;
524
525 if (attr != GEOM_ATTRIB_PRIMITIVE_ID) {
526 gs_array_offset += 2;
527 } else
528 ++gs_builtin_inputs;
529
530 #if 1
531 debug_printf("input map at %d = %d\n",
532 slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]);
533 #endif
534
535 switch (attr) {
536 case GEOM_ATTRIB_PRIMITIVE_ID:
537 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID;
538 stgp->input_semantic_index[slot] = 0;
539 break;
540 case GEOM_ATTRIB_POSITION:
541 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
542 stgp->input_semantic_index[slot] = 0;
543 break;
544 case GEOM_ATTRIB_COLOR0:
545 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
546 stgp->input_semantic_index[slot] = 0;
547 break;
548 case GEOM_ATTRIB_COLOR1:
549 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
550 stgp->input_semantic_index[slot] = 1;
551 break;
552 case GEOM_ATTRIB_FOG_FRAG_COORD:
553 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
554 stgp->input_semantic_index[slot] = 0;
555 break;
556 case GEOM_ATTRIB_TEX_COORD:
557 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
558 stgp->input_semantic_index[slot] = num_generic++;
559 break;
560 case GEOM_ATTRIB_VAR0:
561 /* fall-through */
562 default:
563 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
564 stgp->input_semantic_index[slot] = num_generic++;
565 }
566 }
567 }
568
569 /* initialize output semantics to defaults */
570 for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
571 gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
572 gs_output_semantic_index[i] = 0;
573 }
574
575 num_generic = 0;
576 /*
577 * Determine number of outputs, the (default) output register
578 * mapping and the semantic information for each output.
579 */
580 for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
581 if (stgp->Base.Base.OutputsWritten & (1 << attr)) {
582 GLuint slot;
583
584 slot = gs_num_outputs;
585 gs_num_outputs++;
586 outputMapping[attr] = slot;
587
588 switch (attr) {
589 case GEOM_RESULT_POS:
590 assert(slot == 0);
591 gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
592 gs_output_semantic_index[slot] = 0;
593 break;
594 case GEOM_RESULT_COL0:
595 gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
596 gs_output_semantic_index[slot] = 0;
597 break;
598 case GEOM_RESULT_COL1:
599 gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
600 gs_output_semantic_index[slot] = 1;
601 break;
602 case GEOM_RESULT_SCOL0:
603 gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
604 gs_output_semantic_index[slot] = 0;
605 break;
606 case GEOM_RESULT_SCOL1:
607 gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
608 gs_output_semantic_index[slot] = 1;
609 break;
610 case GEOM_RESULT_FOGC:
611 gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
612 gs_output_semantic_index[slot] = 0;
613 break;
614 case GEOM_RESULT_PSIZ:
615 gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
616 gs_output_semantic_index[slot] = 0;
617 break;
618 case GEOM_RESULT_TEX0:
619 case GEOM_RESULT_TEX1:
620 case GEOM_RESULT_TEX2:
621 case GEOM_RESULT_TEX3:
622 case GEOM_RESULT_TEX4:
623 case GEOM_RESULT_TEX5:
624 case GEOM_RESULT_TEX6:
625 case GEOM_RESULT_TEX7:
626 /* fall-through */
627 case GEOM_RESULT_VAR0:
628 /* fall-through */
629 default:
630 assert(slot < Elements(gs_output_semantic_name));
631 /* use default semantic info */
632 gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
633 gs_output_semantic_index[slot] = num_generic++;
634 }
635 }
636 }
637
638 assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION);
639
640 /* find max output slot referenced to compute gs_num_outputs */
641 for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
642 if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot)
643 maxSlot = outputMapping[attr];
644 }
645 gs_num_outputs = maxSlot + 1;
646
647 #if 0 /* debug */
648 {
649 GLuint i;
650 printf("outputMapping? %d\n", outputMapping ? 1 : 0);
651 if (outputMapping) {
652 printf("attr -> slot\n");
653 for (i = 0; i < 16; i++) {
654 printf(" %2d %3d\n", i, outputMapping[i]);
655 }
656 }
657 printf("slot sem_name sem_index\n");
658 for (i = 0; i < gs_num_outputs; i++) {
659 printf(" %2d %d %d\n",
660 i,
661 gs_output_semantic_name[i],
662 gs_output_semantic_index[i]);
663 }
664 }
665 #endif
666
667 /* free old shader state, if any */
668 if (stgp->tgsi.tokens) {
669 st_free_tokens(stgp->tgsi.tokens);
670 stgp->tgsi.tokens = NULL;
671 }
672 if (stgp->driver_shader) {
673 cso_delete_geometry_shader(st->cso_context, stgp->driver_shader);
674 stgp->driver_shader = NULL;
675 }
676
677 ureg_property_gs_input_prim(ureg, stgp->Base.InputType);
678 ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
679 ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
680
681 error = st_translate_mesa_program(st->ctx,
682 TGSI_PROCESSOR_GEOMETRY,
683 ureg,
684 &stgp->Base.Base,
685 /* inputs */
686 gs_num_inputs,
687 inputMapping,
688 stgp->input_semantic_name,
689 stgp->input_semantic_index,
690 NULL,
691 /* outputs */
692 gs_num_outputs,
693 outputMapping,
694 gs_output_semantic_name,
695 gs_output_semantic_index,
696 FALSE);
697
698
699 stgp->num_inputs = gs_num_inputs;
700 stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
701 ureg_destroy( ureg );
702 stgp->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
703
704 if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
705 _mesa_print_program(&stgp->Base.Base);
706 debug_printf("\n");
707 }
708
709 if (ST_DEBUG & DEBUG_TGSI) {
710 tgsi_dump(stgp->tgsi.tokens, 0);
711 debug_printf("\n");
712 }
713 }
714
715 /**
716 * Debug- print current shader text
717 */
718 void
719 st_print_shaders(struct gl_context *ctx)
720 {
721 struct gl_shader_program *shProg = ctx->Shader.CurrentProgram;
722 if (shProg) {
723 GLuint i;
724 for (i = 0; i < shProg->NumShaders; i++) {
725 printf("GLSL shader %u of %u:\n", i, shProg->NumShaders);
726 printf("%s\n", shProg->Shaders[i]->Source);
727 }
728 }
729 }