st_program.c revision edc09358f72cd48cb2315daf23c82e7646aeaea3
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);
11107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE(fpv);
1133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
117aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a fragment program.
1183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1193d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
120aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp)
1213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
122aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
1233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
124aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; ) {
125aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_fp_variant *next = fpv->next;
126aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_fp_variant(st, fpv);
1273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = next;
1283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
1293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
130aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stfp->variants = NULL;
1313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
135aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a geometry program variant.  Note the caller must unlink
136aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
1373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1383d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
139aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_gp_variant(struct st_context *st, struct st_gp_variant *gpv)
1403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (gpv->driver_shader)
1423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_geometry_shader(st->cso_context, gpv->driver_shader);
14307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE(gpv);
1453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
14607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
149aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a geometry program.
1503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1513d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
152aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp)
1533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
154aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
1553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
156aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; ) {
157aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_gp_variant *next = gpv->next;
158aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_gp_variant(st, gpv);
1593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = next;
16007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   }
16107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
162aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stgp->variants = NULL;
16307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
16407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
16507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
16607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
169f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader.
170e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping  to map vertex program output registers (VERT_RESULT_x)
171e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul *       to TGSI output slots
172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut  destination for TGSI tokens
173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
1753d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
17607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st,
17707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp)
178f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
17907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   GLuint attr;
180c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_inputs = 0;
18207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_outputs = 0;
183f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
184f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs   if (stvp->Base.IsPositionInvariant)
185f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs      _mesa_insert_mvp_code(st->ctx, &stvp->Base);
186f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs
187325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell   assert(stvp->Base.Base.NumInstructions > 1);
188325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell
189f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
190f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Determine number of inputs, the mappings between VERT_ATTRIB_x
191f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * and TGSI generic input indexes, plus input attrib semantic info.
192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      if (stvp->Base.Base.InputsRead & (1 << attr)) {
19507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->input_to_index[attr] = stvp->num_inputs;
19607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->index_to_input[stvp->num_inputs] = attr;
19707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->num_inputs++;
198f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
199f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
20050caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   /* bit of a hack, presetup potentially unused edgeflag input */
20150caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs;
20250caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG;
203f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
20407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /* Compute mapping of vertex program outputs to slots.
205f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
206f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
207b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs      if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) {
20807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = ~0;
20907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      }
21007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      else {
21107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         unsigned slot = stvp->num_outputs++;
21207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
21307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = slot;
214f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
215f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
216f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_HPOS:
21707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
21807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
220f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL0:
22107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
22207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
224f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL1:
22507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
22607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
228f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC0:
22907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
23007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
232f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC1:
23307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
23407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
236f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_FOGC:
23707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
23807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
240f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_PSIZ:
24107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
24207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
244f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_EDGE:
245f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(0);
246f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
24707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX0:
249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX1:
250f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX2:
251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX3:
252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX4:
253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX5:
254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX6:
255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX7:
25607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
25707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
25807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
25907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_VAR0:
261f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
26207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            assert(attr < VERT_RESULT_MAX);
26307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
26407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 -
26507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                FRAG_ATTRIB_TEX0 +
26607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                attr -
26707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                VERT_RESULT_VAR0);
26807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
269f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
270f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
271f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
272890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   /* similar hack to above, presetup potentially unused edgeflag output */
273890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs;
274890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG;
275890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_index[stvp->num_outputs] = 0;
27607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
277f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
278509d9eb686411254b24139012b7594e10a760b6cBrian Paul
2793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
280aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a vertex program to create a new variant.
2813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
282aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_vp_variant *
28307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st,
28407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp,
285aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                            const struct st_vp_variant_key *key)
28607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
287aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant);
28807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct pipe_context *pipe = st->pipe;
289a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   struct ureg_program *ureg;
290a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   enum pipe_error error;
291890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   unsigned num_outputs;
292a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
2933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   st_prepare_vertex_program( st, stvp );
2943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
29583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT);
29683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING);
29783baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
298a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
299b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   if (ureg == NULL) {
300b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee      FREE(vpv);
301a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      return NULL;
302b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   }
303a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
304c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák   vpv->key = *key;
305c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák
30650caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   vpv->num_inputs = stvp->num_inputs;
307890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   num_outputs = stvp->num_outputs;
308890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   if (key->passthrough_edgeflags) {
309890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      vpv->num_inputs++;
310890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      num_outputs++;
311890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   }
312a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
313ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul   if (ST_DEBUG & DEBUG_MESA) {
314ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      _mesa_print_program(&stvp->Base.Base);
315ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      _mesa_print_program_parameters(st->ctx, &stvp->Base.Base);
316ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      debug_printf("\n");
317ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul   }
318ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul
31983d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul   error = st_translate_mesa_program(st->ctx,
32083d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     TGSI_PROCESSOR_VERTEX,
32183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     ureg,
32283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     &stvp->Base.Base,
32383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     /* inputs */
32483d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     vpv->num_inputs,
32583d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->input_to_index,
32683d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     NULL, /* input semantic name */
32783d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     NULL, /* input semantic index */
32883d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     NULL,
32983d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     /* outputs */
33083d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     num_outputs,
33183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->result_to_output,
33283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->output_semantic_name,
33383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     stvp->output_semantic_index,
33483d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul                                     key->passthrough_edgeflags );
33525b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
336a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   if (error)
337a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      goto fail;
338a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
339b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL );
340b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   if (!vpv->tgsi.tokens)
3419d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger      goto fail;
3429d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
343a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
34425b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
345b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
346f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
347b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
348b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( vpv->tgsi.tokens, 0 );
349b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
350b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
35107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
35207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   return vpv;
353a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
354a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail:
3559d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);
3569d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   _mesa_print_program(&stvp->Base.Base);
3579d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_assert(0);
3589d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
359a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
360a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   return NULL;
361f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
362f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
363f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
3643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
365aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant.
3663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
367aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant *
368aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st,
3693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_vertex_program *stvp,
370aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_vp_variant_key *key)
3713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
372aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv;
3733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
374aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
375aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (vpv = stvp->variants; vpv; vpv = vpv->next) {
3763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&vpv->key, key, sizeof(*key)) == 0) {
3773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
3783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
3793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
3803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
3813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!vpv) {
3823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create now */
3833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      vpv = st_translate_vertex_program(st, stvp, key);
3843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (vpv) {
3853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
386aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         vpv->next = stvp->variants;
387aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stvp->variants = vpv;
3883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
3893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
3903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
3913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return vpv;
3923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
3933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
394f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
395f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
3963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in
3973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key.
3983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return  new fragment program variant
399f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
400aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant *
401f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st,
4023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_fragment_program *stfp,
403aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_fp_variant_key *key)
404f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
405339e7ec6805e6de8794514c0a935081b5d36d38fBrian   struct pipe_context *pipe = st->pipe;
406aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
407f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
408aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   if (!variant)
4093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
410fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
4113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   assert(!(key->bitmap && key->drawpixels));
412fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
413c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#if FEATURE_drawpix
4143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (key->bitmap) {
4153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glBitmap drawing */
4163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      struct gl_fragment_program *fp;
41783baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
4183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      st_make_bitmap_fragment_program(st, &stfp->Base,
419aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                                      &fp, &variant->bitmap_sampler);
420f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
421aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
42243125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
4233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
4243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   else if (key->drawpixels) {
4253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glDrawPixels drawing */
4263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      struct gl_fragment_program *fp;
427e785f190f0d49f0367f7468c22b77962d0f14ea0Brian
4283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (key->drawpixels_z || key->drawpixels_stencil) {
4293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z,
4303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                                key->drawpixels_stencil);
431f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
432e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      else {
4333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* RGBA */
4343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         st_make_drawpix_fragment_program(st, &stfp->Base, &fp);
435aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
436e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      }
43743125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
438f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
439c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#endif
440f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
4413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!stfp->tgsi.tokens) {
4423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* need to translate Mesa instructions to TGSI now */
4433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint outputMapping[FRAG_RESULT_MAX];
4443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint inputMapping[FRAG_ATTRIB_MAX];
4453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint interpMode[PIPE_MAX_SHADER_INPUTS];  /* XXX size? */
4463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      GLuint attr;
4473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      enum pipe_error error;
4483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      const GLbitfield inputsRead = stfp->Base.Base.InputsRead;
4493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      struct ureg_program *ureg;
45007498075b5de14955958da44a90eb7ee203218a1Dave Airlie      GLboolean write_all = GL_FALSE;
451635c4c41bdf111462939da292d65328595d314e8Brian
4523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
4533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
4543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      uint fs_num_inputs = 0;
4553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
4573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
4583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      uint fs_num_outputs = 0;
4593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
4623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /*
4643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       * Convert Mesa program inputs to TGSI input register semantics.
4653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       */
4663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
4673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         if (inputsRead & (1 << attr)) {
4683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            const GLuint slot = fs_num_inputs++;
4693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            inputMapping[attr] = slot;
471ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie
472635c4c41bdf111462939da292d65328595d314e8Brian            switch (attr) {
4733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_WPOS:
4743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
4753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
4773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_COL0:
4793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
4803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
4823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_COL1:
4843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
4853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 1;
4863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
4873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_FOGC:
4893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
4903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
492635c4c41bdf111462939da292d65328595d314e8Brian               break;
4933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_FACE:
4943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
4953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = 0;
4963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
4973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               break;
4983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* In most cases, there is nothing special about these
4993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * inputs, so adopt a convention to use the generic
5003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * semantic name and the mesa FRAG_ATTRIB_ number as the
5013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * index.
5023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                *
5033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * All that is required is that the vertex shader labels
5043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * its own outputs similarly, and that the vertex shader
5053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * generates at least every output required by the
5063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * fragment shader plus fixed-function hardware (such as
5073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * BFC).
5083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                *
5093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * There is no requirement that semantic indexes start at
5103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * zero or be restricted to a particular range -- nobody
5113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * should be building tables based on semantic index.
5123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                */
5133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_PNTC:
5143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX0:
5153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX1:
5163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX2:
5173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX3:
5183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX4:
5193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX5:
5203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX6:
5213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_TEX7:
5223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            case FRAG_ATTRIB_VAR0:
523af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca            default:
5243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* Actually, let's try and zero-base this just for
5253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                * readability of the generated TGSI.
5263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                */
5273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               assert(attr >= FRAG_ATTRIB_TEX0);
5283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
5293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
5303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               if (attr == FRAG_ATTRIB_PNTC)
5313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
5323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               else
5333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
534635c4c41bdf111462939da292d65328595d314e8Brian               break;
535635c4c41bdf111462939da292d65328595d314e8Brian            }
5363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
5373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         else {
5383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            inputMapping[attr] = -1;
5393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
5403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
5413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /*
5433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       * Semantics and mapping for outputs
5443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul       */
5453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
5463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         uint numColors = 0;
5473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
5483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* if z is written, emit that first */
5503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
5513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
5523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_index[fs_num_outputs] = 0;
5533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
5543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_num_outputs++;
5553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
5563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
557c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
5583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
5593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
5603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fs_output_semantic_index[fs_num_outputs] = 0;
5613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
562fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul            fs_num_outputs++;
5633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
5643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
5653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* handle remaning outputs (color) */
5673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
5683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (outputsWritten & BITFIELD64_BIT(attr)) {
5693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               switch (attr) {
5703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               case FRAG_RESULT_DEPTH:
5713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               case FRAG_RESULT_STENCIL:
5723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  /* handled above */
5733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  assert(0);
5743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  break;
57507498075b5de14955958da44a90eb7ee203218a1Dave Airlie               case FRAG_RESULT_COLOR:
57607498075b5de14955958da44a90eb7ee203218a1Dave Airlie                  write_all = GL_TRUE; /* fallthrough */
5773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               default:
5783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  assert(attr == FRAG_RESULT_COLOR ||
5793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                         (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
5803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
5813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  fs_output_semantic_index[fs_num_outputs] = numColors;
5823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  outputMapping[attr] = fs_num_outputs;
5833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  numColors++;
5843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  break;
5853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               }
5863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
5873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               fs_num_outputs++;
5883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
589f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
590f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
591f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
5923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
5933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (ureg == NULL)
5943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         return NULL;
595a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
5963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (ST_DEBUG & DEBUG_MESA) {
5973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         _mesa_print_program(&stfp->Base.Base);
5983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
5993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         debug_printf("\n");
6003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
60107498075b5de14955958da44a90eb7ee203218a1Dave Airlie      if (write_all == GL_TRUE)
60207498075b5de14955958da44a90eb7ee203218a1Dave Airlie         ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
603a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
6043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      error = st_translate_mesa_program(st->ctx,
6053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        TGSI_PROCESSOR_FRAGMENT,
6063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        ureg,
6073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        &stfp->Base.Base,
6083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        /* inputs */
6093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_num_inputs,
6103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        inputMapping,
6113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        input_semantic_name,
6123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        input_semantic_index,
6133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        interpMode,
6143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        /* outputs */
6153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_num_outputs,
6163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        outputMapping,
6173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_output_semantic_name,
6183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                        fs_output_semantic_index, FALSE );
6193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
6213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ureg_destroy( ureg );
6223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
6234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell
624aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in variant */
625aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   variant->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi);
626aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   variant->key = *key;
627f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
628b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
629b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
630b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
631b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
6323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
633aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   return variant;
634f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
635f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
6363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
6383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed.
6393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
640aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant *
641aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st,
6423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_fragment_program *stfp,
643aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_fp_variant_key *key)
6443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
645aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
6463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
647aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
648aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; fpv = fpv->next) {
6493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&fpv->key, key, sizeof(*key)) == 0) {
6503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
6513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
6523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
6533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!fpv) {
6553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
6563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = st_translate_fragment_program(st, stfp, key);
6573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (fpv) {
6583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
659aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         fpv->next = stfp->variants;
660aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stfp->variants = fpv;
6613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
6623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
6633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return fpv;
6653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
6663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
6683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
669aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant.
6703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
671aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant *
672da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st,
6733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_geometry_program *stgp,
674aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_gp_variant_key *key)
675da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
676da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint inputMapping[GEOM_ATTRIB_MAX];
677da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint outputMapping[GEOM_RESULT_MAX];
678da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct pipe_context *pipe = st->pipe;
679da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   enum pipe_error error;
680da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint attr;
681da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   const GLbitfield inputsRead = stgp->Base.Base.InputsRead;
682da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint vslot = 0;
683da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint num_generic = 0;
684da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
685da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_inputs = 0;
686da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_builtin_inputs = 0;
687da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_array_offset = 0;
688da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
689da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
690da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
691da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_outputs = 0;
692da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
693da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLint i;
694da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint maxSlot = 0;
695da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct ureg_program *ureg;
696da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
697aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
6983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
699aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   gpv = CALLOC_STRUCT(st_gp_variant);
7003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv)
7013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
7023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
70383baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT);
70483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING);
70583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
706da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY );
707da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ureg == NULL) {
7083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      FREE(gpv);
7093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
710da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
711da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
712da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* which vertex output goes to the first geometry input */
7137c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   vslot = 0;
714da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
715425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(inputMapping, 0, sizeof(inputMapping));
716425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(outputMapping, 0, sizeof(outputMapping));
717425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin
718da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
719da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Convert Mesa program inputs to TGSI input register semantics.
720da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
721da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) {
722da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (inputsRead & (1 << attr)) {
723da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         const GLuint slot = gs_num_inputs;
724da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
725da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_inputs++;
726da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
727da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         inputMapping[attr] = slot;
728da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
729da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs;
730da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_to_index[attr] = vslot;
731da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->index_to_input[vslot] = attr;
732da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         ++vslot;
733da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
7347c42390453e611367cf1ba11446692ec04e0abfbZack Rusin         if (attr != GEOM_ATTRIB_PRIMITIVE_ID) {
735da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_array_offset += 2;
736da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         } else
737da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            ++gs_builtin_inputs;
738da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
7393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0
740da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         debug_printf("input map at %d = %d\n",
741da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]);
742da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
743da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
744da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
745da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_PRIMITIVE_ID:
746da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID;
747da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
748da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
749da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_POSITION:
750da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
751da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
752da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
753da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR0:
754da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
755da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
756da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
757da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR1:
758da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
759da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 1;
760da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
761da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_FOG_FRAG_COORD:
762da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
763da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
764da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
765da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_TEX_COORD:
766da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
767da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
768da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
769da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_VAR0:
770da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
771da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
772da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
773da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
774da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
775da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
776da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
777da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
778da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* initialize output semantics to defaults */
779da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
780da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
781da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_index[i] = 0;
782da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
783da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
784da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   num_generic = 0;
785da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
786da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Determine number of outputs, the (default) output register
787da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * mapping and the semantic information for each output.
788da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
789da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
790da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (stgp->Base.Base.OutputsWritten & (1 << attr)) {
791da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         GLuint slot;
792da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
793da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         slot = gs_num_outputs;
794da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_outputs++;
795da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         outputMapping[attr] = slot;
796da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
797da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
798da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_POS:
799da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot == 0);
800da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
801da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
802da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
803da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL0:
804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
805da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
806da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
807da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL1:
808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL0:
812da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL1:
816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_FOGC:
820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_PSIZ:
824da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
825da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
826da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
827da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX0:
828da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX1:
829da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX2:
830da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX3:
831da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX4:
832da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX5:
833da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX6:
834da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX7:
835da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
836da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_VAR0:
837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
839da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot < Elements(gs_output_semantic_name));
840da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* use default semantic info */
841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
842da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = num_generic++;
843da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
844da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
846da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
847da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION);
848da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* find max output slot referenced to compute gs_num_outputs */
850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot)
852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         maxSlot = outputMapping[attr];
853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
854da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   gs_num_outputs = maxSlot + 1;
855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */
857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   {
858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      GLuint i;
859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("outputMapping? %d\n", outputMapping ? 1 : 0);
860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping) {
861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf("attr -> slot\n");
862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         for (i = 0; i < 16;  i++) {
863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            printf(" %2d       %3d\n", i, outputMapping[i]);
864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
866da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("slot    sem_name  sem_index\n");
867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      for (i = 0; i < gs_num_outputs; i++) {
868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf(" %2d         %d         %d\n",
869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                i,
870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_name[i],
871da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_index[i]);
872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* free old shader state, if any */
877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (stgp->tgsi.tokens) {
878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      st_free_tokens(stgp->tgsi.tokens);
879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      stgp->tgsi.tokens = NULL;
880da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
881da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
882da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_input_prim(ureg, stgp->Base.InputType);
883da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
884da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
885da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
8863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   error = st_translate_mesa_program(st->ctx,
8873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     TGSI_PROCESSOR_GEOMETRY,
8883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     ureg,
8893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     &stgp->Base.Base,
8903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     /* inputs */
8913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_num_inputs,
8923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     inputMapping,
8933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     stgp->input_semantic_name,
8943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     stgp->input_semantic_index,
8953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     NULL,
8963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     /* outputs */
8973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_num_outputs,
8983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     outputMapping,
8993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_output_semantic_name,
9003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     gs_output_semantic_index,
9013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                     FALSE);
902da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
903da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->num_inputs = gs_num_inputs;
904da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
905da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_destroy( ureg );
9063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
907aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in new variant */
9083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
9093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->key = *key;
910da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
911da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
912da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      _mesa_print_program(&stgp->Base.Base);
913da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
914da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
915da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
916da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ST_DEBUG & DEBUG_TGSI) {
917da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      tgsi_dump(stgp->tgsi.tokens, 0);
918da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
919da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
9203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
9223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
9233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
9263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant.
9273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
928aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant *
929aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st,
9303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_geometry_program *stgp,
931aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_gp_variant_key *key)
9323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
933aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
9343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
935aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
936aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; gpv = gpv->next) {
9373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&gpv->key, key, sizeof(*key)) == 0) {
9383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
9393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
9403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
9413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv) {
9433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
9443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = st_translate_geometry_program(st, stgp, key);
9453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (gpv) {
9463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
947aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         gpv->next = stgp->variants;
948aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stgp->variants = gpv;
9493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
9503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
9513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
953da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin}
954678f80b347801d925c07a774faee1ed3f716de15Brian Paul
9553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
9573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
958678f80b347801d925c07a774faee1ed3f716de15Brian Paul/**
959678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text
960678f80b347801d925c07a774faee1ed3f716de15Brian Paul */
961678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid
962f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx)
963678f80b347801d925c07a774faee1ed3f716de15Brian Paul{
96484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   struct gl_shader_program *shProg[3] = {
96584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentVertexProgram,
96684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentGeometryProgram,
96784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentFragmentProgram,
96884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   };
96984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   unsigned j;
97084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
97184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   for (j = 0; j < 3; j++) {
97284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      unsigned i;
97384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
97484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      if (shProg[j] == NULL)
97584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 continue;
97684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
97784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      for (i = 0; i < shProg[j]->NumShaders; i++) {
97884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 struct gl_shader *sh;
97984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
98084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 switch (shProg[j]->Shaders[i]->Type) {
98184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_VERTEX_SHADER:
98284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 0) ? NULL : shProg[j]->Shaders[i];
98384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
98484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_GEOMETRY_SHADER_ARB:
98584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 1) ? NULL : shProg[j]->Shaders[i];
98684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
98784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_FRAGMENT_SHADER:
98884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 2) ? NULL : shProg[j]->Shaders[i];
98984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
990a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	 default:
991a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    assert(0);
992a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    sh = NULL;
993a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    break;
99484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
99584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
99684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 if (sh != NULL) {
99784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders);
99884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("%s\n", sh->Source);
99984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
1000678f80b347801d925c07a774faee1ed3f716de15Brian Paul      }
1001678f80b347801d925c07a774faee1ed3f716de15Brian Paul   }
1002678f80b347801d925c07a774faee1ed3f716de15Brian Paul}
10033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
10063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants.  Free all the
10073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context.
10083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
10093d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
10103d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program)
10113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
10123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!program)
10133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return;
10143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (program->Target) {
10163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_PROGRAM_ARB:
10173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
10183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_vertex_program *stvp = (struct st_vertex_program *) program;
1019aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_vp_variant *vpv, **prevPtr = &stvp->variants;
10203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1021aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (vpv = stvp->variants; vpv; ) {
1022aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_vp_variant *next = vpv->next;
10233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (vpv->key.st == st) {
10243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1025a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
10263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1027aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_vp_variant(st, vpv);
10283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1030a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &vpv->next;
10313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            vpv = next;
10333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
10343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
10363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_PROGRAM_ARB:
10373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
10383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_fragment_program *stfp =
10393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            (struct st_fragment_program *) program;
1040aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_fp_variant *fpv, **prevPtr = &stfp->variants;
10413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1042aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (fpv = stfp->variants; fpv; ) {
1043aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_fp_variant *next = fpv->next;
10443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (fpv->key.st == st) {
10453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1046a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
10473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1048aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_fp_variant(st, fpv);
10493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1051a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &fpv->next;
10523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
10533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fpv = next;
10543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
10553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
1057c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul   case MESA_GEOMETRY_PROGRAM:
1058c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      {
1059c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         struct st_geometry_program *stgp =
1060c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            (struct st_geometry_program *) program;
1061aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_gp_variant *gpv, **prevPtr = &stgp->variants;
1062c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul
1063aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (gpv = stgp->variants; gpv; ) {
1064aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_gp_variant *next = gpv->next;
1065c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            if (gpv->key.st == st) {
1066c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* unlink from list */
1067a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
1068c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* destroy this variant */
1069aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_gp_variant(st, gpv);
1070c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1071c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            else {
1072a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &gpv->next;
1073c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1074c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            gpv = next;
1075c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         }
1076c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      }
1077c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      break;
10783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
10793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      _mesa_problem(NULL, "Unexpected program target in "
10803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                    "destroy_program_variants_cb()");
10813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
10823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
10833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
10863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the shader's program variants
10873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context.
10883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
10893d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
10903d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData)
10913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
10923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
10933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_shader *shader = (struct gl_shader *) data;
10943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (shader->Type) {
10963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_SHADER_PROGRAM_MESA:
10973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
10983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct gl_shader_program *shProg = (struct gl_shader_program *) data;
10993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         GLuint i;
11003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         for (i = 0; i < shProg->NumShaders; i++) {
11023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            destroy_program_variants(st, shProg->Shaders[i]->Program);
11033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
11043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, (struct gl_program *)
11063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                  shProg->VertexProgram);
11073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, (struct gl_program *)
11083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                  shProg->FragmentProgram);
11093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, (struct gl_program *)
11103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                  shProg->GeometryProgram);
11113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
11133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_SHADER:
11143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_SHADER:
11153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_GEOMETRY_SHADER:
11163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, shader->Program);
11183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
11203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
11213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      assert(0);
11223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
11233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
11243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
11273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the program variants which match
11283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context.
11293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
11303d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
11313d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData)
11323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
11343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_program *program = (struct gl_program *) data;
11353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   destroy_program_variants(st, program);
11363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
11373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
11403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which
11413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context.
11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down.
11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st)
11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* ARB vert/frag program */
11483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->Programs,
11493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_program_variants_cb, st);
11503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* GLSL vert/frag/geom shaders */
11523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->ShaderObjects,
11533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_shader_program_variants_cb, st);
11543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1155