st_program.c revision 80424700574e128070f457d79e1920d512a1efda
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"
36edc09358f72cd48cb2315daf23c82e7646aeaea3Vinson Lee#include "main/mfeatures.h"
37b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/mtypes.h"
383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "program/prog_parameter.h"
39ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_print.h"
40ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/programopt.h"
41f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
42f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h"
43f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h"
44abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h"
456acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h"
46c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h"
471b8aa2176c4fc580cc31c57c7e50e7f39ef2cc04Vinson Lee#include "tgsi/tgsi_ureg.h"
48f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
49b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "st_debug.h"
503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_bitmap.h"
513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_drawpixels.h"
52f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h"
53f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h"
54ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h"
55339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h"
56f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
578468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul
588468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul
598468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/**
60aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a vertex program variant.  Note the caller must unlink
61aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
633d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
64aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_vp_variant(struct st_context *st, struct st_vp_variant *vpv)
653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (vpv->driver_shader)
673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_vertex_shader(st->cso_context, vpv->driver_shader);
683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if FEATURE_feedback || FEATURE_rastpos
703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (vpv->draw_shader)
713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      draw_delete_vertex_shader( st->draw, vpv->draw_shader );
723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#endif
733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (vpv->tgsi.tokens)
753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      st_free_tokens(vpv->tgsi.tokens);
763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE( vpv );
783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
838468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations:
848468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */
8507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid
86aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_vp_variants( struct st_context *st,
8707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                        struct st_vertex_program *stvp )
8807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
89aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv;
9007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
91aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (vpv = stvp->variants; vpv; ) {
92aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_vp_variant *next = vpv->next;
93aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_vp_variant(st, vpv);
943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      vpv = next;
953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
9607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
97aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stvp->variants = NULL;
983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
103aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a fragment program variant.  Note the caller must unlink
104aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
1053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1063d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
107aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_fp_variant(struct st_context *st, struct st_fp_variant *fpv)
1083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (fpv->driver_shader)
1103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_fragment_shader(st->cso_context, fpv->driver_shader);
11180424700574e128070f457d79e1920d512a1efdaThomas Hellstrom   if (fpv->parameters)
11280424700574e128070f457d79e1920d512a1efdaThomas Hellstrom      _mesa_free_parameter_list(fpv->parameters);
11307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE(fpv);
1153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
119aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a fragment program.
1203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1213d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
122aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp)
1233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
124aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
1253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
126aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; ) {
127aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_fp_variant *next = fpv->next;
128aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_fp_variant(st, fpv);
1293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = next;
1303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
1313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
132aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stfp->variants = NULL;
1333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
137aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a geometry program variant.  Note the caller must unlink
138aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
1393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1403d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
141aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_gp_variant(struct st_context *st, struct st_gp_variant *gpv)
1423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (gpv->driver_shader)
1443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_geometry_shader(st->cso_context, gpv->driver_shader);
14507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE(gpv);
1473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
14807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
151aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a geometry program.
1523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1533d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
154aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp)
1553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
156aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
1573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
158aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; ) {
159aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_gp_variant *next = gpv->next;
160aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_gp_variant(st, gpv);
1613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = next;
16207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   }
16307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
164aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stgp->variants = NULL;
16507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
16607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
16707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
16807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
169f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader.
172e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping  to map vertex program output registers (VERT_RESULT_x)
173e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul *       to TGSI output slots
174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut  destination for TGSI tokens
175f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
176f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
1773d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
17807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st,
17907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp)
180f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   GLuint attr;
182c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
18307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_inputs = 0;
18407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_outputs = 0;
185f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
186f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs   if (stvp->Base.IsPositionInvariant)
187f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs      _mesa_insert_mvp_code(st->ctx, &stvp->Base);
188f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs
189325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell   assert(stvp->Base.Base.NumInstructions > 1);
190325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell
191f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Determine number of inputs, the mappings between VERT_ATTRIB_x
193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * and TGSI generic input indexes, plus input attrib semantic info.
194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
195f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
196f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      if (stvp->Base.Base.InputsRead & (1 << attr)) {
19707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->input_to_index[attr] = stvp->num_inputs;
19807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->index_to_input[stvp->num_inputs] = attr;
19907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->num_inputs++;
200f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
201f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
20250caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   /* bit of a hack, presetup potentially unused edgeflag input */
20350caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs;
20450caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG;
205f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
20607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /* Compute mapping of vertex program outputs to slots.
207f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
208f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
209b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs      if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) {
21007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = ~0;
21107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      }
21207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      else {
21307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         unsigned slot = stvp->num_outputs++;
21407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
21507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = slot;
216f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
217f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
218f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_HPOS:
21907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
22007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
221f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
222f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL0:
22307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
22407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
225f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
226f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL1:
22707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
22807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
229f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
230f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC0:
23107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
23207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
233f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
234f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC1:
23507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
23607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
237f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
238f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_FOGC:
23907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
24007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
241f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
242f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_PSIZ:
24307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
24407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
245f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
246f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_EDGE:
247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(0);
248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
24907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
250f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX0:
251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX1:
252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX2:
253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX3:
254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX4:
255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX5:
256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX6:
257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX7:
25807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
25907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
26007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
26107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
262f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_VAR0:
263f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
26407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            assert(attr < VERT_RESULT_MAX);
26507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
26607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 -
26707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                FRAG_ATTRIB_TEX0 +
26807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                attr -
26907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                VERT_RESULT_VAR0);
27007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
271f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
272f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
273f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
274890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   /* similar hack to above, presetup potentially unused edgeflag output */
275890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs;
276890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG;
277890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_index[stvp->num_outputs] = 0;
27807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
279f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
280509d9eb686411254b24139012b7594e10a760b6cBrian Paul
2813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
282aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a vertex program to create a new variant.
2833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
284aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_vp_variant *
28507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st,
28607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp,
287aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                            const struct st_vp_variant_key *key)
28807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
289aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant);
29007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct pipe_context *pipe = st->pipe;
291a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   struct ureg_program *ureg;
292a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   enum pipe_error error;
293890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   unsigned num_outputs;
294a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
2953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   st_prepare_vertex_program( st, stvp );
2963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
29783baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT);
29883baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING);
29983baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
300a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
301b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   if (ureg == NULL) {
302b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee      FREE(vpv);
303a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      return NULL;
304b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   }
305a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
306c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák   vpv->key = *key;
307c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák
30850caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   vpv->num_inputs = stvp->num_inputs;
309890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   num_outputs = stvp->num_outputs;
310890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   if (key->passthrough_edgeflags) {
311890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      vpv->num_inputs++;
312890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      num_outputs++;
313890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   }
314a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
315ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul   if (ST_DEBUG & DEBUG_MESA) {
316ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      _mesa_print_program(&stvp->Base.Base);
317ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      _mesa_print_program_parameters(st->ctx, &stvp->Base.Base);
318ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      debug_printf("\n");
319ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul   }
320ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul
32183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul   error = st_translate_mesa_program(st->ctx,
32283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     TGSI_PROCESSOR_VERTEX,
32383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     ureg,
32483d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     &stvp->Base.Base,
32583d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     /* inputs */
32683d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     vpv->num_inputs,
32783d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->input_to_index,
32883d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     NULL, /* input semantic name */
32983d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     NULL, /* input semantic index */
33083d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     NULL,
33183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     /* outputs */
33283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     num_outputs,
33383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->result_to_output,
33483d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->output_semantic_name,
33583d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->output_semantic_index,
33683d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     key->passthrough_edgeflags );
33725b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
338a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   if (error)
339a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      goto fail;
340a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
341b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL );
342b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   if (!vpv->tgsi.tokens)
3439d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger      goto fail;
3449d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
345a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
34625b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
347b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
348f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
349b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
350b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( vpv->tgsi.tokens, 0 );
351b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
352b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
35307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
35407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   return vpv;
355a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
356a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail:
3579d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);
3589d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   _mesa_print_program(&stvp->Base.Base);
3599d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_assert(0);
3609d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
361a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
362a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   return NULL;
363f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
364f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
365f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
3663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
367aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant.
3683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
369aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant *
370aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st,
3713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_vertex_program *stvp,
372aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_vp_variant_key *key)
3733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
374aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv;
3753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
376aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
377aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (vpv = stvp->variants; vpv; vpv = vpv->next) {
3783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&vpv->key, key, sizeof(*key)) == 0) {
3793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
3803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
3813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
3823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
3833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!vpv) {
3843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create now */
3853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      vpv = st_translate_vertex_program(st, stvp, key);
3863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (vpv) {
3873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
388aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         vpv->next = stvp->variants;
389aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stvp->variants = vpv;
3903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
3913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
3923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
3933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return vpv;
3943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
3953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
396f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
397f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
3983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in
3993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key.
4003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return  new fragment program variant
401f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
402aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant *
403f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st,
4043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_fragment_program *stfp,
405aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_fp_variant_key *key)
406f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
407339e7ec6805e6de8794514c0a935081b5d36d38fBrian   struct pipe_context *pipe = st->pipe;
408aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
409f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
410aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   if (!variant)
4113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
412fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
4133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   assert(!(key->bitmap && key->drawpixels));
414fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
415c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#if FEATURE_drawpix
4163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (key->bitmap) {
4173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glBitmap drawing */
4185cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp; /* we free this temp program below */
41983baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
4203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      st_make_bitmap_fragment_program(st, &stfp->Base,
421aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                                      &fp, &variant->bitmap_sampler);
422f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
423aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
42443125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
4253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
4263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   else if (key->drawpixels) {
4273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glDrawPixels drawing */
4285cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp; /* we free this temp program below */
429e785f190f0d49f0367f7468c22b77962d0f14ea0Brian
4303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (key->drawpixels_z || key->drawpixels_stencil) {
4313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z,
4323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                                key->drawpixels_stencil);
433f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
434e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      else {
4353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* RGBA */
4363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         st_make_drawpix_fragment_program(st, &stfp->Base, &fp);
437aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
438e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      }
43943125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
440f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
441c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#endif
442f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
4433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!stfp->tgsi.tokens) {
4443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* need to translate Mesa instructions to TGSI now */
4453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint outputMapping[FRAG_RESULT_MAX];
4463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint inputMapping[FRAG_ATTRIB_MAX];
4473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint interpMode[PIPE_MAX_SHADER_INPUTS];  /* XXX size? */
4483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint attr;
4493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      enum pipe_error error;
4503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      const GLbitfield inputsRead = stfp->Base.Base.InputsRead;
4513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      struct ureg_program *ureg;
45207498075b5de14955958da44a90eb7ee203218a1Dave Airlie      GLboolean write_all = GL_FALSE;
453635c4c41bdf111462939da292d65328595d314e8Brian
4543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
4553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
4563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      uint fs_num_inputs = 0;
4573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
4593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
4603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      uint fs_num_outputs = 0;
4613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
4643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /*
4663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       * Convert Mesa program inputs to TGSI input register semantics.
4673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       */
4683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
4693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         if (inputsRead & (1 << attr)) {
4703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            const GLuint slot = fs_num_inputs++;
4713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            inputMapping[attr] = slot;
473ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie
474635c4c41bdf111462939da292d65328595d314e8Brian            switch (attr) {
4753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_WPOS:
4763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
4773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
4793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_COL0:
4813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
4823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
4843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_COL1:
4863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
4873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 1;
4883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
4893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_FOGC:
4913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
4923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
494635c4c41bdf111462939da292d65328595d314e8Brian               break;
4953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_FACE:
4963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
4973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
4993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
5003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* In most cases, there is nothing special about these
5013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * inputs, so adopt a convention to use the generic
5023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * semantic name and the mesa FRAG_ATTRIB_ number as the
5033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * index.
5043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                *
5053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * All that is required is that the vertex shader labels
5063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * its own outputs similarly, and that the vertex shader
5073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * generates at least every output required by the
5083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * fragment shader plus fixed-function hardware (such as
5093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * BFC).
5103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                *
5113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * There is no requirement that semantic indexes start at
5123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * zero or be restricted to a particular range -- nobody
5133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * should be building tables based on semantic index.
5143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                */
5153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_PNTC:
5163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX0:
5173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX1:
5183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX2:
5193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX3:
5203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX4:
5213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX5:
5223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX6:
5233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX7:
5243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_VAR0:
525af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca            default:
5263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* Actually, let's try and zero-base this just for
5273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * readability of the generated TGSI.
5283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                */
5293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               assert(attr >= FRAG_ATTRIB_TEX0);
5303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
5313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
5323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               if (attr == FRAG_ATTRIB_PNTC)
5333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
5343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               else
5353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
536635c4c41bdf111462939da292d65328595d314e8Brian               break;
537635c4c41bdf111462939da292d65328595d314e8Brian            }
5383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
5393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         else {
5403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            inputMapping[attr] = -1;
5413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
5423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
5433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /*
5453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       * Semantics and mapping for outputs
5463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       */
5473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
5483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         uint numColors = 0;
5493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
5503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* if z is written, emit that first */
5523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
5533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
5543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_index[fs_num_outputs] = 0;
5553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
5563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_num_outputs++;
5573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
5583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
559c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
5603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
5613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
5623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_index[fs_num_outputs] = 0;
5633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
564fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul            fs_num_outputs++;
5653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
5663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
5673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* handle remaning outputs (color) */
5693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
5703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (outputsWritten & BITFIELD64_BIT(attr)) {
5713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               switch (attr) {
5723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               case FRAG_RESULT_DEPTH:
5733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               case FRAG_RESULT_STENCIL:
5743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  /* handled above */
5753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  assert(0);
5763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  break;
57707498075b5de14955958da44a90eb7ee203218a1Dave Airlie               case FRAG_RESULT_COLOR:
57807498075b5de14955958da44a90eb7ee203218a1Dave Airlie                  write_all = GL_TRUE; /* fallthrough */
5793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               default:
5803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  assert(attr == FRAG_RESULT_COLOR ||
5813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                         (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
5823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
5833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  fs_output_semantic_index[fs_num_outputs] = numColors;
5843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  outputMapping[attr] = fs_num_outputs;
5853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  numColors++;
5863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  break;
5873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               }
5883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               fs_num_outputs++;
5903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
591f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
592f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
593f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
5943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
5953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (ureg == NULL)
5963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         return NULL;
597a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
5983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (ST_DEBUG & DEBUG_MESA) {
5993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         _mesa_print_program(&stfp->Base.Base);
6003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
6013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         debug_printf("\n");
6023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
60307498075b5de14955958da44a90eb7ee203218a1Dave Airlie      if (write_all == GL_TRUE)
60407498075b5de14955958da44a90eb7ee203218a1Dave Airlie         ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
605a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
6063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      error = st_translate_mesa_program(st->ctx,
6073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        TGSI_PROCESSOR_FRAGMENT,
6083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        ureg,
6093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        &stfp->Base.Base,
6103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        /* inputs */
6113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_num_inputs,
6123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        inputMapping,
6133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        input_semantic_name,
6143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        input_semantic_index,
6153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        interpMode,
6163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        /* outputs */
6173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_num_outputs,
6183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        outputMapping,
6193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_output_semantic_name,
6203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_output_semantic_index, FALSE );
6213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
6233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ureg_destroy( ureg );
6243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
6254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell
626aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in variant */
627aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   variant->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi);
628aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   variant->key = *key;
629f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
630b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
631b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
632b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
633b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
6343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6355cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul#if FEATURE_drawpix
6365cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul   if (key->bitmap || key->drawpixels) {
6375cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      /* Free the temporary program made above */
6385cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp = &stfp->Base;
6395cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      _mesa_reference_fragprog(st->ctx, &fp, NULL);
6405cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul   }
6415cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul#endif
6425cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul
643aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   return variant;
644f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
645f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
6463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
6483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed.
6493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
650aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant *
651aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st,
6523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_fragment_program *stfp,
653aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_fp_variant_key *key)
6543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
655aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
6563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
657aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
658aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; fpv = fpv->next) {
6593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&fpv->key, key, sizeof(*key)) == 0) {
6603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
6613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
6623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
6633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!fpv) {
6653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
6663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = st_translate_fragment_program(st, stfp, key);
6673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (fpv) {
6683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
669aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         fpv->next = stfp->variants;
670aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stfp->variants = fpv;
6713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
6723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
6733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return fpv;
6753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
6763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
679aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant.
6803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
681aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant *
682da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st,
6833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_geometry_program *stgp,
684aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_gp_variant_key *key)
685da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
686da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint inputMapping[GEOM_ATTRIB_MAX];
687da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint outputMapping[GEOM_RESULT_MAX];
688da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct pipe_context *pipe = st->pipe;
689da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   enum pipe_error error;
690da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint attr;
691da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   const GLbitfield inputsRead = stgp->Base.Base.InputsRead;
692da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint vslot = 0;
693da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint num_generic = 0;
694da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
695da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_inputs = 0;
696da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_builtin_inputs = 0;
697da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_array_offset = 0;
698da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
699da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
700da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
701da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_outputs = 0;
702da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
703da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLint i;
704da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint maxSlot = 0;
705da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct ureg_program *ureg;
706da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
707aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
7083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
709aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   gpv = CALLOC_STRUCT(st_gp_variant);
7103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv)
7113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
7123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
71383baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT);
71483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING);
71583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
716da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY );
717da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ureg == NULL) {
7183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      FREE(gpv);
7193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
720da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
721da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
722da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* which vertex output goes to the first geometry input */
7237c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   vslot = 0;
724da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
725425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(inputMapping, 0, sizeof(inputMapping));
726425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(outputMapping, 0, sizeof(outputMapping));
727425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin
728da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
729da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Convert Mesa program inputs to TGSI input register semantics.
730da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
731da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) {
732da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (inputsRead & (1 << attr)) {
733da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         const GLuint slot = gs_num_inputs;
734da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
735da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_inputs++;
736da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
737da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         inputMapping[attr] = slot;
738da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
739da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs;
740da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_to_index[attr] = vslot;
741da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->index_to_input[vslot] = attr;
742da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         ++vslot;
743da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
7447c42390453e611367cf1ba11446692ec04e0abfbZack Rusin         if (attr != GEOM_ATTRIB_PRIMITIVE_ID) {
745da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_array_offset += 2;
746da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         } else
747da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            ++gs_builtin_inputs;
748da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
7493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0
750da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         debug_printf("input map at %d = %d\n",
751da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]);
752da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
753da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
754da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
755da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_PRIMITIVE_ID:
756da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID;
757da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
758da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
759da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_POSITION:
760da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
761da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
762da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
763da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR0:
764da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
765da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
766da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
767da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR1:
768da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
769da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 1;
770da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
771da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_FOG_FRAG_COORD:
772da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
773da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
774da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
775da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_TEX_COORD:
776da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
777da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
778da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
779da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_VAR0:
780da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
781da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
782da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
783da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
784da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
785da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
786da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
787da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
788da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* initialize output semantics to defaults */
789da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
790da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
791da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_index[i] = 0;
792da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
793da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
794da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   num_generic = 0;
795da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
796da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Determine number of outputs, the (default) output register
797da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * mapping and the semantic information for each output.
798da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
799da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
800da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (stgp->Base.Base.OutputsWritten & (1 << attr)) {
801da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         GLuint slot;
802da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
803da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         slot = gs_num_outputs;
804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_outputs++;
805da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         outputMapping[attr] = slot;
806da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
807da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_POS:
809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot == 0);
810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
812da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL0:
814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL1:
818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL0:
822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
824da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
825da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL1:
826da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
827da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
828da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
829da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_FOGC:
830da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
831da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
832da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
833da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_PSIZ:
834da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
835da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
836da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX0:
838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX1:
839da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX2:
840da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX3:
841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX4:
842da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX5:
843da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX6:
844da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX7:
845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
846da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_VAR0:
847da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
848da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot < Elements(gs_output_semantic_name));
850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* use default semantic info */
851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = num_generic++;
853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
854da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION);
858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* find max output slot referenced to compute gs_num_outputs */
860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot)
862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         maxSlot = outputMapping[attr];
863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   gs_num_outputs = maxSlot + 1;
865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
866da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */
867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   {
868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      GLuint i;
869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("outputMapping? %d\n", outputMapping ? 1 : 0);
870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping) {
871da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf("attr -> slot\n");
872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         for (i = 0; i < 16;  i++) {
873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            printf(" %2d       %3d\n", i, outputMapping[i]);
874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("slot    sem_name  sem_index\n");
877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      for (i = 0; i < gs_num_outputs; i++) {
878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf(" %2d         %d         %d\n",
879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                i,
880da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_name[i],
881da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_index[i]);
882da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
883da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
884da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
885da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
886da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* free old shader state, if any */
887da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (stgp->tgsi.tokens) {
888da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      st_free_tokens(stgp->tgsi.tokens);
889da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      stgp->tgsi.tokens = NULL;
890da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
891da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
892da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_input_prim(ureg, stgp->Base.InputType);
893da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
894da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
895da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
8963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   error = st_translate_mesa_program(st->ctx,
8973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     TGSI_PROCESSOR_GEOMETRY,
8983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     ureg,
8993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     &stgp->Base.Base,
9003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     /* inputs */
9013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_num_inputs,
9023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     inputMapping,
9033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     stgp->input_semantic_name,
9043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     stgp->input_semantic_index,
9053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     NULL,
9063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     /* outputs */
9073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_num_outputs,
9083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     outputMapping,
9093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_output_semantic_name,
9103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_output_semantic_index,
9113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     FALSE);
912da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
913da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->num_inputs = gs_num_inputs;
914da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
915da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_destroy( ureg );
9163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
917aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in new variant */
9183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
9193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->key = *key;
920da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
921da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
922da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      _mesa_print_program(&stgp->Base.Base);
923da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
924da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
925da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
926da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ST_DEBUG & DEBUG_TGSI) {
927da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      tgsi_dump(stgp->tgsi.tokens, 0);
928da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
929da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
9303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
9323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
9333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
9363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant.
9373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
938aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant *
939aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st,
9403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_geometry_program *stgp,
941aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_gp_variant_key *key)
9423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
943aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
9443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
945aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
946aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; gpv = gpv->next) {
9473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&gpv->key, key, sizeof(*key)) == 0) {
9483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
9493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
9503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
9513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv) {
9533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
9543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = st_translate_geometry_program(st, stgp, key);
9553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (gpv) {
9563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
957aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         gpv->next = stgp->variants;
958aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stgp->variants = gpv;
9593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
9603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
9613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
963da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin}
964678f80b347801d925c07a774faee1ed3f716de15Brian Paul
9653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
968678f80b347801d925c07a774faee1ed3f716de15Brian Paul/**
969678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text
970678f80b347801d925c07a774faee1ed3f716de15Brian Paul */
971678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid
972f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx)
973678f80b347801d925c07a774faee1ed3f716de15Brian Paul{
97484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   struct gl_shader_program *shProg[3] = {
97584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentVertexProgram,
97684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentGeometryProgram,
97784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentFragmentProgram,
97884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   };
97984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   unsigned j;
98084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
98184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   for (j = 0; j < 3; j++) {
98284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      unsigned i;
98384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
98484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      if (shProg[j] == NULL)
98584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 continue;
98684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
98784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      for (i = 0; i < shProg[j]->NumShaders; i++) {
98884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 struct gl_shader *sh;
98984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
99084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 switch (shProg[j]->Shaders[i]->Type) {
99184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_VERTEX_SHADER:
99284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 0) ? NULL : shProg[j]->Shaders[i];
99384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
99484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_GEOMETRY_SHADER_ARB:
99584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 1) ? NULL : shProg[j]->Shaders[i];
99684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
99784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_FRAGMENT_SHADER:
99884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 2) ? NULL : shProg[j]->Shaders[i];
99984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
1000a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	 default:
1001a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    assert(0);
1002a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    sh = NULL;
1003a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    break;
100484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
100584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
100684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 if (sh != NULL) {
100784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders);
100884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("%s\n", sh->Source);
100984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
1010678f80b347801d925c07a774faee1ed3f716de15Brian Paul      }
1011678f80b347801d925c07a774faee1ed3f716de15Brian Paul   }
1012678f80b347801d925c07a774faee1ed3f716de15Brian Paul}
10133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
10163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants.  Free all the
10173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context.
10183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
10193d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
10203d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program)
10213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
10223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!program)
10233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return;
10243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (program->Target) {
10263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_PROGRAM_ARB:
10273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
10283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_vertex_program *stvp = (struct st_vertex_program *) program;
1029aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_vp_variant *vpv, **prevPtr = &stvp->variants;
10303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1031aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (vpv = stvp->variants; vpv; ) {
1032aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_vp_variant *next = vpv->next;
10333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (vpv->key.st == st) {
10343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1035a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
10363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1037aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_vp_variant(st, vpv);
10383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1040a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &vpv->next;
10413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            vpv = next;
10433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
10443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
10463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_PROGRAM_ARB:
10473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
10483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_fragment_program *stfp =
10493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            (struct st_fragment_program *) program;
1050aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_fp_variant *fpv, **prevPtr = &stfp->variants;
10513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1052aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (fpv = stfp->variants; fpv; ) {
1053aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_fp_variant *next = fpv->next;
10543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (fpv->key.st == st) {
10553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1056a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
10573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1058aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_fp_variant(st, fpv);
10593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1061a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &fpv->next;
10623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fpv = next;
10643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
10653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
1067c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul   case MESA_GEOMETRY_PROGRAM:
1068c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      {
1069c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         struct st_geometry_program *stgp =
1070c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            (struct st_geometry_program *) program;
1071aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_gp_variant *gpv, **prevPtr = &stgp->variants;
1072c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul
1073aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (gpv = stgp->variants; gpv; ) {
1074aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_gp_variant *next = gpv->next;
1075c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            if (gpv->key.st == st) {
1076c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* unlink from list */
1077a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
1078c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* destroy this variant */
1079aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_gp_variant(st, gpv);
1080c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1081c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            else {
1082a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &gpv->next;
1083c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1084c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            gpv = next;
1085c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         }
1086c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      }
1087c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      break;
10883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
10893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      _mesa_problem(NULL, "Unexpected program target in "
10903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                    "destroy_program_variants_cb()");
10913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
10923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
10933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
10963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the shader's program variants
10973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context.
10983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
10993d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
11003d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData)
11013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
11033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_shader *shader = (struct gl_shader *) data;
11043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (shader->Type) {
11063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_SHADER_PROGRAM_MESA:
11073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct gl_shader_program *shProg = (struct gl_shader_program *) data;
11093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         GLuint i;
11103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         for (i = 0; i < shProg->NumShaders; i++) {
11123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            destroy_program_variants(st, shProg->Shaders[i]->Program);
11133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
11143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, (struct gl_program *)
11163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                  shProg->VertexProgram);
11173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, (struct gl_program *)
11183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                  shProg->FragmentProgram);
11193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, (struct gl_program *)
11203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                  shProg->GeometryProgram);
11213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
11233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_SHADER:
11243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_SHADER:
11253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_GEOMETRY_SHADER:
11263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, shader->Program);
11283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
11303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
11313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      assert(0);
11323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
11333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
11343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
11373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the program variants which match
11383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context.
11393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
11403d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
11413d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData)
11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_program *program = (struct gl_program *) data;
11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   destroy_program_variants(st, program);
11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
11473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
11503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which
11513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context.
11523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down.
11533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
11543d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
11553d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st)
11563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* ARB vert/frag program */
11583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->Programs,
11593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_program_variants_cb, st);
11603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* GLSL vert/frag/geom shaders */
11623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->ShaderObjects,
11633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_shader_program_variants_cb, st);
11643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1165