st_program.c revision 72cb103cf518c86d8d094380d9f8e16650a0060b
1f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**************************************************************************
2f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *
3f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * All Rights Reserved.
5f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *
6f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Permission is hereby granted, free of charge, to any person obtaining a
7f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * copy of this software and associated documentation files (the
8f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * "Software"), to deal in the Software without restriction, including
9f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * without limitation the rights to use, copy, modify, merge, publish,
10f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * distribute, sub license, and/or sell copies of the Software, and to
11f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * permit persons to whom the Software is furnished to do so, subject to
12f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * the following conditions:
13f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *
14f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * The above copyright notice and this permission notice (including the
15f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * next paragraph) shall be included in all copies or substantial portions
16f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * of the Software.
17f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *
18f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *
26f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian **************************************************************************/
27f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /*
28f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian  * Authors:
29f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian  *   Keith Whitwell <keith@tungstengraphics.com>
30f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian  *   Brian Paul
31f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian  */
32f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
33f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
34b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/imports.h"
353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "main/hash.h"
36edc09358f72cd48cb2315daf23c82e7646aeaea3Vinson Lee#include "main/mfeatures.h"
37b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/mtypes.h"
383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "program/prog_parameter.h"
39ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_print.h"
40ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/programopt.h"
41f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
42f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h"
43f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h"
44abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h"
456acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h"
46c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h"
471b8aa2176c4fc580cc31c57c7e50e7f39ef2cc04Vinson Lee#include "tgsi/tgsi_ureg.h"
48f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
49b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "st_debug.h"
503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_bitmap.h"
513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_drawpixels.h"
52f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h"
53f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h"
54ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h"
55339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h"
56f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
578468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul
588468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul
598468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/**
60aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a vertex program variant.  Note the caller must unlink
61aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
633d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
64aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_vp_variant(struct st_context *st, struct st_vp_variant *vpv)
653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (vpv->driver_shader)
673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_vertex_shader(st->cso_context, vpv->driver_shader);
683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if FEATURE_feedback || FEATURE_rastpos
703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (vpv->draw_shader)
713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      draw_delete_vertex_shader( st->draw, vpv->draw_shader );
723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#endif
733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (vpv->tgsi.tokens)
753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      st_free_tokens(vpv->tgsi.tokens);
763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE( vpv );
783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
838468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations:
848468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */
8507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid
86aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_vp_variants( struct st_context *st,
8707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                        struct st_vertex_program *stvp )
8807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
89aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv;
9007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
91aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (vpv = stvp->variants; vpv; ) {
92aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_vp_variant *next = vpv->next;
93aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_vp_variant(st, vpv);
943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      vpv = next;
953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
9607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
97aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stvp->variants = NULL;
983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
103aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a fragment program variant.  Note the caller must unlink
104aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
1053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1063d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
107aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_fp_variant(struct st_context *st, struct st_fp_variant *fpv)
1083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (fpv->driver_shader)
1103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_fragment_shader(st->cso_context, fpv->driver_shader);
11180424700574e128070f457d79e1920d512a1efdaThomas Hellstrom   if (fpv->parameters)
11280424700574e128070f457d79e1920d512a1efdaThomas Hellstrom      _mesa_free_parameter_list(fpv->parameters);
11307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE(fpv);
1153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
119aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a fragment program.
1203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1213d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
122aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp)
1233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
124aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
1253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
126aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; ) {
127aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_fp_variant *next = fpv->next;
128aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_fp_variant(st, fpv);
1293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = next;
1303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
1313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
132aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stfp->variants = NULL;
1333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
137aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a geometry program variant.  Note the caller must unlink
138aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
1393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1403d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
141aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_gp_variant(struct st_context *st, struct st_gp_variant *gpv)
1423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (gpv->driver_shader)
1443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_geometry_shader(st->cso_context, gpv->driver_shader);
14507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE(gpv);
1473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
14807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
151aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a geometry program.
1523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1533d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
154aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp)
1553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
156aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
1573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
158aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; ) {
159aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_gp_variant *next = gpv->next;
160aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_gp_variant(st, gpv);
1613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = next;
16207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   }
16307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
164aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stgp->variants = NULL;
16507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
16607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
16707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
16807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
169f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader.
172e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping  to map vertex program output registers (VERT_RESULT_x)
173e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul *       to TGSI output slots
174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut  destination for TGSI tokens
175f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
176f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
177f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainvoid
178f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainst_prepare_vertex_program(struct gl_context *ctx,
17907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp)
180f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   GLuint attr;
182c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
18307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_inputs = 0;
18407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_outputs = 0;
185f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
186f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs   if (stvp->Base.IsPositionInvariant)
187f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain      _mesa_insert_mvp_code(ctx, &stvp->Base);
188f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs
18944867da3543ca54ef245695cef72a6e305451d93Bryan Cain   if (!stvp->glsl_to_tgsi)
19044867da3543ca54ef245695cef72a6e305451d93Bryan Cain      assert(stvp->Base.Base.NumInstructions > 1);
191325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell
192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Determine number of inputs, the mappings between VERT_ATTRIB_x
194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * and TGSI generic input indexes, plus input attrib semantic info.
195f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
196f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
197dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich      if ((stvp->Base.Base.InputsRead & BITFIELD64_BIT(attr)) != 0) {
19807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->input_to_index[attr] = stvp->num_inputs;
19907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->index_to_input[stvp->num_inputs] = attr;
20007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->num_inputs++;
201f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
202f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
20350caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   /* bit of a hack, presetup potentially unused edgeflag input */
20450caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs;
20550caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG;
206f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
20707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /* Compute mapping of vertex program outputs to slots.
208f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
209f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
210b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs      if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) {
21107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = ~0;
21207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      }
21307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      else {
21407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         unsigned slot = stvp->num_outputs++;
21507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
21607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = slot;
217f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
218f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_HPOS:
22007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
22107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
222f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL0:
22407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
22507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
226f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL1:
22807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
22907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
230f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC0:
23207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
23307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
234f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC1:
23607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
23707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
238f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_FOGC:
24007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
24107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
242f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_PSIZ:
24407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
24507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
246f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_EDGE:
248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(0);
249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
25007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX0:
252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX1:
253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX2:
254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX3:
255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX4:
256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX5:
257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX6:
258f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX7:
25907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
26007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
26107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
26207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
263f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_VAR0:
264f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
26507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            assert(attr < VERT_RESULT_MAX);
26607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
26707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 -
26807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                FRAG_ATTRIB_TEX0 +
26907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                attr -
27007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                VERT_RESULT_VAR0);
27107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
272f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
273f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
274f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
275890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   /* similar hack to above, presetup potentially unused edgeflag output */
276890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs;
277890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG;
278890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_index[stvp->num_outputs] = 0;
27907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
280f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
281509d9eb686411254b24139012b7594e10a760b6cBrian Paul
2823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
283aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a vertex program to create a new variant.
2843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
285aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_vp_variant *
28607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st,
28707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp,
288aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                            const struct st_vp_variant_key *key)
28907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
290aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant);
29107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct pipe_context *pipe = st->pipe;
292a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   struct ureg_program *ureg;
293a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   enum pipe_error error;
294890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   unsigned num_outputs;
295a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
296f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain   st_prepare_vertex_program(st->ctx, stvp);
2973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
29844867da3543ca54ef245695cef72a6e305451d93Bryan Cain   if (!stvp->glsl_to_tgsi)
29944867da3543ca54ef245695cef72a6e305451d93Bryan Cain   {
30044867da3543ca54ef245695cef72a6e305451d93Bryan Cain      _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT);
30144867da3543ca54ef245695cef72a6e305451d93Bryan Cain      _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING);
30244867da3543ca54ef245695cef72a6e305451d93Bryan Cain   }
30383baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
304a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
305b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   if (ureg == NULL) {
306b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee      FREE(vpv);
307a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      return NULL;
308b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   }
309a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
310c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák   vpv->key = *key;
311c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák
31250caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   vpv->num_inputs = stvp->num_inputs;
313890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   num_outputs = stvp->num_outputs;
314890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   if (key->passthrough_edgeflags) {
315890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      vpv->num_inputs++;
316890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      num_outputs++;
317890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   }
318a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
319ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul   if (ST_DEBUG & DEBUG_MESA) {
320ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      _mesa_print_program(&stvp->Base.Base);
321ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      _mesa_print_program_parameters(st->ctx, &stvp->Base.Base);
322ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      debug_printf("\n");
323ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul   }
324ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul
325f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain   if (stvp->glsl_to_tgsi)
326f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain      error = st_translate_program(st->ctx,
327f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   TGSI_PROCESSOR_VERTEX,
328f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   ureg,
329f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->glsl_to_tgsi,
330f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   &stvp->Base.Base,
331f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   /* inputs */
332f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->num_inputs,
333f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->input_to_index,
334f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   NULL, /* input semantic name */
335f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   NULL, /* input semantic index */
336f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   NULL, /* interp mode */
337f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   /* outputs */
338f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->num_outputs,
339f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->result_to_output,
340f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->output_semantic_name,
341f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->output_semantic_index,
342f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   key->passthrough_edgeflags );
343f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain   else
344f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain      error = st_translate_mesa_program(st->ctx,
345f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        TGSI_PROCESSOR_VERTEX,
346f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        ureg,
347f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        &stvp->Base.Base,
348f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        /* inputs */
349f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        vpv->num_inputs,
350f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->input_to_index,
351f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        NULL, /* input semantic name */
352f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        NULL, /* input semantic index */
353f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        NULL,
354f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        /* outputs */
355f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        num_outputs,
356f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->result_to_output,
357f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->output_semantic_name,
358f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->output_semantic_index,
359f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        key->passthrough_edgeflags );
36025b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
361a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   if (error)
362a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      goto fail;
363a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
364b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL );
365b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   if (!vpv->tgsi.tokens)
3669d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger      goto fail;
3679d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
368a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
36925b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
370b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
371f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
372b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
373b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( vpv->tgsi.tokens, 0 );
374b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
375b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
37607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
37707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   return vpv;
378a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
379a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail:
3809d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);
3819d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   _mesa_print_program(&stvp->Base.Base);
3829d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_assert(0);
3839d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
384a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
385a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   return NULL;
386f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
387f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
388f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
3893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
390aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant.
3913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
392aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant *
393aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st,
3943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_vertex_program *stvp,
395aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_vp_variant_key *key)
3963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
397aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv;
3983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
399aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
400aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (vpv = stvp->variants; vpv; vpv = vpv->next) {
4013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&vpv->key, key, sizeof(*key)) == 0) {
4023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
4033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
4043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
4053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!vpv) {
4073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create now */
4083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      vpv = st_translate_vertex_program(st, stvp, key);
4093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (vpv) {
4103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
411aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         vpv->next = stvp->variants;
412aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stvp->variants = vpv;
4133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
4143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
4153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return vpv;
4173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
4183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
419af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul
420af734468fee1e1fc0714557ddd199e2f91940afcBrian Paulstatic unsigned
421af734468fee1e1fc0714557ddd199e2f91940afcBrian Paulst_translate_interp(enum glsl_interp_qualifier glsl_qual)
4224dfee0011acb31f88889f298e4a355489889a542Dave Airlie{
4234dfee0011acb31f88889f298e4a355489889a542Dave Airlie   switch (glsl_qual) {
4244dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_NONE:
4254dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_SMOOTH:
4264dfee0011acb31f88889f298e4a355489889a542Dave Airlie      return TGSI_INTERPOLATE_PERSPECTIVE;
4274dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_FLAT:
4284dfee0011acb31f88889f298e4a355489889a542Dave Airlie      return TGSI_INTERPOLATE_CONSTANT;
4294dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_NOPERSPECTIVE:
4304dfee0011acb31f88889f298e4a355489889a542Dave Airlie      return TGSI_INTERPOLATE_LINEAR;
431af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul   default:
432af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul      assert(0 && "unexpected interp mode in st_translate_interp()");
433af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul      return TGSI_INTERPOLATE_PERSPECTIVE;
4344dfee0011acb31f88889f298e4a355489889a542Dave Airlie   }
4354dfee0011acb31f88889f298e4a355489889a542Dave Airlie}
436f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
437af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul
438f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
4393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in
4403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key.
4413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return  new fragment program variant
442f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
443aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant *
444f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st,
4453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_fragment_program *stfp,
446aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_fp_variant_key *key)
447f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
448339e7ec6805e6de8794514c0a935081b5d36d38fBrian   struct pipe_context *pipe = st->pipe;
449aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
4507230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul   GLboolean deleteFP = GL_FALSE;
451f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
452aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   if (!variant)
4533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
454fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
4553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   assert(!(key->bitmap && key->drawpixels));
456fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
457c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#if FEATURE_drawpix
4583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (key->bitmap) {
4593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glBitmap drawing */
4605cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp; /* we free this temp program below */
46183baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
4623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      st_make_bitmap_fragment_program(st, &stfp->Base,
463aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                                      &fp, &variant->bitmap_sampler);
464f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
465aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
46643125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
4677230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul      deleteFP = GL_TRUE;
4683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
4693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   else if (key->drawpixels) {
4703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glDrawPixels drawing */
4715cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp; /* we free this temp program below */
472e785f190f0d49f0367f7468c22b77962d0f14ea0Brian
4733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (key->drawpixels_z || key->drawpixels_stencil) {
4743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z,
4753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                                key->drawpixels_stencil);
476f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
477e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      else {
4783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* RGBA */
4793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         st_make_drawpix_fragment_program(st, &stfp->Base, &fp);
480aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
4817230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul         deleteFP = GL_TRUE;
482e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      }
48343125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
484f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
485c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#endif
486f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
4873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!stfp->tgsi.tokens) {
4883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* need to translate Mesa instructions to TGSI now */
489ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      GLuint outputMapping[FRAG_RESULT_MAX];
490ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      GLuint inputMapping[FRAG_ATTRIB_MAX];
491ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      GLuint interpMode[PIPE_MAX_SHADER_INPUTS];  /* XXX size? */
492ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      GLuint attr;
493dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich      const GLbitfield64 inputsRead = stfp->Base.Base.InputsRead;
4943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      struct ureg_program *ureg;
495ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
496ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      GLboolean write_all = GL_FALSE;
497ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
498ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
499ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
500ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      uint fs_num_inputs = 0;
501ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
502ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
503ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
504ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      uint fs_num_outputs = 0;
505f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain
50644867da3543ca54ef245695cef72a6e305451d93Bryan Cain      if (!stfp->glsl_to_tgsi)
50744867da3543ca54ef245695cef72a6e305451d93Bryan Cain         _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
508f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
509ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      /*
510ffb7d02154186402f64e0b628998485309774bb8Bryan Cain       * Convert Mesa program inputs to TGSI input register semantics.
511ffb7d02154186402f64e0b628998485309774bb8Bryan Cain       */
512ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
513dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich         if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
514ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            const GLuint slot = fs_num_inputs++;
515ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
516ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            inputMapping[attr] = slot;
517ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
518ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            switch (attr) {
519ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_WPOS:
520ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
521ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_index[slot] = 0;
522ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
523ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               break;
524ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_COL0:
525ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
526ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_index[slot] = 0;
527ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
528ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               break;
529ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_COL1:
530ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
531ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_index[slot] = 1;
532ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
533ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               break;
534ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_FOGC:
535ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
536ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_index[slot] = 0;
537ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
538ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               break;
539ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_FACE:
540ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
541ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_index[slot] = 0;
542ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
543ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               break;
544ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               /* In most cases, there is nothing special about these
545ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * inputs, so adopt a convention to use the generic
546ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * semantic name and the mesa FRAG_ATTRIB_ number as the
547ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * index.
548ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                *
549ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * All that is required is that the vertex shader labels
550ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * its own outputs similarly, and that the vertex shader
551ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * generates at least every output required by the
552ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * fragment shader plus fixed-function hardware (such as
553ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * BFC).
554ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                *
555ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * There is no requirement that semantic indexes start at
556ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * zero or be restricted to a particular range -- nobody
557ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * should be building tables based on semantic index.
558ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                */
559ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_PNTC:
560ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_TEX0:
561ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_TEX1:
562ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_TEX2:
563ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_TEX3:
564ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_TEX4:
565ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_TEX5:
566ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_TEX6:
567ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_TEX7:
568ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            case FRAG_ATTRIB_VAR0:
569ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            default:
570ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               /* Actually, let's try and zero-base this just for
571ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                * readability of the generated TGSI.
572ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                */
573ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               assert(attr >= FRAG_ATTRIB_TEX0);
574ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
575ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
576ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               if (attr == FRAG_ATTRIB_PNTC)
577ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
578ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               else
5794dfee0011acb31f88889f298e4a355489889a542Dave Airlie                  interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr]);
580ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               break;
581ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            }
582ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         }
583ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         else {
584ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            inputMapping[attr] = -1;
585ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         }
586ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      }
587ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
588ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      /*
589ffb7d02154186402f64e0b628998485309774bb8Bryan Cain       * Semantics and mapping for outputs
590ffb7d02154186402f64e0b628998485309774bb8Bryan Cain       */
591ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      {
592ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         uint numColors = 0;
593ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
594ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
595ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         /* if z is written, emit that first */
596ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
597ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
598ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            fs_output_semantic_index[fs_num_outputs] = 0;
599ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
600ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            fs_num_outputs++;
601ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
602ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         }
603ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
604ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
605ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
606ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            fs_output_semantic_index[fs_num_outputs] = 0;
607ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
608ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            fs_num_outputs++;
609ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
610ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         }
611ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
612ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         /* handle remaning outputs (color) */
613ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
614ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            if (outputsWritten & BITFIELD64_BIT(attr)) {
615ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               switch (attr) {
616ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               case FRAG_RESULT_DEPTH:
617ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               case FRAG_RESULT_STENCIL:
618ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  /* handled above */
619ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  assert(0);
620ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  break;
621ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               case FRAG_RESULT_COLOR:
622ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  write_all = GL_TRUE; /* fallthrough */
623ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               default:
624ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  assert(attr == FRAG_RESULT_COLOR ||
625ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                         (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
626ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
627ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  fs_output_semantic_index[fs_num_outputs] = numColors;
628ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  outputMapping[attr] = fs_num_outputs;
629ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  numColors++;
630ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                  break;
631ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               }
632ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
633ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               fs_num_outputs++;
634ffb7d02154186402f64e0b628998485309774bb8Bryan Cain            }
635ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         }
636ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      }
637ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
6383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
6393210cad3f26a7e8a73f2dc2f7f3740e594b068bdVinson Lee      if (ureg == NULL) {
6403210cad3f26a7e8a73f2dc2f7f3740e594b068bdVinson Lee         FREE(variant);
6413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         return NULL;
6423210cad3f26a7e8a73f2dc2f7f3740e594b068bdVinson Lee      }
643a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
6443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (ST_DEBUG & DEBUG_MESA) {
6453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         _mesa_print_program(&stfp->Base.Base);
6463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
6473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         debug_printf("\n");
6483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
64907498075b5de14955958da44a90eb7ee203218a1Dave Airlie      if (write_all == GL_TRUE)
65007498075b5de14955958da44a90eb7ee203218a1Dave Airlie         ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
651a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
65272cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie      if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) {
65372cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie         switch (stfp->Base.FragDepthLayout) {
65472cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie         case FRAG_DEPTH_LAYOUT_ANY:
65572cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie            ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY);
65672cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie            break;
65772cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie         case FRAG_DEPTH_LAYOUT_GREATER:
65872cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie            ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER);
65972cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie            break;
66072cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie         case FRAG_DEPTH_LAYOUT_LESS:
66172cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie            ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS);
66272cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie            break;
66372cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie         case FRAG_DEPTH_LAYOUT_UNCHANGED:
66472cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie            ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
66572cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie            break;
66672cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie         default:
66772cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie            assert(0);
66872cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie         }
66972cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie      }
67072cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie
671f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain      if (stfp->glsl_to_tgsi)
6724683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain         st_translate_program(st->ctx,
6734683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                              TGSI_PROCESSOR_FRAGMENT,
6744683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                              ureg,
6754683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                              stfp->glsl_to_tgsi,
6764683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                              &stfp->Base.Base,
6774683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                              /* inputs */
678ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                              fs_num_inputs,
679ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                              inputMapping,
680ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                              input_semantic_name,
681ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                              input_semantic_index,
682ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                              interpMode,
6834683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                              /* outputs */
684ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                              fs_num_outputs,
685ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                              outputMapping,
686ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                              fs_output_semantic_name,
687ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                              fs_output_semantic_index, FALSE );
688f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain      else
6894683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain         st_translate_mesa_program(st->ctx,
6904683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                                   TGSI_PROCESSOR_FRAGMENT,
6914683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                                   ureg,
6924683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                                   &stfp->Base.Base,
6934683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                                   /* inputs */
694ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                                   fs_num_inputs,
695ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                                   inputMapping,
696ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                                   input_semantic_name,
697ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                                   input_semantic_index,
698ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                                   interpMode,
6994683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain                                   /* outputs */
700ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                                   fs_num_outputs,
701ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                                   outputMapping,
702ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                                   fs_output_semantic_name,
703ffb7d02154186402f64e0b628998485309774bb8Bryan Cain                                   fs_output_semantic_index, FALSE );
7043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
7063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      ureg_destroy( ureg );
7073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
7084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell
709aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in variant */
710aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   variant->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi);
711aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   variant->key = *key;
712f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
713b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
714b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
715b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
716b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
7173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7187230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul   if (deleteFP) {
7195cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      /* Free the temporary program made above */
7205cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp = &stfp->Base;
7215cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      _mesa_reference_fragprog(st->ctx, &fp, NULL);
7225cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul   }
7235cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul
724aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   return variant;
725f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
726f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
7273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
7293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed.
7303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
731aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant *
732aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st,
7333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_fragment_program *stfp,
734aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_fp_variant_key *key)
7353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
736aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
7373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
738aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
739aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; fpv = fpv->next) {
7403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&fpv->key, key, sizeof(*key)) == 0) {
7413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
7423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
7433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
7443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!fpv) {
7463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
7473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = st_translate_fragment_program(st, stfp, key);
7483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (fpv) {
7493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
750aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         fpv->next = stfp->variants;
751aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stfp->variants = fpv;
7523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
7533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
7543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return fpv;
7563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
7573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
760aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant.
7613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
762aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant *
763da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st,
7643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_geometry_program *stgp,
765aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_gp_variant_key *key)
766da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
767da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint inputMapping[GEOM_ATTRIB_MAX];
768da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint outputMapping[GEOM_RESULT_MAX];
769da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct pipe_context *pipe = st->pipe;
770da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint attr;
771dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich   const GLbitfield64 inputsRead = stgp->Base.Base.InputsRead;
772da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint vslot = 0;
773da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint num_generic = 0;
774da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
775da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_inputs = 0;
776da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_builtin_inputs = 0;
777da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_array_offset = 0;
778da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
779da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
780da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
781da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_outputs = 0;
782da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
783da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLint i;
784da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint maxSlot = 0;
785da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct ureg_program *ureg;
786da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
787aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
7883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
789aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   gpv = CALLOC_STRUCT(st_gp_variant);
7903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv)
7913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
7923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
79383baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT);
79483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING);
79583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
796da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY );
797da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ureg == NULL) {
7983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      FREE(gpv);
7993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
800da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
801da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
802da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* which vertex output goes to the first geometry input */
8037c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   vslot = 0;
804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
805425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(inputMapping, 0, sizeof(inputMapping));
806425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(outputMapping, 0, sizeof(outputMapping));
807425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin
808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Convert Mesa program inputs to TGSI input register semantics.
810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) {
812dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich      if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         const GLuint slot = gs_num_inputs;
814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_inputs++;
816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         inputMapping[attr] = slot;
818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs;
820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_to_index[attr] = vslot;
821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->index_to_input[vslot] = attr;
822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         ++vslot;
823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
8247c42390453e611367cf1ba11446692ec04e0abfbZack Rusin         if (attr != GEOM_ATTRIB_PRIMITIVE_ID) {
825da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_array_offset += 2;
826da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         } else
827da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            ++gs_builtin_inputs;
828da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
8293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0
830da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         debug_printf("input map at %d = %d\n",
831da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]);
832da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
833da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
834da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
835da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_PRIMITIVE_ID:
836da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID;
837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
839da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_POSITION:
840da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
842da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
843da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR0:
844da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
846da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
847da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR1:
848da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 1;
850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_FOG_FRAG_COORD:
852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
854da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_TEX_COORD:
856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_VAR0:
860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
866da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* initialize output semantics to defaults */
869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
871da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_index[i] = 0;
872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   num_generic = 0;
875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Determine number of outputs, the (default) output register
877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * mapping and the semantic information for each output.
878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
880aa878f94ab77fe3be352d820aaa950b32836c814Brian Paul      if (stgp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) {
881da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         GLuint slot;
882da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
883da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         slot = gs_num_outputs;
884da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_outputs++;
885da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         outputMapping[attr] = slot;
886da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
887da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
888da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_POS:
889da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot == 0);
890da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
891da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
892da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
893da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL0:
894da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
895da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
896da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
897da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL1:
898da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
899da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
900da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
901da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL0:
902da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
903da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
904da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
905da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL1:
906da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
907da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
908da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
909da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_FOGC:
910da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
911da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
912da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
913da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_PSIZ:
914da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
915da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
916da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
917da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX0:
918da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX1:
919da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX2:
920da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX3:
921da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX4:
922da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX5:
923da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX6:
924da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX7:
925da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
926da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_VAR0:
927da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
928da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
929da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot < Elements(gs_output_semantic_name));
930da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* use default semantic info */
931da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
932da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = num_generic++;
933da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
934da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
935da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
936da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
937da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION);
938da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
939da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* find max output slot referenced to compute gs_num_outputs */
940da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
941da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot)
942da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         maxSlot = outputMapping[attr];
943da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
944da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   gs_num_outputs = maxSlot + 1;
945da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
946da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */
947da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   {
948da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      GLuint i;
949da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("outputMapping? %d\n", outputMapping ? 1 : 0);
950da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping) {
951da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf("attr -> slot\n");
952da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         for (i = 0; i < 16;  i++) {
953da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            printf(" %2d       %3d\n", i, outputMapping[i]);
954da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
955da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
956da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("slot    sem_name  sem_index\n");
957da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      for (i = 0; i < gs_num_outputs; i++) {
958da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf(" %2d         %d         %d\n",
959da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                i,
960da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_name[i],
961da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_index[i]);
962da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
963da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
964da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
965da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
966da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* free old shader state, if any */
967da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (stgp->tgsi.tokens) {
968da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      st_free_tokens(stgp->tgsi.tokens);
969da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      stgp->tgsi.tokens = NULL;
970da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
971da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
972da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_input_prim(ureg, stgp->Base.InputType);
973da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
974da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
975da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
9762f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák   st_translate_mesa_program(st->ctx,
9772f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             TGSI_PROCESSOR_GEOMETRY,
9782f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             ureg,
9792f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             &stgp->Base.Base,
9802f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             /* inputs */
9812f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_num_inputs,
9822f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             inputMapping,
9832f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             stgp->input_semantic_name,
9842f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             stgp->input_semantic_index,
9852f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             NULL,
9862f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             /* outputs */
9872f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_num_outputs,
9882f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             outputMapping,
9892f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_output_semantic_name,
9902f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_output_semantic_index,
9912f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             FALSE);
992da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
993da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->num_inputs = gs_num_inputs;
994da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
995da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_destroy( ureg );
9963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
997aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in new variant */
9983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
9993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->key = *key;
1000da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1001da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
1002da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      _mesa_print_program(&stgp->Base.Base);
1003da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
1004da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
1005da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1006da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ST_DEBUG & DEBUG_TGSI) {
1007da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      tgsi_dump(stgp->tgsi.tokens, 0);
1008da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
1009da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
10103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
10123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
10133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
10163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant.
10173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1018aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant *
1019aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st,
10203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_geometry_program *stgp,
1021aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_gp_variant_key *key)
10223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1023aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
10243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1025aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
1026aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; gpv = gpv->next) {
10273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&gpv->key, key, sizeof(*key)) == 0) {
10283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
10293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
10313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv) {
10333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
10343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = st_translate_geometry_program(st, stgp, key);
10353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (gpv) {
10363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
1037aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         gpv->next = stgp->variants;
1038aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stgp->variants = gpv;
10393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
10413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
1043da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin}
1044678f80b347801d925c07a774faee1ed3f716de15Brian Paul
10453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1048678f80b347801d925c07a774faee1ed3f716de15Brian Paul/**
1049678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text
1050678f80b347801d925c07a774faee1ed3f716de15Brian Paul */
1051678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid
1052f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx)
1053678f80b347801d925c07a774faee1ed3f716de15Brian Paul{
105484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   struct gl_shader_program *shProg[3] = {
105584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentVertexProgram,
105684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentGeometryProgram,
105784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentFragmentProgram,
105884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   };
105984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   unsigned j;
106084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
106184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   for (j = 0; j < 3; j++) {
106284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      unsigned i;
106384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
106484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      if (shProg[j] == NULL)
106584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 continue;
106684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
106784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      for (i = 0; i < shProg[j]->NumShaders; i++) {
106884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 struct gl_shader *sh;
106984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
107084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 switch (shProg[j]->Shaders[i]->Type) {
107184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_VERTEX_SHADER:
107284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 0) ? NULL : shProg[j]->Shaders[i];
107384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
107484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_GEOMETRY_SHADER_ARB:
107584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 1) ? NULL : shProg[j]->Shaders[i];
107684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
107784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_FRAGMENT_SHADER:
107884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 2) ? NULL : shProg[j]->Shaders[i];
107984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
1080a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	 default:
1081a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    assert(0);
1082a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    sh = NULL;
1083a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    break;
108484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
108584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
108684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 if (sh != NULL) {
108784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders);
108884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("%s\n", sh->Source);
108984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
1090678f80b347801d925c07a774faee1ed3f716de15Brian Paul      }
1091678f80b347801d925c07a774faee1ed3f716de15Brian Paul   }
1092678f80b347801d925c07a774faee1ed3f716de15Brian Paul}
10933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
10963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants.  Free all the
10973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context.
10983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
10993d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
11003d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program)
11013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!program)
11033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return;
11043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (program->Target) {
11063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_PROGRAM_ARB:
11073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_vertex_program *stvp = (struct st_vertex_program *) program;
1109aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_vp_variant *vpv, **prevPtr = &stvp->variants;
11103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1111aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (vpv = stvp->variants; vpv; ) {
1112aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_vp_variant *next = vpv->next;
11133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (vpv->key.st == st) {
11143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1115a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
11163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1117aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_vp_variant(st, vpv);
11183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1120a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &vpv->next;
11213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            vpv = next;
11233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
11243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
11263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_PROGRAM_ARB:
11273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_fragment_program *stfp =
11293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            (struct st_fragment_program *) program;
1130aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_fp_variant *fpv, **prevPtr = &stfp->variants;
11313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1132aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (fpv = stfp->variants; fpv; ) {
1133aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_fp_variant *next = fpv->next;
11343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (fpv->key.st == st) {
11353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1136a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
11373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1138aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_fp_variant(st, fpv);
11393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1141a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &fpv->next;
11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fpv = next;
11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
1147c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul   case MESA_GEOMETRY_PROGRAM:
1148c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      {
1149c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         struct st_geometry_program *stgp =
1150c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            (struct st_geometry_program *) program;
1151aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_gp_variant *gpv, **prevPtr = &stgp->variants;
1152c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul
1153aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (gpv = stgp->variants; gpv; ) {
1154aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_gp_variant *next = gpv->next;
1155c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            if (gpv->key.st == st) {
1156c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* unlink from list */
1157a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
1158c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* destroy this variant */
1159aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_gp_variant(st, gpv);
1160c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1161c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            else {
1162a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &gpv->next;
1163c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1164c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            gpv = next;
1165c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         }
1166c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      }
1167c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      break;
11683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
1169e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul      _mesa_problem(NULL, "Unexpected program target 0x%x in "
1170e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul                    "destroy_program_variants_cb()", program->Target);
11713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
11723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
11733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
11763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the shader's program variants
11773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context.
11783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
11793d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
11803d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData)
11813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
11833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_shader *shader = (struct gl_shader *) data;
11843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (shader->Type) {
11863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_SHADER_PROGRAM_MESA:
11873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct gl_shader_program *shProg = (struct gl_shader_program *) data;
11893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         GLuint i;
11903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         for (i = 0; i < shProg->NumShaders; i++) {
11923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            destroy_program_variants(st, shProg->Shaders[i]->Program);
11933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
11943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
119577d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick	 for (i = 0; i < Elements(shProg->_LinkedShaders); i++) {
1196ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin	    if (shProg->_LinkedShaders[i])
1197ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin               destroy_program_variants(st, shProg->_LinkedShaders[i]->Program);
119877d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick	 }
11993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
12003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
12013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_SHADER:
12023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_SHADER:
12033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_GEOMETRY_SHADER:
12043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
12053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, shader->Program);
12063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
12073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
12083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
12093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      assert(0);
12103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
12113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
12123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
12153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the program variants which match
12163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context.
12173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
12183d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
12193d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData)
12203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
12213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
12223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_program *program = (struct gl_program *) data;
12233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   destroy_program_variants(st, program);
12243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
12253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
12283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which
12293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context.
12303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down.
12313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
12323d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
12333d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st)
12343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
12353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* ARB vert/frag program */
12363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->Programs,
12373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_program_variants_cb, st);
12383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* GLSL vert/frag/geom shaders */
12403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->ShaderObjects,
12413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_shader_program_variants_cb, st);
12423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1243