Replace gl_vert_result enum with gl_varying_slot.
[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/hash.h"
36 #include "main/mfeatures.h"
37 #include "main/mtypes.h"
38 #include "program/prog_parameter.h"
39 #include "program/prog_print.h"
40 #include "program/programopt.h"
41
42 #include "pipe/p_context.h"
43 #include "pipe/p_defines.h"
44 #include "pipe/p_shader_tokens.h"
45 #include "draw/draw_context.h"
46 #include "tgsi/tgsi_dump.h"
47 #include "tgsi/tgsi_ureg.h"
48
49 #include "st_debug.h"
50 #include "st_cb_bitmap.h"
51 #include "st_cb_drawpixels.h"
52 #include "st_context.h"
53 #include "st_program.h"
54 #include "st_mesa_to_tgsi.h"
55 #include "cso_cache/cso_context.h"
56
57
58
59 /**
60 * Delete a vertex program variant. Note the caller must unlink
61 * the variant from the linked list.
62 */
63 static void
64 delete_vp_variant(struct st_context *st, struct st_vp_variant *vpv)
65 {
66 if (vpv->driver_shader)
67 cso_delete_vertex_shader(st->cso_context, vpv->driver_shader);
68
69 if (vpv->draw_shader)
70 draw_delete_vertex_shader( st->draw, vpv->draw_shader );
71
72 if (vpv->tgsi.tokens)
73 st_free_tokens(vpv->tgsi.tokens);
74
75 free( vpv );
76 }
77
78
79
80 /**
81 * Clean out any old compilations:
82 */
83 void
84 st_release_vp_variants( struct st_context *st,
85 struct st_vertex_program *stvp )
86 {
87 struct st_vp_variant *vpv;
88
89 for (vpv = stvp->variants; vpv; ) {
90 struct st_vp_variant *next = vpv->next;
91 delete_vp_variant(st, vpv);
92 vpv = next;
93 }
94
95 stvp->variants = NULL;
96 }
97
98
99
100 /**
101 * Delete a fragment program variant. Note the caller must unlink
102 * the variant from the linked list.
103 */
104 static void
105 delete_fp_variant(struct st_context *st, struct st_fp_variant *fpv)
106 {
107 if (fpv->driver_shader)
108 cso_delete_fragment_shader(st->cso_context, fpv->driver_shader);
109 if (fpv->parameters)
110 _mesa_free_parameter_list(fpv->parameters);
111 if (fpv->tgsi.tokens)
112 st_free_tokens(fpv->tgsi.tokens);
113 free(fpv);
114 }
115
116
117 /**
118 * Free all variants of a fragment program.
119 */
120 void
121 st_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp)
122 {
123 struct st_fp_variant *fpv;
124
125 for (fpv = stfp->variants; fpv; ) {
126 struct st_fp_variant *next = fpv->next;
127 delete_fp_variant(st, fpv);
128 fpv = next;
129 }
130
131 stfp->variants = NULL;
132 }
133
134
135 /**
136 * Delete a geometry program variant. Note the caller must unlink
137 * the variant from the linked list.
138 */
139 static void
140 delete_gp_variant(struct st_context *st, struct st_gp_variant *gpv)
141 {
142 if (gpv->driver_shader)
143 cso_delete_geometry_shader(st->cso_context, gpv->driver_shader);
144
145 free(gpv);
146 }
147
148
149 /**
150 * Free all variants of a geometry program.
151 */
152 void
153 st_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp)
154 {
155 struct st_gp_variant *gpv;
156
157 for (gpv = stgp->variants; gpv; ) {
158 struct st_gp_variant *next = gpv->next;
159 delete_gp_variant(st, gpv);
160 gpv = next;
161 }
162
163 stgp->variants = NULL;
164 }
165
166
167
168
169 /**
170 * Translate a Mesa vertex shader into a TGSI shader.
171 * \param outputMapping to map vertex program output registers (VARYING_SLOT_x)
172 * to TGSI output slots
173 * \param tokensOut destination for TGSI tokens
174 * \return pointer to cached pipe_shader object.
175 */
176 void
177 st_prepare_vertex_program(struct gl_context *ctx,
178 struct st_vertex_program *stvp)
179 {
180 GLuint attr;
181
182 stvp->num_inputs = 0;
183 stvp->num_outputs = 0;
184
185 if (stvp->Base.IsPositionInvariant)
186 _mesa_insert_mvp_code(ctx, &stvp->Base);
187
188 if (!stvp->glsl_to_tgsi)
189 assert(stvp->Base.Base.NumInstructions > 1);
190
191 /*
192 * Determine number of inputs, the mappings between VERT_ATTRIB_x
193 * and TGSI generic input indexes, plus input attrib semantic info.
194 */
195 for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
196 if ((stvp->Base.Base.InputsRead & BITFIELD64_BIT(attr)) != 0) {
197 stvp->input_to_index[attr] = stvp->num_inputs;
198 stvp->index_to_input[stvp->num_inputs] = attr;
199 stvp->num_inputs++;
200 }
201 }
202 /* bit of a hack, presetup potentially unused edgeflag input */
203 stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs;
204 stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG;
205
206 /* Compute mapping of vertex program outputs to slots.
207 */
208 for (attr = 0; attr < VARYING_SLOT_MAX; attr++) {
209 if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) {
210 stvp->result_to_output[attr] = ~0;
211 }
212 else {
213 unsigned slot = stvp->num_outputs++;
214
215 stvp->result_to_output[attr] = slot;
216
217 switch (attr) {
218 case VARYING_SLOT_POS:
219 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
220 stvp->output_semantic_index[slot] = 0;
221 break;
222 case VARYING_SLOT_COL0:
223 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
224 stvp->output_semantic_index[slot] = 0;
225 break;
226 case VARYING_SLOT_COL1:
227 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
228 stvp->output_semantic_index[slot] = 1;
229 break;
230 case VARYING_SLOT_BFC0:
231 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
232 stvp->output_semantic_index[slot] = 0;
233 break;
234 case VARYING_SLOT_BFC1:
235 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
236 stvp->output_semantic_index[slot] = 1;
237 break;
238 case VARYING_SLOT_FOGC:
239 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
240 stvp->output_semantic_index[slot] = 0;
241 break;
242 case VARYING_SLOT_PSIZ:
243 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
244 stvp->output_semantic_index[slot] = 0;
245 break;
246 case VARYING_SLOT_CLIP_DIST0:
247 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
248 stvp->output_semantic_index[slot] = 0;
249 break;
250 case VARYING_SLOT_CLIP_DIST1:
251 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
252 stvp->output_semantic_index[slot] = 1;
253 break;
254 case VARYING_SLOT_EDGE:
255 assert(0);
256 break;
257 case VARYING_SLOT_CLIP_VERTEX:
258 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX;
259 stvp->output_semantic_index[slot] = 0;
260 break;
261
262 case VARYING_SLOT_TEX0:
263 case VARYING_SLOT_TEX1:
264 case VARYING_SLOT_TEX2:
265 case VARYING_SLOT_TEX3:
266 case VARYING_SLOT_TEX4:
267 case VARYING_SLOT_TEX5:
268 case VARYING_SLOT_TEX6:
269 case VARYING_SLOT_TEX7:
270 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
271 stvp->output_semantic_index[slot] = attr - VARYING_SLOT_TEX0;
272 break;
273
274 case VARYING_SLOT_VAR0:
275 default:
276 assert(attr < VARYING_SLOT_MAX);
277 stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
278 stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 -
279 FRAG_ATTRIB_TEX0 +
280 attr -
281 VARYING_SLOT_VAR0);
282 break;
283 }
284 }
285 }
286 /* similar hack to above, presetup potentially unused edgeflag output */
287 stvp->result_to_output[VARYING_SLOT_EDGE] = stvp->num_outputs;
288 stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG;
289 stvp->output_semantic_index[stvp->num_outputs] = 0;
290 }
291
292
293 /**
294 * Translate a vertex program to create a new variant.
295 */
296 static struct st_vp_variant *
297 st_translate_vertex_program(struct st_context *st,
298 struct st_vertex_program *stvp,
299 const struct st_vp_variant_key *key)
300 {
301 struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant);
302 struct pipe_context *pipe = st->pipe;
303 struct ureg_program *ureg;
304 enum pipe_error error;
305 unsigned num_outputs;
306
307 st_prepare_vertex_program(st->ctx, stvp);
308
309 if (!stvp->glsl_to_tgsi)
310 {
311 _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT);
312 }
313
314 ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
315 if (ureg == NULL) {
316 free(vpv);
317 return NULL;
318 }
319
320 vpv->key = *key;
321
322 vpv->num_inputs = stvp->num_inputs;
323 num_outputs = stvp->num_outputs;
324 if (key->passthrough_edgeflags) {
325 vpv->num_inputs++;
326 num_outputs++;
327 }
328
329 if (ST_DEBUG & DEBUG_MESA) {
330 _mesa_print_program(&stvp->Base.Base);
331 _mesa_print_program_parameters(st->ctx, &stvp->Base.Base);
332 debug_printf("\n");
333 }
334
335 if (stvp->glsl_to_tgsi)
336 error = st_translate_program(st->ctx,
337 TGSI_PROCESSOR_VERTEX,
338 ureg,
339 stvp->glsl_to_tgsi,
340 &stvp->Base.Base,
341 /* inputs */
342 stvp->num_inputs,
343 stvp->input_to_index,
344 NULL, /* input semantic name */
345 NULL, /* input semantic index */
346 NULL, /* interp mode */
347 NULL, /* is centroid */
348 /* outputs */
349 stvp->num_outputs,
350 stvp->result_to_output,
351 stvp->output_semantic_name,
352 stvp->output_semantic_index,
353 key->passthrough_edgeflags,
354 key->clamp_color);
355 else
356 error = st_translate_mesa_program(st->ctx,
357 TGSI_PROCESSOR_VERTEX,
358 ureg,
359 &stvp->Base.Base,
360 /* inputs */
361 vpv->num_inputs,
362 stvp->input_to_index,
363 NULL, /* input semantic name */
364 NULL, /* input semantic index */
365 NULL,
366 /* outputs */
367 num_outputs,
368 stvp->result_to_output,
369 stvp->output_semantic_name,
370 stvp->output_semantic_index,
371 key->passthrough_edgeflags,
372 key->clamp_color);
373
374 if (error)
375 goto fail;
376
377 vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL );
378 if (!vpv->tgsi.tokens)
379 goto fail;
380
381 ureg_destroy( ureg );
382
383 if (stvp->glsl_to_tgsi) {
384 st_translate_stream_output_info(stvp->glsl_to_tgsi,
385 stvp->result_to_output,
386 &vpv->tgsi.stream_output);
387 }
388
389 vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
390
391 if (ST_DEBUG & DEBUG_TGSI) {
392 tgsi_dump( vpv->tgsi.tokens, 0 );
393 debug_printf("\n");
394 }
395
396 return vpv;
397
398 fail:
399 debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);
400 _mesa_print_program(&stvp->Base.Base);
401 debug_assert(0);
402
403 ureg_destroy( ureg );
404 return NULL;
405 }
406
407
408 /**
409 * Find/create a vertex program variant.
410 */
411 struct st_vp_variant *
412 st_get_vp_variant(struct st_context *st,
413 struct st_vertex_program *stvp,
414 const struct st_vp_variant_key *key)
415 {
416 struct st_vp_variant *vpv;
417
418 /* Search for existing variant */
419 for (vpv = stvp->variants; vpv; vpv = vpv->next) {
420 if (memcmp(&vpv->key, key, sizeof(*key)) == 0) {
421 break;
422 }
423 }
424
425 if (!vpv) {
426 /* create now */
427 vpv = st_translate_vertex_program(st, stvp, key);
428 if (vpv) {
429 /* insert into list */
430 vpv->next = stvp->variants;
431 stvp->variants = vpv;
432 }
433 }
434
435 return vpv;
436 }
437
438
439 static unsigned
440 st_translate_interp(enum glsl_interp_qualifier glsl_qual, bool is_color)
441 {
442 switch (glsl_qual) {
443 case INTERP_QUALIFIER_NONE:
444 if (is_color)
445 return TGSI_INTERPOLATE_COLOR;
446 return TGSI_INTERPOLATE_PERSPECTIVE;
447 case INTERP_QUALIFIER_SMOOTH:
448 return TGSI_INTERPOLATE_PERSPECTIVE;
449 case INTERP_QUALIFIER_FLAT:
450 return TGSI_INTERPOLATE_CONSTANT;
451 case INTERP_QUALIFIER_NOPERSPECTIVE:
452 return TGSI_INTERPOLATE_LINEAR;
453 default:
454 assert(0 && "unexpected interp mode in st_translate_interp()");
455 return TGSI_INTERPOLATE_PERSPECTIVE;
456 }
457 }
458
459
460 /**
461 * Translate a Mesa fragment shader into a TGSI shader using extra info in
462 * the key.
463 * \return new fragment program variant
464 */
465 static struct st_fp_variant *
466 st_translate_fragment_program(struct st_context *st,
467 struct st_fragment_program *stfp,
468 const struct st_fp_variant_key *key)
469 {
470 struct pipe_context *pipe = st->pipe;
471 struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
472 GLboolean deleteFP = GL_FALSE;
473
474 GLuint outputMapping[FRAG_RESULT_MAX];
475 GLuint inputMapping[FRAG_ATTRIB_MAX];
476 GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */
477 GLuint attr;
478 GLbitfield64 inputsRead;
479 struct ureg_program *ureg;
480
481 GLboolean write_all = GL_FALSE;
482
483 ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
484 ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
485 GLboolean is_centroid[PIPE_MAX_SHADER_INPUTS];
486 uint fs_num_inputs = 0;
487
488 ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
489 ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
490 uint fs_num_outputs = 0;
491
492 if (!variant)
493 return NULL;
494
495 assert(!(key->bitmap && key->drawpixels));
496
497 if (key->bitmap) {
498 /* glBitmap drawing */
499 struct gl_fragment_program *fp; /* we free this temp program below */
500
501 st_make_bitmap_fragment_program(st, &stfp->Base,
502 &fp, &variant->bitmap_sampler);
503
504 variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
505 stfp = st_fragment_program(fp);
506 deleteFP = GL_TRUE;
507 }
508 else if (key->drawpixels) {
509 /* glDrawPixels drawing */
510 struct gl_fragment_program *fp; /* we free this temp program below */
511
512 if (key->drawpixels_z || key->drawpixels_stencil) {
513 fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z,
514 key->drawpixels_stencil);
515 }
516 else {
517 /* RGBA */
518 st_make_drawpix_fragment_program(st, &stfp->Base, &fp);
519 variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
520 deleteFP = GL_TRUE;
521 }
522 stfp = st_fragment_program(fp);
523 }
524
525 if (!stfp->glsl_to_tgsi)
526 _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
527
528 /*
529 * Convert Mesa program inputs to TGSI input register semantics.
530 */
531 inputsRead = stfp->Base.Base.InputsRead;
532 for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
533 if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
534 const GLuint slot = fs_num_inputs++;
535
536 inputMapping[attr] = slot;
537 is_centroid[slot] = (stfp->Base.IsCentroid & BITFIELD64_BIT(attr)) != 0;
538
539 switch (attr) {
540 case FRAG_ATTRIB_WPOS:
541 input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
542 input_semantic_index[slot] = 0;
543 interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
544 break;
545 case FRAG_ATTRIB_COL0:
546 input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
547 input_semantic_index[slot] = 0;
548 interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
549 TRUE);
550 break;
551 case FRAG_ATTRIB_COL1:
552 input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
553 input_semantic_index[slot] = 1;
554 interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
555 TRUE);
556 break;
557 case FRAG_ATTRIB_FOGC:
558 input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
559 input_semantic_index[slot] = 0;
560 interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
561 break;
562 case FRAG_ATTRIB_FACE:
563 input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
564 input_semantic_index[slot] = 0;
565 interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
566 break;
567 case FRAG_ATTRIB_CLIP_DIST0:
568 input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
569 input_semantic_index[slot] = 0;
570 interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
571 break;
572 case FRAG_ATTRIB_CLIP_DIST1:
573 input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
574 input_semantic_index[slot] = 1;
575 interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
576 break;
577 /* In most cases, there is nothing special about these
578 * inputs, so adopt a convention to use the generic
579 * semantic name and the mesa FRAG_ATTRIB_ number as the
580 * index.
581 *
582 * All that is required is that the vertex shader labels
583 * its own outputs similarly, and that the vertex shader
584 * generates at least every output required by the
585 * fragment shader plus fixed-function hardware (such as
586 * BFC).
587 *
588 * There is no requirement that semantic indexes start at
589 * zero or be restricted to a particular range -- nobody
590 * should be building tables based on semantic index.
591 */
592 case FRAG_ATTRIB_PNTC:
593 case FRAG_ATTRIB_TEX0:
594 case FRAG_ATTRIB_TEX1:
595 case FRAG_ATTRIB_TEX2:
596 case FRAG_ATTRIB_TEX3:
597 case FRAG_ATTRIB_TEX4:
598 case FRAG_ATTRIB_TEX5:
599 case FRAG_ATTRIB_TEX6:
600 case FRAG_ATTRIB_TEX7:
601 case FRAG_ATTRIB_VAR0:
602 default:
603 /* Actually, let's try and zero-base this just for
604 * readability of the generated TGSI.
605 */
606 assert(attr >= FRAG_ATTRIB_TEX0);
607 input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
608 input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
609 if (attr == FRAG_ATTRIB_PNTC)
610 interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
611 else
612 interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
613 FALSE);
614 break;
615 }
616 }
617 else {
618 inputMapping[attr] = -1;
619 }
620 }
621
622 /*
623 * Semantics and mapping for outputs
624 */
625 {
626 uint numColors = 0;
627 GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
628
629 /* if z is written, emit that first */
630 if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
631 fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
632 fs_output_semantic_index[fs_num_outputs] = 0;
633 outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
634 fs_num_outputs++;
635 outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
636 }
637
638 if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
639 fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
640 fs_output_semantic_index[fs_num_outputs] = 0;
641 outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
642 fs_num_outputs++;
643 outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
644 }
645
646 /* handle remaining outputs (color) */
647 for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
648 if (outputsWritten & BITFIELD64_BIT(attr)) {
649 switch (attr) {
650 case FRAG_RESULT_DEPTH:
651 case FRAG_RESULT_STENCIL:
652 /* handled above */
653 assert(0);
654 break;
655 case FRAG_RESULT_COLOR:
656 write_all = GL_TRUE; /* fallthrough */
657 default:
658 assert(attr == FRAG_RESULT_COLOR ||
659 (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
660 fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
661 fs_output_semantic_index[fs_num_outputs] = numColors;
662 outputMapping[attr] = fs_num_outputs;
663 numColors++;
664 break;
665 }
666
667 fs_num_outputs++;
668 }
669 }
670 }
671
672 ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
673 if (ureg == NULL) {
674 free(variant);
675 return NULL;
676 }
677
678 if (ST_DEBUG & DEBUG_MESA) {
679 _mesa_print_program(&stfp->Base.Base);
680 _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
681 debug_printf("\n");
682 }
683 if (write_all == GL_TRUE)
684 ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
685
686 if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) {
687 switch (stfp->Base.FragDepthLayout) {
688 case FRAG_DEPTH_LAYOUT_ANY:
689 ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY);
690 break;
691 case FRAG_DEPTH_LAYOUT_GREATER:
692 ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER);
693 break;
694 case FRAG_DEPTH_LAYOUT_LESS:
695 ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS);
696 break;
697 case FRAG_DEPTH_LAYOUT_UNCHANGED:
698 ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
699 break;
700 default:
701 assert(0);
702 }
703 }
704
705 if (stfp->glsl_to_tgsi)
706 st_translate_program(st->ctx,
707 TGSI_PROCESSOR_FRAGMENT,
708 ureg,
709 stfp->glsl_to_tgsi,
710 &stfp->Base.Base,
711 /* inputs */
712 fs_num_inputs,
713 inputMapping,
714 input_semantic_name,
715 input_semantic_index,
716 interpMode,
717 is_centroid,
718 /* outputs */
719 fs_num_outputs,
720 outputMapping,
721 fs_output_semantic_name,
722 fs_output_semantic_index, FALSE,
723 key->clamp_color );
724 else
725 st_translate_mesa_program(st->ctx,
726 TGSI_PROCESSOR_FRAGMENT,
727 ureg,
728 &stfp->Base.Base,
729 /* inputs */
730 fs_num_inputs,
731 inputMapping,
732 input_semantic_name,
733 input_semantic_index,
734 interpMode,
735 /* outputs */
736 fs_num_outputs,
737 outputMapping,
738 fs_output_semantic_name,
739 fs_output_semantic_index, FALSE,
740 key->clamp_color);
741
742 variant->tgsi.tokens = ureg_get_tokens( ureg, NULL );
743 ureg_destroy( ureg );
744
745 /* fill in variant */
746 variant->driver_shader = pipe->create_fs_state(pipe, &variant->tgsi);
747 variant->key = *key;
748
749 if (ST_DEBUG & DEBUG_TGSI) {
750 tgsi_dump( variant->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
751 debug_printf("\n");
752 }
753
754 if (deleteFP) {
755 /* Free the temporary program made above */
756 struct gl_fragment_program *fp = &stfp->Base;
757 _mesa_reference_fragprog(st->ctx, &fp, NULL);
758 }
759
760 return variant;
761 }
762
763
764 /**
765 * Translate fragment program if needed.
766 */
767 struct st_fp_variant *
768 st_get_fp_variant(struct st_context *st,
769 struct st_fragment_program *stfp,
770 const struct st_fp_variant_key *key)
771 {
772 struct st_fp_variant *fpv;
773
774 /* Search for existing variant */
775 for (fpv = stfp->variants; fpv; fpv = fpv->next) {
776 if (memcmp(&fpv->key, key, sizeof(*key)) == 0) {
777 break;
778 }
779 }
780
781 if (!fpv) {
782 /* create new */
783 fpv = st_translate_fragment_program(st, stfp, key);
784 if (fpv) {
785 /* insert into list */
786 fpv->next = stfp->variants;
787 stfp->variants = fpv;
788 }
789 }
790
791 return fpv;
792 }
793
794
795 /**
796 * Translate a geometry program to create a new variant.
797 */
798 static struct st_gp_variant *
799 st_translate_geometry_program(struct st_context *st,
800 struct st_geometry_program *stgp,
801 const struct st_gp_variant_key *key)
802 {
803 GLuint inputMapping[GEOM_ATTRIB_MAX];
804 GLuint outputMapping[GEOM_RESULT_MAX];
805 struct pipe_context *pipe = st->pipe;
806 GLuint attr;
807 GLbitfield64 inputsRead;
808 GLuint vslot = 0;
809 GLuint num_generic = 0;
810
811 uint gs_num_inputs = 0;
812 uint gs_builtin_inputs = 0;
813 uint gs_array_offset = 0;
814
815 ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
816 ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
817 uint gs_num_outputs = 0;
818
819 GLint i;
820 GLuint maxSlot = 0;
821 struct ureg_program *ureg;
822
823 struct st_gp_variant *gpv;
824
825 gpv = CALLOC_STRUCT(st_gp_variant);
826 if (!gpv)
827 return NULL;
828
829 _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT);
830
831 ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY );
832 if (ureg == NULL) {
833 free(gpv);
834 return NULL;
835 }
836
837 /* which vertex output goes to the first geometry input */
838 vslot = 0;
839
840 memset(inputMapping, 0, sizeof(inputMapping));
841 memset(outputMapping, 0, sizeof(outputMapping));
842
843 /*
844 * Convert Mesa program inputs to TGSI input register semantics.
845 */
846 inputsRead = stgp->Base.Base.InputsRead;
847 for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) {
848 if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
849 const GLuint slot = gs_num_inputs;
850
851 gs_num_inputs++;
852
853 inputMapping[attr] = slot;
854
855 stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs;
856 stgp->input_to_index[attr] = vslot;
857 stgp->index_to_input[vslot] = attr;
858 ++vslot;
859
860 if (attr != GEOM_ATTRIB_PRIMITIVE_ID) {
861 gs_array_offset += 2;
862 } else
863 ++gs_builtin_inputs;
864
865 #if 0
866 debug_printf("input map at %d = %d\n",
867 slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]);
868 #endif
869
870 switch (attr) {
871 case GEOM_ATTRIB_PRIMITIVE_ID:
872 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID;
873 stgp->input_semantic_index[slot] = 0;
874 break;
875 case GEOM_ATTRIB_POSITION:
876 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
877 stgp->input_semantic_index[slot] = 0;
878 break;
879 case GEOM_ATTRIB_COLOR0:
880 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
881 stgp->input_semantic_index[slot] = 0;
882 break;
883 case GEOM_ATTRIB_COLOR1:
884 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
885 stgp->input_semantic_index[slot] = 1;
886 break;
887 case GEOM_ATTRIB_FOG_FRAG_COORD:
888 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
889 stgp->input_semantic_index[slot] = 0;
890 break;
891 case GEOM_ATTRIB_TEX_COORD:
892 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
893 stgp->input_semantic_index[slot] = num_generic++;
894 break;
895 case GEOM_ATTRIB_VAR0:
896 /* fall-through */
897 default:
898 stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
899 stgp->input_semantic_index[slot] = num_generic++;
900 }
901 }
902 }
903
904 /* initialize output semantics to defaults */
905 for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
906 gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
907 gs_output_semantic_index[i] = 0;
908 }
909
910 num_generic = 0;
911 /*
912 * Determine number of outputs, the (default) output register
913 * mapping and the semantic information for each output.
914 */
915 for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
916 if (stgp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) {
917 GLuint slot;
918
919 slot = gs_num_outputs;
920 gs_num_outputs++;
921 outputMapping[attr] = slot;
922
923 switch (attr) {
924 case GEOM_RESULT_POS:
925 assert(slot == 0);
926 gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
927 gs_output_semantic_index[slot] = 0;
928 break;
929 case GEOM_RESULT_COL0:
930 gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
931 gs_output_semantic_index[slot] = 0;
932 break;
933 case GEOM_RESULT_COL1:
934 gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
935 gs_output_semantic_index[slot] = 1;
936 break;
937 case GEOM_RESULT_SCOL0:
938 gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
939 gs_output_semantic_index[slot] = 0;
940 break;
941 case GEOM_RESULT_SCOL1:
942 gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
943 gs_output_semantic_index[slot] = 1;
944 break;
945 case GEOM_RESULT_FOGC:
946 gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
947 gs_output_semantic_index[slot] = 0;
948 break;
949 case GEOM_RESULT_PSIZ:
950 gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
951 gs_output_semantic_index[slot] = 0;
952 break;
953 case GEOM_RESULT_TEX0:
954 case GEOM_RESULT_TEX1:
955 case GEOM_RESULT_TEX2:
956 case GEOM_RESULT_TEX3:
957 case GEOM_RESULT_TEX4:
958 case GEOM_RESULT_TEX5:
959 case GEOM_RESULT_TEX6:
960 case GEOM_RESULT_TEX7:
961 /* fall-through */
962 case GEOM_RESULT_VAR0:
963 /* fall-through */
964 default:
965 assert(slot < Elements(gs_output_semantic_name));
966 /* use default semantic info */
967 gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
968 gs_output_semantic_index[slot] = num_generic++;
969 }
970 }
971 }
972
973 assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION);
974
975 /* find max output slot referenced to compute gs_num_outputs */
976 for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
977 if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot)
978 maxSlot = outputMapping[attr];
979 }
980 gs_num_outputs = maxSlot + 1;
981
982 #if 0 /* debug */
983 {
984 GLuint i;
985 printf("outputMapping? %d\n", outputMapping ? 1 : 0);
986 if (outputMapping) {
987 printf("attr -> slot\n");
988 for (i = 0; i < 16; i++) {
989 printf(" %2d %3d\n", i, outputMapping[i]);
990 }
991 }
992 printf("slot sem_name sem_index\n");
993 for (i = 0; i < gs_num_outputs; i++) {
994 printf(" %2d %d %d\n",
995 i,
996 gs_output_semantic_name[i],
997 gs_output_semantic_index[i]);
998 }
999 }
1000 #endif
1001
1002 /* free old shader state, if any */
1003 if (stgp->tgsi.tokens) {
1004 st_free_tokens(stgp->tgsi.tokens);
1005 stgp->tgsi.tokens = NULL;
1006 }
1007
1008 ureg_property_gs_input_prim(ureg, stgp->Base.InputType);
1009 ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
1010 ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
1011
1012 st_translate_mesa_program(st->ctx,
1013 TGSI_PROCESSOR_GEOMETRY,
1014 ureg,
1015 &stgp->Base.Base,
1016 /* inputs */
1017 gs_num_inputs,
1018 inputMapping,
1019 stgp->input_semantic_name,
1020 stgp->input_semantic_index,
1021 NULL,
1022 /* outputs */
1023 gs_num_outputs,
1024 outputMapping,
1025 gs_output_semantic_name,
1026 gs_output_semantic_index,
1027 FALSE,
1028 FALSE);
1029
1030 stgp->num_inputs = gs_num_inputs;
1031 stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
1032 ureg_destroy( ureg );
1033
1034 if (stgp->glsl_to_tgsi) {
1035 st_translate_stream_output_info(stgp->glsl_to_tgsi,
1036 outputMapping,
1037 &stgp->tgsi.stream_output);
1038 }
1039
1040 /* fill in new variant */
1041 gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
1042 gpv->key = *key;
1043
1044 if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
1045 _mesa_print_program(&stgp->Base.Base);
1046 debug_printf("\n");
1047 }
1048
1049 if (ST_DEBUG & DEBUG_TGSI) {
1050 tgsi_dump(stgp->tgsi.tokens, 0);
1051 debug_printf("\n");
1052 }
1053
1054 return gpv;
1055 }
1056
1057
1058 /**
1059 * Get/create geometry program variant.
1060 */
1061 struct st_gp_variant *
1062 st_get_gp_variant(struct st_context *st,
1063 struct st_geometry_program *stgp,
1064 const struct st_gp_variant_key *key)
1065 {
1066 struct st_gp_variant *gpv;
1067
1068 /* Search for existing variant */
1069 for (gpv = stgp->variants; gpv; gpv = gpv->next) {
1070 if (memcmp(&gpv->key, key, sizeof(*key)) == 0) {
1071 break;
1072 }
1073 }
1074
1075 if (!gpv) {
1076 /* create new */
1077 gpv = st_translate_geometry_program(st, stgp, key);
1078 if (gpv) {
1079 /* insert into list */
1080 gpv->next = stgp->variants;
1081 stgp->variants = gpv;
1082 }
1083 }
1084
1085 return gpv;
1086 }
1087
1088
1089
1090
1091 /**
1092 * Debug- print current shader text
1093 */
1094 void
1095 st_print_shaders(struct gl_context *ctx)
1096 {
1097 struct gl_shader_program *shProg[3] = {
1098 ctx->Shader.CurrentVertexProgram,
1099 ctx->Shader.CurrentGeometryProgram,
1100 ctx->Shader.CurrentFragmentProgram,
1101 };
1102 unsigned j;
1103
1104 for (j = 0; j < 3; j++) {
1105 unsigned i;
1106
1107 if (shProg[j] == NULL)
1108 continue;
1109
1110 for (i = 0; i < shProg[j]->NumShaders; i++) {
1111 struct gl_shader *sh;
1112
1113 switch (shProg[j]->Shaders[i]->Type) {
1114 case GL_VERTEX_SHADER:
1115 sh = (i != 0) ? NULL : shProg[j]->Shaders[i];
1116 break;
1117 case GL_GEOMETRY_SHADER_ARB:
1118 sh = (i != 1) ? NULL : shProg[j]->Shaders[i];
1119 break;
1120 case GL_FRAGMENT_SHADER:
1121 sh = (i != 2) ? NULL : shProg[j]->Shaders[i];
1122 break;
1123 default:
1124 assert(0);
1125 sh = NULL;
1126 break;
1127 }
1128
1129 if (sh != NULL) {
1130 printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders);
1131 printf("%s\n", sh->Source);
1132 }
1133 }
1134 }
1135 }
1136
1137
1138 /**
1139 * Vert/Geom/Frag programs have per-context variants. Free all the
1140 * variants attached to the given program which match the given context.
1141 */
1142 static void
1143 destroy_program_variants(struct st_context *st, struct gl_program *program)
1144 {
1145 if (!program || program == &_mesa_DummyProgram)
1146 return;
1147
1148 switch (program->Target) {
1149 case GL_VERTEX_PROGRAM_ARB:
1150 {
1151 struct st_vertex_program *stvp = (struct st_vertex_program *) program;
1152 struct st_vp_variant *vpv, **prevPtr = &stvp->variants;
1153
1154 for (vpv = stvp->variants; vpv; ) {
1155 struct st_vp_variant *next = vpv->next;
1156 if (vpv->key.st == st) {
1157 /* unlink from list */
1158 *prevPtr = next;
1159 /* destroy this variant */
1160 delete_vp_variant(st, vpv);
1161 }
1162 else {
1163 prevPtr = &vpv->next;
1164 }
1165 vpv = next;
1166 }
1167 }
1168 break;
1169 case GL_FRAGMENT_PROGRAM_ARB:
1170 {
1171 struct st_fragment_program *stfp =
1172 (struct st_fragment_program *) program;
1173 struct st_fp_variant *fpv, **prevPtr = &stfp->variants;
1174
1175 for (fpv = stfp->variants; fpv; ) {
1176 struct st_fp_variant *next = fpv->next;
1177 if (fpv->key.st == st) {
1178 /* unlink from list */
1179 *prevPtr = next;
1180 /* destroy this variant */
1181 delete_fp_variant(st, fpv);
1182 }
1183 else {
1184 prevPtr = &fpv->next;
1185 }
1186 fpv = next;
1187 }
1188 }
1189 break;
1190 case MESA_GEOMETRY_PROGRAM:
1191 {
1192 struct st_geometry_program *stgp =
1193 (struct st_geometry_program *) program;
1194 struct st_gp_variant *gpv, **prevPtr = &stgp->variants;
1195
1196 for (gpv = stgp->variants; gpv; ) {
1197 struct st_gp_variant *next = gpv->next;
1198 if (gpv->key.st == st) {
1199 /* unlink from list */
1200 *prevPtr = next;
1201 /* destroy this variant */
1202 delete_gp_variant(st, gpv);
1203 }
1204 else {
1205 prevPtr = &gpv->next;
1206 }
1207 gpv = next;
1208 }
1209 }
1210 break;
1211 default:
1212 _mesa_problem(NULL, "Unexpected program target 0x%x in "
1213 "destroy_program_variants_cb()", program->Target);
1214 }
1215 }
1216
1217
1218 /**
1219 * Callback for _mesa_HashWalk. Free all the shader's program variants
1220 * which match the given context.
1221 */
1222 static void
1223 destroy_shader_program_variants_cb(GLuint key, void *data, void *userData)
1224 {
1225 struct st_context *st = (struct st_context *) userData;
1226 struct gl_shader *shader = (struct gl_shader *) data;
1227
1228 switch (shader->Type) {
1229 case GL_SHADER_PROGRAM_MESA:
1230 {
1231 struct gl_shader_program *shProg = (struct gl_shader_program *) data;
1232 GLuint i;
1233
1234 for (i = 0; i < shProg->NumShaders; i++) {
1235 destroy_program_variants(st, shProg->Shaders[i]->Program);
1236 }
1237
1238 for (i = 0; i < Elements(shProg->_LinkedShaders); i++) {
1239 if (shProg->_LinkedShaders[i])
1240 destroy_program_variants(st, shProg->_LinkedShaders[i]->Program);
1241 }
1242 }
1243 break;
1244 case GL_VERTEX_SHADER:
1245 case GL_FRAGMENT_SHADER:
1246 case GL_GEOMETRY_SHADER:
1247 {
1248 destroy_program_variants(st, shader->Program);
1249 }
1250 break;
1251 default:
1252 assert(0);
1253 }
1254 }
1255
1256
1257 /**
1258 * Callback for _mesa_HashWalk. Free all the program variants which match
1259 * the given context.
1260 */
1261 static void
1262 destroy_program_variants_cb(GLuint key, void *data, void *userData)
1263 {
1264 struct st_context *st = (struct st_context *) userData;
1265 struct gl_program *program = (struct gl_program *) data;
1266 destroy_program_variants(st, program);
1267 }
1268
1269
1270 /**
1271 * Walk over all shaders and programs to delete any variants which
1272 * belong to the given context.
1273 * This is called during context tear-down.
1274 */
1275 void
1276 st_destroy_program_variants(struct st_context *st)
1277 {
1278 /* ARB vert/frag program */
1279 _mesa_HashWalk(st->ctx->Shared->Programs,
1280 destroy_program_variants_cb, st);
1281
1282 /* GLSL vert/frag/geom shaders */
1283 _mesa_HashWalk(st->ctx->Shared->ShaderObjects,
1284 destroy_shader_program_variants_cb, st);
1285 }
1286
1287
1288 /**
1289 * For debugging, print/dump the current vertex program.
1290 */
1291 void
1292 st_print_current_vertex_program(void)
1293 {
1294 GET_CURRENT_CONTEXT(ctx);
1295
1296 if (ctx->VertexProgram._Current) {
1297 struct st_vertex_program *stvp =
1298 (struct st_vertex_program *) ctx->VertexProgram._Current;
1299 struct st_vp_variant *stv;
1300
1301 debug_printf("Vertex program %u\n", stvp->Base.Base.Id);
1302
1303 for (stv = stvp->variants; stv; stv = stv->next) {
1304 debug_printf("variant %p\n", stv);
1305 tgsi_dump(stv->tgsi.tokens, 0);
1306 }
1307 }
1308 }