st_program.c revision aa5ba96d294698809186cc4b59034abbd3076812
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"
353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "main/hash.h"
36b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/mtypes.h"
373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "program/prog_parameter.h"
38ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_print.h"
39ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/programopt.h"
40f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
41f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h"
42f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h"
43abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h"
446acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h"
45c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h"
461b8aa2176c4fc580cc31c57c7e50e7f39ef2cc04Vinson Lee#include "tgsi/tgsi_ureg.h"
47f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
48b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "st_debug.h"
493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_bitmap.h"
503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_drawpixels.h"
51f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h"
52f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h"
53ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h"
54339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h"
55f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
568468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul
578468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul
588468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/**
59aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a vertex program variant.  Note the caller must unlink
60aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
623d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
63aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_vp_variant(struct st_context *st, struct st_vp_variant *vpv)
643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (vpv->driver_shader)
663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_vertex_shader(st->cso_context, vpv->driver_shader);
673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if FEATURE_feedback || FEATURE_rastpos
693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (vpv->draw_shader)
703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      draw_delete_vertex_shader( st->draw, vpv->draw_shader );
713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#endif
723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (vpv->tgsi.tokens)
743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      st_free_tokens(vpv->tgsi.tokens);
753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE( vpv );
773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
828468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations:
838468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */
8407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid
85aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_vp_variants( struct st_context *st,
8607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                        struct st_vertex_program *stvp )
8707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
88aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv;
8907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
90aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (vpv = stvp->variants; vpv; ) {
91aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_vp_variant *next = vpv->next;
92aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_vp_variant(st, vpv);
933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      vpv = next;
943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
9507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
96aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stvp->variants = NULL;
973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
102aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a fragment program variant.  Note the caller must unlink
103aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
1043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1053d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
106aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_fp_variant(struct st_context *st, struct st_fp_variant *fpv)
1073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (fpv->driver_shader)
1093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_fragment_shader(st->cso_context, fpv->driver_shader);
11007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE(fpv);
1123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
116aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a fragment program.
1173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1183d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
119aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp)
1203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
121aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
1223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
123aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; ) {
124aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_fp_variant *next = fpv->next;
125aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_fp_variant(st, fpv);
1263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = next;
1273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
1283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
129aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stfp->variants = NULL;
1303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
134aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a geometry program variant.  Note the caller must unlink
135aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
1363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1373d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
138aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_gp_variant(struct st_context *st, struct st_gp_variant *gpv)
1393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (gpv->driver_shader)
1413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_geometry_shader(st->cso_context, gpv->driver_shader);
14207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE(gpv);
1443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
14507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
148aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a geometry program.
1493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1503d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
151aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp)
1523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
153aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
1543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
155aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; ) {
156aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_gp_variant *next = gpv->next;
157aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_gp_variant(st, gpv);
1583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = next;
15907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   }
16007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
161aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stgp->variants = NULL;
16207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
16307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
16407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
16507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
166f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader.
169e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping  to map vertex program output registers (VERT_RESULT_x)
170e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul *       to TGSI output slots
171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut  destination for TGSI tokens
172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
1743d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
17507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st,
17607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp)
177f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
17807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   GLuint attr;
179c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
18007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_inputs = 0;
18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_outputs = 0;
182f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
183f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs   if (stvp->Base.IsPositionInvariant)
184f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs      _mesa_insert_mvp_code(st->ctx, &stvp->Base);
185f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs
186325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell   assert(stvp->Base.Base.NumInstructions > 1);
187325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell
188f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
189f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Determine number of inputs, the mappings between VERT_ATTRIB_x
190f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * and TGSI generic input indexes, plus input attrib semantic info.
191f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      if (stvp->Base.Base.InputsRead & (1 << attr)) {
19407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->input_to_index[attr] = stvp->num_inputs;
19507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->index_to_input[stvp->num_inputs] = attr;
19607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->num_inputs++;
197f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
198f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
19950caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   /* bit of a hack, presetup potentially unused edgeflag input */
20050caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs;
20150caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG;
202f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
20307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /* Compute mapping of vertex program outputs to slots.
204f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
205f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
206b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs      if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) {
20707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = ~0;
20807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      }
20907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      else {
21007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         unsigned slot = stvp->num_outputs++;
21107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
21207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = slot;
213f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
214f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
215f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_HPOS:
21607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
21707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
218f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL0:
22007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
22107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
222f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL1:
22407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
22507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
226f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC0:
22807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
22907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
230f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC1:
23207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
23307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
234f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_FOGC:
23607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
23707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
238f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_PSIZ:
24007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
24107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
242f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_EDGE:
244f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(0);
245f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
24607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX0:
248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX1:
249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX2:
250f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX3:
251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX4:
252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX5:
253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX6:
254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX7:
25507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
25607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
25707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
25807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
259f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_VAR0:
260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
26107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            assert(attr < VERT_RESULT_MAX);
26207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
26307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 -
26407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                FRAG_ATTRIB_TEX0 +
26507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                attr -
26607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                VERT_RESULT_VAR0);
26707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
268f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
269f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
270f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
271890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   /* similar hack to above, presetup potentially unused edgeflag output */
272890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs;
273890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG;
274890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_index[stvp->num_outputs] = 0;
27507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
276f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
277509d9eb686411254b24139012b7594e10a760b6cBrian Paul
2783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
279aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a vertex program to create a new variant.
2803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
281aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_vp_variant *
28207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st,
28307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp,
284aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                            const struct st_vp_variant_key *key)
28507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
286aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant);
28707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct pipe_context *pipe = st->pipe;
288a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   struct ureg_program *ureg;
289a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   enum pipe_error error;
290890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   unsigned num_outputs;
291a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
2923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   st_prepare_vertex_program( st, stvp );
2933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
29483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT);
29583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING);
29683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
297a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
298b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   if (ureg == NULL) {
299b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee      FREE(vpv);
300a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      return NULL;
301b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   }
302a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
303c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák   vpv->key = *key;
304c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák
30550caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   vpv->num_inputs = stvp->num_inputs;
306890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   num_outputs = stvp->num_outputs;
307890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   if (key->passthrough_edgeflags) {
308890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      vpv->num_inputs++;
309890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      num_outputs++;
310890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   }
311a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
312ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul   if (ST_DEBUG & DEBUG_MESA) {
313ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      _mesa_print_program(&stvp->Base.Base);
314ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      _mesa_print_program_parameters(st->ctx, &stvp->Base.Base);
315ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      debug_printf("\n");
316ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul   }
317ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul
31883d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul   error = st_translate_mesa_program(st->ctx,
31983d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     TGSI_PROCESSOR_VERTEX,
32083d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     ureg,
32183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     &stvp->Base.Base,
32283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     /* inputs */
32383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     vpv->num_inputs,
32483d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->input_to_index,
32583d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     NULL, /* input semantic name */
32683d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     NULL, /* input semantic index */
32783d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     NULL,
32883d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     /* outputs */
32983d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     num_outputs,
33083d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->result_to_output,
33183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->output_semantic_name,
33283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->output_semantic_index,
33383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     key->passthrough_edgeflags );
33425b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
335a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   if (error)
336a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      goto fail;
337a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
338b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL );
339b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   if (!vpv->tgsi.tokens)
3409d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger      goto fail;
3419d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
342a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
34325b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
344b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
345f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
346b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
347b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( vpv->tgsi.tokens, 0 );
348b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
349b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
35007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
35107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   return vpv;
352a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
353a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail:
3549d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);
3559d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   _mesa_print_program(&stvp->Base.Base);
3569d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_assert(0);
3579d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
358a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
359a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   return NULL;
360f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
361f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
362f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
3633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
364aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant.
3653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
366aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant *
367aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st,
3683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_vertex_program *stvp,
369aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_vp_variant_key *key)
3703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
371aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv;
3723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
373aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
374aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (vpv = stvp->variants; vpv; vpv = vpv->next) {
3753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&vpv->key, key, sizeof(*key)) == 0) {
3763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
3773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
3783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
3793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
3803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!vpv) {
3813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create now */
3823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      vpv = st_translate_vertex_program(st, stvp, key);
3833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (vpv) {
3843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
385aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         vpv->next = stvp->variants;
386aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stvp->variants = vpv;
3873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
3883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
3893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
3903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return vpv;
3913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
3923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
393f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
394f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
3953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in
3963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key.
3973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return  new fragment program variant
398f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
399aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant *
400f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st,
4013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_fragment_program *stfp,
402aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_fp_variant_key *key)
403f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
404339e7ec6805e6de8794514c0a935081b5d36d38fBrian   struct pipe_context *pipe = st->pipe;
405aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
406f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
407aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   if (!variant)
4083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
409fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
4103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   assert(!(key->bitmap && key->drawpixels));
411fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
4123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (key->bitmap) {
4133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glBitmap drawing */
4143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      struct gl_fragment_program *fp;
41583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
4163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      st_make_bitmap_fragment_program(st, &stfp->Base,
417aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                                      &fp, &variant->bitmap_sampler);
418f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
419aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
42043125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
4213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
4223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   else if (key->drawpixels) {
4233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glDrawPixels drawing */
4243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      struct gl_fragment_program *fp;
425e785f190f0d49f0367f7468c22b77962d0f14ea0Brian
4263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (key->drawpixels_z || key->drawpixels_stencil) {
4273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z,
4283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                                key->drawpixels_stencil);
429f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
430e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      else {
4313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* RGBA */
4323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         st_make_drawpix_fragment_program(st, &stfp->Base, &fp);
433aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
434e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      }
43543125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
436f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
437f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
4383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!stfp->tgsi.tokens) {
4393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* need to translate Mesa instructions to TGSI now */
4403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint outputMapping[FRAG_RESULT_MAX];
4413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint inputMapping[FRAG_ATTRIB_MAX];
4423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint interpMode[PIPE_MAX_SHADER_INPUTS];  /* XXX size? */
4433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint attr;
4443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      enum pipe_error error;
4453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      const GLbitfield inputsRead = stfp->Base.Base.InputsRead;
4463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      struct ureg_program *ureg;
447635c4c41bdf111462939da292d65328595d314e8Brian
4483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
4493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
4503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      uint fs_num_inputs = 0;
4513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
4533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
4543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      uint fs_num_outputs = 0;
4553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
4583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /*
4603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       * Convert Mesa program inputs to TGSI input register semantics.
4613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       */
4623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
4633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         if (inputsRead & (1 << attr)) {
4643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            const GLuint slot = fs_num_inputs++;
4653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            inputMapping[attr] = slot;
467ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie
468635c4c41bdf111462939da292d65328595d314e8Brian            switch (attr) {
4693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_WPOS:
4703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
4713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
4733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_COL0:
4753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
4763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
4783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_COL1:
4803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
4813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 1;
4823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
4833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_FOGC:
4853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
4863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
488635c4c41bdf111462939da292d65328595d314e8Brian               break;
4893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_FACE:
4903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
4913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
4933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* In most cases, there is nothing special about these
4953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * inputs, so adopt a convention to use the generic
4963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * semantic name and the mesa FRAG_ATTRIB_ number as the
4973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * index.
4983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                *
4993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * All that is required is that the vertex shader labels
5003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * its own outputs similarly, and that the vertex shader
5013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * generates at least every output required by the
5023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * fragment shader plus fixed-function hardware (such as
5033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * BFC).
5043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                *
5053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * There is no requirement that semantic indexes start at
5063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * zero or be restricted to a particular range -- nobody
5073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * should be building tables based on semantic index.
5083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                */
5093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_PNTC:
5103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX0:
5113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX1:
5123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX2:
5133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX3:
5143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX4:
5153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX5:
5163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX6:
5173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX7:
5183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_VAR0:
519af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca            default:
5203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* Actually, let's try and zero-base this just for
5213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * readability of the generated TGSI.
5223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                */
5233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               assert(attr >= FRAG_ATTRIB_TEX0);
5243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
5253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
5263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               if (attr == FRAG_ATTRIB_PNTC)
5273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
5283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               else
5293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
530635c4c41bdf111462939da292d65328595d314e8Brian               break;
531635c4c41bdf111462939da292d65328595d314e8Brian            }
5323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
5333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         else {
5343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            inputMapping[attr] = -1;
5353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
5363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
5373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /*
5393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       * Semantics and mapping for outputs
5403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       */
5413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
5423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         uint numColors = 0;
5433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
5443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* if z is written, emit that first */
5463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
5473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
5483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_index[fs_num_outputs] = 0;
5493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
5503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_num_outputs++;
5513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
5523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
553c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
5543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
5553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
5563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_index[fs_num_outputs] = 0;
5573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
558fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul            fs_num_outputs++;
5593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
5603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
5613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* handle remaning outputs (color) */
5633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
5643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (outputsWritten & BITFIELD64_BIT(attr)) {
5653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               switch (attr) {
5663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               case FRAG_RESULT_DEPTH:
5673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               case FRAG_RESULT_STENCIL:
5683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  /* handled above */
5693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  assert(0);
5703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  break;
5713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               default:
5723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  assert(attr == FRAG_RESULT_COLOR ||
5733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                         (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
5743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
5753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  fs_output_semantic_index[fs_num_outputs] = numColors;
5763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  outputMapping[attr] = fs_num_outputs;
5773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  numColors++;
5783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  break;
5793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               }
5803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               fs_num_outputs++;
5823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
583f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
584f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
585f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
5863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
5873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (ureg == NULL)
5883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         return NULL;
589a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
5903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (ST_DEBUG & DEBUG_MESA) {
5913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         _mesa_print_program(&stfp->Base.Base);
5923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
5933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         debug_printf("\n");
5943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
595a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
5963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      error = st_translate_mesa_program(st->ctx,
5973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        TGSI_PROCESSOR_FRAGMENT,
5983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        ureg,
5993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        &stfp->Base.Base,
6003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        /* inputs */
6013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_num_inputs,
6023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        inputMapping,
6033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        input_semantic_name,
6043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        input_semantic_index,
6053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        interpMode,
6063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        /* outputs */
6073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_num_outputs,
6083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        outputMapping,
6093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_output_semantic_name,
6103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_output_semantic_index, FALSE );
6113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
6133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ureg_destroy( ureg );
6143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
6154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell
616aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in variant */
617aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   variant->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi);
618aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   variant->key = *key;
619f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
620b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
621b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
622b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
623b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
6243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
625aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   return variant;
626f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
627f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
6283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
6303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed.
6313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
632aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant *
633aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st,
6343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_fragment_program *stfp,
635aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_fp_variant_key *key)
6363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
637aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
6383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
639aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
640aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; fpv = fpv->next) {
6413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&fpv->key, key, sizeof(*key)) == 0) {
6423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
6433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
6443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
6453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!fpv) {
6473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
6483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = st_translate_fragment_program(st, stfp, key);
6493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (fpv) {
6503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
651aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         fpv->next = stfp->variants;
652aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stfp->variants = fpv;
6533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
6543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
6553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return fpv;
6573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
6583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
661aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant.
6623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
663aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant *
664da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st,
6653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_geometry_program *stgp,
666aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_gp_variant_key *key)
667da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
668da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint inputMapping[GEOM_ATTRIB_MAX];
669da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint outputMapping[GEOM_RESULT_MAX];
670da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct pipe_context *pipe = st->pipe;
671da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   enum pipe_error error;
672da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint attr;
673da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   const GLbitfield inputsRead = stgp->Base.Base.InputsRead;
674da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint vslot = 0;
675da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint num_generic = 0;
676da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
677da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_inputs = 0;
678da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_builtin_inputs = 0;
679da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_array_offset = 0;
680da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
681da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
682da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
683da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_outputs = 0;
684da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
685da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLint i;
686da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint maxSlot = 0;
687da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct ureg_program *ureg;
688da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
689aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
6903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
691aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   gpv = CALLOC_STRUCT(st_gp_variant);
6923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv)
6933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
6943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
69583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT);
69683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING);
69783baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
698da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY );
699da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ureg == NULL) {
7003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      FREE(gpv);
7013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
702da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
703da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
704da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* which vertex output goes to the first geometry input */
7057c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   vslot = 0;
706da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
707425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(inputMapping, 0, sizeof(inputMapping));
708425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(outputMapping, 0, sizeof(outputMapping));
709425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin
710da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
711da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Convert Mesa program inputs to TGSI input register semantics.
712da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
713da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) {
714da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (inputsRead & (1 << attr)) {
715da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         const GLuint slot = gs_num_inputs;
716da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
717da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_inputs++;
718da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
719da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         inputMapping[attr] = slot;
720da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
721da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs;
722da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_to_index[attr] = vslot;
723da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->index_to_input[vslot] = attr;
724da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         ++vslot;
725da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
7267c42390453e611367cf1ba11446692ec04e0abfbZack Rusin         if (attr != GEOM_ATTRIB_PRIMITIVE_ID) {
727da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_array_offset += 2;
728da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         } else
729da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            ++gs_builtin_inputs;
730da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
7313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0
732da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         debug_printf("input map at %d = %d\n",
733da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]);
734da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
735da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
736da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
737da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_PRIMITIVE_ID:
738da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID;
739da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
740da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
741da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_POSITION:
742da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
743da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
744da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
745da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR0:
746da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
747da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
748da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
749da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR1:
750da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
751da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 1;
752da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
753da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_FOG_FRAG_COORD:
754da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
755da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
756da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
757da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_TEX_COORD:
758da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
759da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
760da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
761da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_VAR0:
762da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
763da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
764da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
765da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
766da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
767da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
768da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
769da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
770da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* initialize output semantics to defaults */
771da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
772da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
773da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_index[i] = 0;
774da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
775da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
776da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   num_generic = 0;
777da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
778da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Determine number of outputs, the (default) output register
779da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * mapping and the semantic information for each output.
780da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
781da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
782da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (stgp->Base.Base.OutputsWritten & (1 << attr)) {
783da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         GLuint slot;
784da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
785da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         slot = gs_num_outputs;
786da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_outputs++;
787da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         outputMapping[attr] = slot;
788da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
789da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
790da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_POS:
791da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot == 0);
792da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
793da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
794da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
795da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL0:
796da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
797da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
798da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
799da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL1:
800da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
801da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
802da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
803da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL0:
804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
805da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
806da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
807da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL1:
808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_FOGC:
812da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_PSIZ:
816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX0:
820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX1:
821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX2:
822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX3:
823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX4:
824da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX5:
825da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX6:
826da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX7:
827da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
828da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_VAR0:
829da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
830da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
831da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot < Elements(gs_output_semantic_name));
832da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* use default semantic info */
833da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
834da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = num_generic++;
835da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
836da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
839da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION);
840da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* find max output slot referenced to compute gs_num_outputs */
842da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
843da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot)
844da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         maxSlot = outputMapping[attr];
845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
846da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   gs_num_outputs = maxSlot + 1;
847da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
848da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */
849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   {
850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      GLuint i;
851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("outputMapping? %d\n", outputMapping ? 1 : 0);
852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping) {
853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf("attr -> slot\n");
854da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         for (i = 0; i < 16;  i++) {
855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            printf(" %2d       %3d\n", i, outputMapping[i]);
856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("slot    sem_name  sem_index\n");
859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      for (i = 0; i < gs_num_outputs; i++) {
860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf(" %2d         %d         %d\n",
861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                i,
862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_name[i],
863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_index[i]);
864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
866da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* free old shader state, if any */
869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (stgp->tgsi.tokens) {
870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      st_free_tokens(stgp->tgsi.tokens);
871da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      stgp->tgsi.tokens = NULL;
872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_input_prim(ureg, stgp->Base.InputType);
875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
8783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   error = st_translate_mesa_program(st->ctx,
8793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     TGSI_PROCESSOR_GEOMETRY,
8803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     ureg,
8813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     &stgp->Base.Base,
8823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     /* inputs */
8833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_num_inputs,
8843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     inputMapping,
8853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     stgp->input_semantic_name,
8863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     stgp->input_semantic_index,
8873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     NULL,
8883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     /* outputs */
8893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_num_outputs,
8903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     outputMapping,
8913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_output_semantic_name,
8923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_output_semantic_index,
8933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     FALSE);
894da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
895da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->num_inputs = gs_num_inputs;
896da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
897da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_destroy( ureg );
8983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
899aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in new variant */
9003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
9013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->key = *key;
902da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
903da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
904da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      _mesa_print_program(&stgp->Base.Base);
905da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
906da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
907da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
908da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ST_DEBUG & DEBUG_TGSI) {
909da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      tgsi_dump(stgp->tgsi.tokens, 0);
910da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
911da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
9123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
9143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
9153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
9183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant.
9193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
920aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant *
921aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st,
9223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_geometry_program *stgp,
923aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_gp_variant_key *key)
9243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
925aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
9263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
927aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
928aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; gpv = gpv->next) {
9293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&gpv->key, key, sizeof(*key)) == 0) {
9303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
9313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
9323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
9333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv) {
9353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
9363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = st_translate_geometry_program(st, stgp, key);
9373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (gpv) {
9383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
939aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         gpv->next = stgp->variants;
940aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stgp->variants = gpv;
9413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
9423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
9433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
945da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin}
946678f80b347801d925c07a774faee1ed3f716de15Brian Paul
9473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
950678f80b347801d925c07a774faee1ed3f716de15Brian Paul/**
951678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text
952678f80b347801d925c07a774faee1ed3f716de15Brian Paul */
953678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid
954f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx)
955678f80b347801d925c07a774faee1ed3f716de15Brian Paul{
95684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   struct gl_shader_program *shProg[3] = {
95784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentVertexProgram,
95884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentGeometryProgram,
95984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentFragmentProgram,
96084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   };
96184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   unsigned j;
96284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
96384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   for (j = 0; j < 3; j++) {
96484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      unsigned i;
96584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
96684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      if (shProg[j] == NULL)
96784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 continue;
96884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
96984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      for (i = 0; i < shProg[j]->NumShaders; i++) {
97084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 struct gl_shader *sh;
97184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
97284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 switch (shProg[j]->Shaders[i]->Type) {
97384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_VERTEX_SHADER:
97484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 0) ? NULL : shProg[j]->Shaders[i];
97584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
97684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_GEOMETRY_SHADER_ARB:
97784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 1) ? NULL : shProg[j]->Shaders[i];
97884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
97984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_FRAGMENT_SHADER:
98084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 2) ? NULL : shProg[j]->Shaders[i];
98184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
982a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	 default:
983a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    assert(0);
984a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    sh = NULL;
985a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    break;
98684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
98784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
98884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 if (sh != NULL) {
98984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders);
99084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("%s\n", sh->Source);
99184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
992678f80b347801d925c07a774faee1ed3f716de15Brian Paul      }
993678f80b347801d925c07a774faee1ed3f716de15Brian Paul   }
994678f80b347801d925c07a774faee1ed3f716de15Brian Paul}
9953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
9983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants.  Free all the
9993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context.
10003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
10013d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
10023d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program)
10033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
10043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!program)
10053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return;
10063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (program->Target) {
10083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_PROGRAM_ARB:
10093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
10103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_vertex_program *stvp = (struct st_vertex_program *) program;
1011aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_vp_variant *vpv, **prevPtr = &stvp->variants;
10123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1013aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (vpv = stvp->variants; vpv; ) {
1014aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_vp_variant *next = vpv->next;
10153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (vpv->key.st == st) {
10163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1017a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
10183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1019aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_vp_variant(st, vpv);
10203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1022a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &vpv->next;
10233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            vpv = next;
10253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
10263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
10283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_PROGRAM_ARB:
10293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
10303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_fragment_program *stfp =
10313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            (struct st_fragment_program *) program;
1032aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_fp_variant *fpv, **prevPtr = &stfp->variants;
10333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1034aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (fpv = stfp->variants; fpv; ) {
1035aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_fp_variant *next = fpv->next;
10363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (fpv->key.st == st) {
10373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1038a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
10393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1040aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_fp_variant(st, fpv);
10413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1043a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &fpv->next;
10443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fpv = next;
10463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
10473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
1049c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul   case MESA_GEOMETRY_PROGRAM:
1050c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      {
1051c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         struct st_geometry_program *stgp =
1052c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            (struct st_geometry_program *) program;
1053aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_gp_variant *gpv, **prevPtr = &stgp->variants;
1054c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul
1055aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (gpv = stgp->variants; gpv; ) {
1056aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_gp_variant *next = gpv->next;
1057c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            if (gpv->key.st == st) {
1058c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* unlink from list */
1059a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
1060c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* destroy this variant */
1061aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_gp_variant(st, gpv);
1062c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1063c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            else {
1064a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &gpv->next;
1065c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1066c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            gpv = next;
1067c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         }
1068c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      }
1069c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      break;
10703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
10713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      _mesa_problem(NULL, "Unexpected program target in "
10723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                    "destroy_program_variants_cb()");
10733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
10743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
10753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
10783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the shader's program variants
10793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context.
10803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
10813d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
10823d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData)
10833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
10843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
10853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_shader *shader = (struct gl_shader *) data;
10863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (shader->Type) {
10883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_SHADER_PROGRAM_MESA:
10893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
10903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct gl_shader_program *shProg = (struct gl_shader_program *) data;
10913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         GLuint i;
10923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         for (i = 0; i < shProg->NumShaders; i++) {
10943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            destroy_program_variants(st, shProg->Shaders[i]->Program);
10953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
10963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, (struct gl_program *)
10983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                  shProg->VertexProgram);
10993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, (struct gl_program *)
11003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                  shProg->FragmentProgram);
11013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, (struct gl_program *)
11023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                  shProg->GeometryProgram);
11033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
11053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_SHADER:
11063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_SHADER:
11073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_GEOMETRY_SHADER:
11083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, shader->Program);
11103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
11123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
11133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      assert(0);
11143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
11153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
11163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
11193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the program variants which match
11203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context.
11213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
11223d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
11233d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData)
11243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
11263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_program *program = (struct gl_program *) data;
11273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   destroy_program_variants(st, program);
11283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
11293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
11323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which
11333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context.
11343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down.
11353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
11363d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
11373d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st)
11383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* ARB vert/frag program */
11403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->Programs,
11413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_program_variants_cb, st);
11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* GLSL vert/frag/geom shaders */
11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->ShaderObjects,
11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_shader_program_variants_cb, st);
11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1147