st_program.c revision a08e348a84f57ed5e8bf5888f1ce13934d2ce8fa
1f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**************************************************************************
2f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *
3f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * All Rights Reserved.
5f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *
6f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Permission is hereby granted, free of charge, to any person obtaining a
7f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * copy of this software and associated documentation files (the
8f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * "Software"), to deal in the Software without restriction, including
9f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * without limitation the rights to use, copy, modify, merge, publish,
10f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * distribute, sub license, and/or sell copies of the Software, and to
11f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * permit persons to whom the Software is furnished to do so, subject to
12f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * the following conditions:
13f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *
14f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * The above copyright notice and this permission notice (including the
15f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * next paragraph) shall be included in all copies or substantial portions
16f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * of the Software.
17f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *
18f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *
26f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian **************************************************************************/
27f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /*
28f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian  * Authors:
29f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian  *   Keith Whitwell <keith@tungstengraphics.com>
30f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian  *   Brian Paul
31f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian  */
32f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
33f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
34b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/imports.h"
35b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/mtypes.h"
36633e1133aeed04df650b97c8d25a041014fd6f5eBrian#include "shader/prog_print.h"
37f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs#include "shader/programopt.h"
38f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
39f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h"
40f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h"
41abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h"
426acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h"
43c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h"
44f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
45b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "st_debug.h"
46f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h"
47f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_atom.h"
48f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h"
49ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h"
50339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h"
51f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
528468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul
538468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul
548468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/**
558468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations:
568468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */
5707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid
5807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_vp_release_varients( struct st_context *st,
5907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                        struct st_vertex_program *stvp )
6007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
6107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct st_vp_varient *vpv;
6207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
6307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   for (vpv = stvp->varients; vpv; ) {
6407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      struct st_vp_varient *next = vpv->next;
6507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
6607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      if (vpv->driver_shader)
6707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         cso_delete_vertex_shader(st->cso_context, vpv->driver_shader);
6807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
6907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      if (vpv->draw_shader)
7007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         draw_delete_vertex_shader( st->draw, vpv->draw_shader );
7107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
7207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      if (vpv->state.tokens)
7307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         st_free_tokens(vpv->state.tokens);
7407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
7507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      FREE( vpv );
7607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
7707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      vpv = next;
7807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   }
7907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
8007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->varients = NULL;
8107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
8207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
8307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
8407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
85f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
86f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
87f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader.
88e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping  to map vertex program output registers (VERT_RESULT_x)
89e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul *       to TGSI output slots
90f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut  destination for TGSI tokens
91f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
92f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
93ac95fee4fffee77bb7bd798d094ed2e3a7c4019bBrianvoid
9407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st,
9507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp)
96f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
9707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   GLuint attr;
98c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
9907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_inputs = 0;
10007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_outputs = 0;
101f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
102f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs   if (stvp->Base.IsPositionInvariant)
103f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs      _mesa_insert_mvp_code(st->ctx, &stvp->Base);
104f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs
105f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
106f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Determine number of inputs, the mappings between VERT_ATTRIB_x
107f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * and TGSI generic input indexes, plus input attrib semantic info.
108f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
109f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
110f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      if (stvp->Base.Base.InputsRead & (1 << attr)) {
11107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->input_to_index[attr] = stvp->num_inputs;
11207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->index_to_input[stvp->num_inputs] = attr;
11307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->num_inputs++;
114f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
115f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
116f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
11707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /* Compute mapping of vertex program outputs to slots.
118f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
119f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
12007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      if ((stvp->Base.Base.OutputsWritten & (1 << attr)) == 0) {
12107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = ~0;
12207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      }
12307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      else {
12407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         unsigned slot = stvp->num_outputs++;
12507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
12607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = slot;
127f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
128f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
129f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_HPOS:
13007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
13107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
132f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
133f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL0:
13407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
13507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
136f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
137f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL1:
13807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
13907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
140f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
141f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC0:
14207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
14307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
144f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
145f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC1:
14607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
14707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
148f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
149f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_FOGC:
15007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
15107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
152f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
153f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_PSIZ:
15407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
15507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
156f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
157f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_EDGE:
158f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(0);
159f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
16007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
161f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX0:
162f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX1:
163f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX2:
164f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX3:
165f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX4:
166f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX5:
167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX6:
168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX7:
16907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
17007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
17107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
17207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_VAR0:
174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
17507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            assert(attr < VERT_RESULT_MAX);
17607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
17707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 -
17807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                FRAG_ATTRIB_TEX0 +
17907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                attr -
18007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                VERT_RESULT_VAR0);
18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
182f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
183f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
184f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
18507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
186f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
187509d9eb686411254b24139012b7594e10a760b6cBrian Paul
18807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellstruct st_vp_varient *
18907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st,
19007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp,
19107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            const struct st_vp_varient_key *key)
19207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
19307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct st_vp_varient *vpv = CALLOC_STRUCT(st_vp_varient);
19407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct pipe_context *pipe = st->pipe;
195a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   struct ureg_program *ureg;
196a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
197a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
198a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   if (ureg == NULL)
199a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      return NULL;
200a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
201a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   error =
2024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell      st_translate_mesa_program(st->ctx,
2034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                TGSI_PROCESSOR_VERTEX,
204a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell                                ureg,
2054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                &stvp->Base.Base,
2064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                /* inputs */
20707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                stvp->num_inputs,
2084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                stvp->input_to_index,
209b44b70dc114ddcfb4d359759928df4d7b9efaafbKeith Whitwell                                NULL, /* input semantic name */
210b44b70dc114ddcfb4d359759928df4d7b9efaafbKeith Whitwell                                NULL, /* input semantic index */
2114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                NULL,
2124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                /* outputs */
21307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                stvp->num_outputs,
21407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                stvp->result_to_output,
21507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                stvp->output_semantic_name,
21607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                stvp->output_semantic_index );
21725b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
218a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   if (ret)
219a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      goto fail;
220a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
221a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   /* Edgeflags will be the last input:
222a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell    */
223a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   if (key.passthrough_edgeflags) {
224a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      ureg_MOV( ureg,
225a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell                ureg_DECL_output( ureg, TGSI_SEMANTIC_EDGEFLAG, 0 ),
226a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell                ureg_DECL_next_vs_input(ureg));
227a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   }
228a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
229a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   tokens = ureg_get_tokens( ureg, NULL );
230a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
231a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
23207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->state);
233f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
234b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
235633e1133aeed04df650b97c8d25a041014fd6f5eBrian      _mesa_print_program(&stvp->Base.Base);
236b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
237b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
238633e1133aeed04df650b97c8d25a041014fd6f5eBrian
239b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
24007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      tgsi_dump( vpv->state.tokens, 0 );
241b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
242b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
24307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
24407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   return vpv;
245a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
246a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail:
247a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
248a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   return NULL;
249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
250f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa fragment shader into a TGSI shader.
255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param inputMapping  to map fragment program input registers to TGSI
256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *                      input slots
257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
258f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
259b456f1374fc958e53efc80ee38ef343f580c1d6bBrian Paulvoid
260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st,
261f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                              struct st_fragment_program *stfp,
262339e7ec6805e6de8794514c0a935081b5d36d38fBrian                              const GLuint inputMapping[])
263f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
264339e7ec6805e6de8794514c0a935081b5d36d38fBrian   struct pipe_context *pipe = st->pipe;
265f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint outputMapping[FRAG_RESULT_MAX];
266f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint defaultInputMapping[FRAG_ATTRIB_MAX];
267f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint interpMode[16];  /* XXX size? */
268f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint attr;
269e785f190f0d49f0367f7468c22b77962d0f14ea0Brian   const GLbitfield inputsRead = stfp->Base.Base.InputsRead;
270a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   struct ureg_program *ureg;
271e785f190f0d49f0367f7468c22b77962d0f14ea0Brian   GLuint vslot = 0;
272f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
273fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul   uint fs_num_inputs = 0;
274fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
275fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul   ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
276fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul   ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
277fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul   uint fs_num_outputs = 0;
278fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
279e785f190f0d49f0367f7468c22b77962d0f14ea0Brian   /* which vertex output goes to the first fragment input: */
280e785f190f0d49f0367f7468c22b77962d0f14ea0Brian   if (inputsRead & FRAG_BIT_WPOS)
281e785f190f0d49f0367f7468c22b77962d0f14ea0Brian      vslot = 0;
282e785f190f0d49f0367f7468c22b77962d0f14ea0Brian   else
283e785f190f0d49f0367f7468c22b77962d0f14ea0Brian      vslot = 1;
284e785f190f0d49f0367f7468c22b77962d0f14ea0Brian
285f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
286f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Convert Mesa program inputs to TGSI input register semantics.
287f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
288f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
289f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      if (inputsRead & (1 << attr)) {
290fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul         const GLuint slot = fs_num_inputs;
291f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
292f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         defaultInputMapping[attr] = slot;
293f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
294ecd50ef58b034e604ff6b2fedbb0815953e510eaBrian         stfp->input_map[slot] = vslot++;
295e785f190f0d49f0367f7468c22b77962d0f14ea0Brian
296fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul         fs_num_inputs++;
297e785f190f0d49f0367f7468c22b77962d0f14ea0Brian
298f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
299f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_WPOS:
300e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul            stfp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
301e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul            stfp->input_semantic_index[slot] = 0;
302e785f190f0d49f0367f7468c22b77962d0f14ea0Brian            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
303f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
304f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_COL0:
305e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul            stfp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
306e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul            stfp->input_semantic_index[slot] = 0;
307f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
308f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
309f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_COL1:
310e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul            stfp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
311e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul            stfp->input_semantic_index[slot] = 1;
312f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
313f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
3149d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul         case FRAG_ATTRIB_FOGC:
3159d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
3169d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            stfp->input_semantic_index[slot] = 0;
3179d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
3189d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            break;
3199d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul         case FRAG_ATTRIB_FACE:
3209d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
32107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stfp->input_semantic_index[slot] = 0;
3229d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
3239d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            break;
32407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
32507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            /* In most cases, there is nothing special about these
32607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * inputs, so adopt a convention to use the generic
32707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * semantic name and the mesa FRAG_ATTRIB_ number as the
32807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * index.
32907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             *
33007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * All that is required is that the vertex shader labels
33107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * its own outputs similarly, and that the vertex shader
33207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * generates at least every output required by the
33307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * fragment shader plus fixed-function hardware (such as
33407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * BFC).
33507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             *
33607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * There is no requirement that semantic indexes start at
33707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * zero or be restricted to a particular range -- nobody
33807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * should be building tables based on semantic index.
33907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             */
340f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX0:
341f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX1:
342f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX2:
343f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX3:
344f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX4:
345f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX5:
346f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX6:
347f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX7:
34807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         case FRAG_ATTRIB_PNTC:
349f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_VAR0:
350f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
35107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            /* Actually, let's try and zero-base this just for
35207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * readability of the generated TGSI.
35307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             */
35407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            assert(attr >= FRAG_ATTRIB_TEX0);
35507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stfp->input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
356e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul            stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
357f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
35807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
359f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
360f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
361f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
362f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
363f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
364bc139a19b00f8686caa8db7c56af2087f26e369aBrian    * Semantics and mapping for outputs
365f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
366635c4c41bdf111462939da292d65328595d314e8Brian   {
367635c4c41bdf111462939da292d65328595d314e8Brian      uint numColors = 0;
3685606dfb572bf4b89b4882265924705bacc8c182bIan Romanick      GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
369635c4c41bdf111462939da292d65328595d314e8Brian
370bc139a19b00f8686caa8db7c56af2087f26e369aBrian      /* if z is written, emit that first */
3718d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul      if (outputsWritten & (1 << FRAG_RESULT_DEPTH)) {
372fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul         fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
373fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul         fs_output_semantic_index[fs_num_outputs] = 0;
3748d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul         outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
375fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul         fs_num_outputs++;
3768d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul         outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
377635c4c41bdf111462939da292d65328595d314e8Brian      }
378635c4c41bdf111462939da292d65328595d314e8Brian
379bc139a19b00f8686caa8db7c56af2087f26e369aBrian      /* handle remaning outputs (color) */
380635c4c41bdf111462939da292d65328595d314e8Brian      for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
381635c4c41bdf111462939da292d65328595d314e8Brian         if (outputsWritten & (1 << attr)) {
382635c4c41bdf111462939da292d65328595d314e8Brian            switch (attr) {
3838d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul            case FRAG_RESULT_DEPTH:
384bc139a19b00f8686caa8db7c56af2087f26e369aBrian               /* handled above */
385635c4c41bdf111462939da292d65328595d314e8Brian               assert(0);
386635c4c41bdf111462939da292d65328595d314e8Brian               break;
387af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca            default:
388af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca               assert(attr == FRAG_RESULT_COLOR ||
389af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca                      (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
390fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul               fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
391fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul               fs_output_semantic_index[fs_num_outputs] = numColors;
392fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul               outputMapping[attr] = fs_num_outputs;
393635c4c41bdf111462939da292d65328595d314e8Brian               numColors++;
394635c4c41bdf111462939da292d65328595d314e8Brian               break;
395635c4c41bdf111462939da292d65328595d314e8Brian            }
396c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
397fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul            fs_num_outputs++;
398f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
399f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
400f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
401f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
402f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   if (!inputMapping)
403f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      inputMapping = defaultInputMapping;
404f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
405a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
406a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   if (ureg == NULL)
407a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      return NULL;
408a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
409a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
4104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell   stfp->state.tokens =
4114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell      st_translate_mesa_program(st->ctx,
4124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                TGSI_PROCESSOR_FRAGMENT,
4134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                &stfp->Base.Base,
4144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                /* inputs */
4154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                fs_num_inputs,
4164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                inputMapping,
4174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                stfp->input_semantic_name,
4184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                stfp->input_semantic_index,
4194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                interpMode,
4204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                /* outputs */
4214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                fs_num_outputs,
4224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                outputMapping,
4234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                fs_output_semantic_name,
4249953fe4cb48b02a0d75735b88173f0ed170a77f2Keith Whitwell                                fs_output_semantic_index );
4254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell
4264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell   stfp->driver_shader = pipe->create_fs_state(pipe, &stfp->state);
427f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
428b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
429633e1133aeed04df650b97c8d25a041014fd6f5eBrian      _mesa_print_program(&stfp->Base.Base);
430b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
431b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
432633e1133aeed04df650b97c8d25a041014fd6f5eBrian
433b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
4344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell      tgsi_dump( stfp->state.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
435b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
436b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
437f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
438f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
439678f80b347801d925c07a774faee1ed3f716de15Brian Paul
440678f80b347801d925c07a774faee1ed3f716de15Brian Paul/**
441678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text
442678f80b347801d925c07a774faee1ed3f716de15Brian Paul */
443678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid
444678f80b347801d925c07a774faee1ed3f716de15Brian Paulst_print_shaders(GLcontext *ctx)
445678f80b347801d925c07a774faee1ed3f716de15Brian Paul{
446678f80b347801d925c07a774faee1ed3f716de15Brian Paul   struct gl_shader_program *shProg = ctx->Shader.CurrentProgram;
447678f80b347801d925c07a774faee1ed3f716de15Brian Paul   if (shProg) {
448678f80b347801d925c07a774faee1ed3f716de15Brian Paul      GLuint i;
449678f80b347801d925c07a774faee1ed3f716de15Brian Paul      for (i = 0; i < shProg->NumShaders; i++) {
450678f80b347801d925c07a774faee1ed3f716de15Brian Paul         printf("GLSL shader %u of %u:\n", i, shProg->NumShaders);
451678f80b347801d925c07a774faee1ed3f716de15Brian Paul         printf("%s\n", shProg->Shaders[i]->Source);
452678f80b347801d925c07a774faee1ed3f716de15Brian Paul      }
453678f80b347801d925c07a774faee1ed3f716de15Brian Paul   }
454678f80b347801d925c07a774faee1ed3f716de15Brian Paul}
455