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);
113732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák   if (fpv->tgsi.tokens)
114732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák      st_free_tokens(fpv->tgsi.tokens);
1153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE(fpv);
1163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
120aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a fragment program.
1213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1223d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
123aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp)
1243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
125aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
1263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
127aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; ) {
128aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_fp_variant *next = fpv->next;
129aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_fp_variant(st, fpv);
1303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = next;
1313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
1323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
133aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stfp->variants = NULL;
1343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
1353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
138aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a geometry program variant.  Note the caller must unlink
139aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list.
1403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1413d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
142aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_gp_variant(struct st_context *st, struct st_gp_variant *gpv)
1433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (gpv->driver_shader)
1453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      cso_delete_geometry_shader(st->cso_context, gpv->driver_shader);
14607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   FREE(gpv);
1483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
14907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
1503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
152aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a geometry program.
1533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1543d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
155aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp)
1563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
157aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
1583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
159aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; ) {
160aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      struct st_gp_variant *next = gpv->next;
161aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      delete_gp_variant(st, gpv);
1623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = next;
16307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   }
16407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
165aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   stgp->variants = NULL;
16607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
16707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
16807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
16907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader.
173e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping  to map vertex program output registers (VERT_RESULT_x)
174e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul *       to TGSI output slots
175f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut  destination for TGSI tokens
176f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
177f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
178f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainvoid
179f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainst_prepare_vertex_program(struct gl_context *ctx,
18007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp)
181f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
18207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   GLuint attr;
183c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
18407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_inputs = 0;
18507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_outputs = 0;
186f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
187f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs   if (stvp->Base.IsPositionInvariant)
188f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain      _mesa_insert_mvp_code(ctx, &stvp->Base);
189f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs
19044867da3543ca54ef245695cef72a6e305451d93Bryan Cain   if (!stvp->glsl_to_tgsi)
19144867da3543ca54ef245695cef72a6e305451d93Bryan Cain      assert(stvp->Base.Base.NumInstructions > 1);
192325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell
193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Determine number of inputs, the mappings between VERT_ATTRIB_x
195f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * and TGSI generic input indexes, plus input attrib semantic info.
196f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
197f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
198dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich      if ((stvp->Base.Base.InputsRead & BITFIELD64_BIT(attr)) != 0) {
19907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->input_to_index[attr] = stvp->num_inputs;
20007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->index_to_input[stvp->num_inputs] = attr;
20107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->num_inputs++;
202f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
203f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
20450caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   /* bit of a hack, presetup potentially unused edgeflag input */
20550caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs;
20650caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG;
207f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
20807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /* Compute mapping of vertex program outputs to slots.
209f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
210f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
211b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs      if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) {
21207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = ~0;
21307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      }
21407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      else {
21507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         unsigned slot = stvp->num_outputs++;
21607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
21707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = slot;
218f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
220f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_HPOS:
22107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
22207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
224f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL0:
22507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
22607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
228f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL1:
22907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
23007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
232f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC0:
23307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
23407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
236f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC1:
23707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
23807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
240f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_FOGC:
24107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
24207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
244f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_PSIZ:
24507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
24607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
24859be691638200797583bce39a83f641d30d97492Bryan Cain         case VERT_RESULT_CLIP_DIST0:
24959be691638200797583bce39a83f641d30d97492Bryan Cain            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
25059be691638200797583bce39a83f641d30d97492Bryan Cain            stvp->output_semantic_index[slot] = 0;
25159be691638200797583bce39a83f641d30d97492Bryan Cain            break;
25259be691638200797583bce39a83f641d30d97492Bryan Cain         case VERT_RESULT_CLIP_DIST1:
25359be691638200797583bce39a83f641d30d97492Bryan Cain            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
25459be691638200797583bce39a83f641d30d97492Bryan Cain            stvp->output_semantic_index[slot] = 1;
25559be691638200797583bce39a83f641d30d97492Bryan Cain            break;
256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_EDGE:
257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(0);
258f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
259a103c61d278b7f56208818c4b949c408c00286faDave Airlie         case VERT_RESULT_CLIP_VERTEX:
260a103c61d278b7f56208818c4b949c408c00286faDave Airlie            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX;
261a103c61d278b7f56208818c4b949c408c00286faDave Airlie            stvp->output_semantic_index[slot] = 0;
262a103c61d278b7f56208818c4b949c408c00286faDave Airlie            break;
26307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
264f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX0:
265f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX1:
266f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX2:
267f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX3:
268f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX4:
269f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX5:
270f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX6:
271f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX7:
27207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
27307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
27407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
27507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
276f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_VAR0:
277f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
27807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            assert(attr < VERT_RESULT_MAX);
27907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
28007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 -
28107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                FRAG_ATTRIB_TEX0 +
28207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                attr -
28307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                VERT_RESULT_VAR0);
28407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
285f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
286f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
287f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
288890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   /* similar hack to above, presetup potentially unused edgeflag output */
289890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs;
290890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG;
291890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_index[stvp->num_outputs] = 0;
29207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
293f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
294509d9eb686411254b24139012b7594e10a760b6cBrian Paul
2953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
296aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a vertex program to create a new variant.
2973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
298aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_vp_variant *
29907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st,
30007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp,
301aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                            const struct st_vp_variant_key *key)
30207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
303aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant);
30407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct pipe_context *pipe = st->pipe;
305a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   struct ureg_program *ureg;
306a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   enum pipe_error error;
307890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   unsigned num_outputs;
308a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
309f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain   st_prepare_vertex_program(st->ctx, stvp);
3103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
31144867da3543ca54ef245695cef72a6e305451d93Bryan Cain   if (!stvp->glsl_to_tgsi)
31244867da3543ca54ef245695cef72a6e305451d93Bryan Cain   {
31344867da3543ca54ef245695cef72a6e305451d93Bryan Cain      _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT);
31444867da3543ca54ef245695cef72a6e305451d93Bryan Cain      _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING);
31544867da3543ca54ef245695cef72a6e305451d93Bryan Cain   }
31683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
317a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
318b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   if (ureg == NULL) {
319b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee      FREE(vpv);
320a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      return NULL;
321b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   }
322a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
323c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák   vpv->key = *key;
324c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák
32550caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   vpv->num_inputs = stvp->num_inputs;
326890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   num_outputs = stvp->num_outputs;
327890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   if (key->passthrough_edgeflags) {
328890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      vpv->num_inputs++;
329890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      num_outputs++;
330890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   }
331a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
332ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul   if (ST_DEBUG & DEBUG_MESA) {
333ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      _mesa_print_program(&stvp->Base.Base);
334ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      _mesa_print_program_parameters(st->ctx, &stvp->Base.Base);
335ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul      debug_printf("\n");
336ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul   }
337ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul
338f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain   if (stvp->glsl_to_tgsi)
339f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain      error = st_translate_program(st->ctx,
340f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   TGSI_PROCESSOR_VERTEX,
341f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   ureg,
342f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->glsl_to_tgsi,
343f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   &stvp->Base.Base,
344f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   /* inputs */
345f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->num_inputs,
346f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->input_to_index,
347f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   NULL, /* input semantic name */
348f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   NULL, /* input semantic index */
349f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   NULL, /* interp mode */
350f40b5723f017bfb9e3819a5463184627ee727cc1Marek Olšák                                   NULL, /* is centroid */
351f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   /* outputs */
352f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->num_outputs,
353f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->result_to_output,
354f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->output_semantic_name,
355f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->output_semantic_index,
356bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák                                   key->passthrough_edgeflags,
357bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák                                   key->clamp_color);
358f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain   else
359f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain      error = st_translate_mesa_program(st->ctx,
360f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        TGSI_PROCESSOR_VERTEX,
361f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        ureg,
362f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        &stvp->Base.Base,
363f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        /* inputs */
364f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        vpv->num_inputs,
365f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->input_to_index,
366f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        NULL, /* input semantic name */
367f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        NULL, /* input semantic index */
368f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        NULL,
369f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        /* outputs */
370f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        num_outputs,
371f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->result_to_output,
372f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->output_semantic_name,
373f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->output_semantic_index,
374bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák                                        key->passthrough_edgeflags,
375bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák                                        key->clamp_color);
37625b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
377a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   if (error)
378a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      goto fail;
379a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
380b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL );
381b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   if (!vpv->tgsi.tokens)
3829d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger      goto fail;
3839d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
384a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
38525b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
386c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák   if (stvp->glsl_to_tgsi) {
387c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák      st_translate_stream_output_info(stvp->glsl_to_tgsi,
388c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák                                      stvp->result_to_output,
389c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák                                      &vpv->tgsi.stream_output);
390c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák   }
391c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák
392b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
393f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
394b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
395b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( vpv->tgsi.tokens, 0 );
396b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
397b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
39807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
39907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   return vpv;
400a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
401a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail:
4029d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);
4039d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   _mesa_print_program(&stvp->Base.Base);
4049d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_assert(0);
4059d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
406a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
407a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   return NULL;
408f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
409f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
410f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
4113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
412aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant.
4133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
414aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant *
415aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st,
4163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_vertex_program *stvp,
417aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_vp_variant_key *key)
4183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
419aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv;
4203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
421aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
422aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (vpv = stvp->variants; vpv; vpv = vpv->next) {
4233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&vpv->key, key, sizeof(*key)) == 0) {
4243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
4253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
4263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
4273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!vpv) {
4293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create now */
4303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      vpv = st_translate_vertex_program(st, stvp, key);
4313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (vpv) {
4323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
433aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         vpv->next = stvp->variants;
434aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stvp->variants = vpv;
4353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
4363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
4373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return vpv;
4393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
4403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
441af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul
442af734468fee1e1fc0714557ddd199e2f91940afcBrian Paulstatic unsigned
443e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airliest_translate_interp(enum glsl_interp_qualifier glsl_qual, bool is_color)
4444dfee0011acb31f88889f298e4a355489889a542Dave Airlie{
4454dfee0011acb31f88889f298e4a355489889a542Dave Airlie   switch (glsl_qual) {
4464dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_NONE:
447e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie      if (is_color)
44867e3cbf1632e361220234013147331e4618b70cbDave Airlie         return TGSI_INTERPOLATE_COLOR;
449e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie      return TGSI_INTERPOLATE_PERSPECTIVE;
4504dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_SMOOTH:
4514dfee0011acb31f88889f298e4a355489889a542Dave Airlie      return TGSI_INTERPOLATE_PERSPECTIVE;
4524dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_FLAT:
4534dfee0011acb31f88889f298e4a355489889a542Dave Airlie      return TGSI_INTERPOLATE_CONSTANT;
4544dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_NOPERSPECTIVE:
4554dfee0011acb31f88889f298e4a355489889a542Dave Airlie      return TGSI_INTERPOLATE_LINEAR;
456af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul   default:
457af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul      assert(0 && "unexpected interp mode in st_translate_interp()");
458af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul      return TGSI_INTERPOLATE_PERSPECTIVE;
4594dfee0011acb31f88889f298e4a355489889a542Dave Airlie   }
4604dfee0011acb31f88889f298e4a355489889a542Dave Airlie}
461f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
462af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul
463f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
4643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in
4653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key.
4663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return  new fragment program variant
467f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
468aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant *
469f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st,
4703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_fragment_program *stfp,
471aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_fp_variant_key *key)
472f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
473339e7ec6805e6de8794514c0a935081b5d36d38fBrian   struct pipe_context *pipe = st->pipe;
474aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
4757230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul   GLboolean deleteFP = GL_FALSE;
476f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
477697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   GLuint outputMapping[FRAG_RESULT_MAX];
478697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   GLuint inputMapping[FRAG_ATTRIB_MAX];
479697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   GLuint interpMode[PIPE_MAX_SHADER_INPUTS];  /* XXX size? */
480697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   GLuint attr;
4814ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca   GLbitfield64 inputsRead;
482697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   struct ureg_program *ureg;
483697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
484697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   GLboolean write_all = GL_FALSE;
485697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
486697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
487697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
488f40b5723f017bfb9e3819a5463184627ee727cc1Marek Olšák   GLboolean is_centroid[PIPE_MAX_SHADER_INPUTS];
489697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   uint fs_num_inputs = 0;
490697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
491697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
492697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
493697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   uint fs_num_outputs = 0;
494697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
495aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   if (!variant)
4963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
497fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
4983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   assert(!(key->bitmap && key->drawpixels));
499fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
500c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#if FEATURE_drawpix
5013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (key->bitmap) {
5023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glBitmap drawing */
5035cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp; /* we free this temp program below */
50483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
5053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      st_make_bitmap_fragment_program(st, &stfp->Base,
506aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                                      &fp, &variant->bitmap_sampler);
507f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
508aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
50943125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
5107230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul      deleteFP = GL_TRUE;
5113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
5123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   else if (key->drawpixels) {
5133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glDrawPixels drawing */
5145cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp; /* we free this temp program below */
515e785f190f0d49f0367f7468c22b77962d0f14ea0Brian
5163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (key->drawpixels_z || key->drawpixels_stencil) {
5173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z,
5183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                                key->drawpixels_stencil);
519f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
520e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      else {
5213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* RGBA */
5223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         st_make_drawpix_fragment_program(st, &stfp->Base, &fp);
523aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
5247230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul         deleteFP = GL_TRUE;
525e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      }
52643125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
527f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
528c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#endif
529f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
530697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (!stfp->glsl_to_tgsi)
531697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
532f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
533697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   /*
534697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák    * Convert Mesa program inputs to TGSI input register semantics.
535697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák    */
5364ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca   inputsRead = stfp->Base.Base.InputsRead;
537697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
538697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
539697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         const GLuint slot = fs_num_inputs++;
540ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
541697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         inputMapping[attr] = slot;
542f40b5723f017bfb9e3819a5463184627ee727cc1Marek Olšák         is_centroid[slot] = (stfp->Base.IsCentroid & BITFIELD64_BIT(attr)) != 0;
543ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
544697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         switch (attr) {
545697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_WPOS:
546697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
547697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 0;
548697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
549697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
550697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_COL0:
551697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
552697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 0;
553697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
554697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                                   TRUE);
555697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
556697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_COL1:
557697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
558697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 1;
559697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
560697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                                   TRUE);
561697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
562697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_FOGC:
563697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
564697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 0;
565697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
566697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
567697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_FACE:
568697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
569697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 0;
570697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
571697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
572697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_CLIP_DIST0:
573697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
574697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 0;
575e620f3e763f69245531d605ff383f160bd0c0e8cOlivier Galibert            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
576697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
577697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_CLIP_DIST1:
578697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
579697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 1;
580e620f3e763f69245531d605ff383f160bd0c0e8cOlivier Galibert            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
581697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
582697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            /* In most cases, there is nothing special about these
583697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * inputs, so adopt a convention to use the generic
584697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * semantic name and the mesa FRAG_ATTRIB_ number as the
585697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * index.
586697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             *
587697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * All that is required is that the vertex shader labels
588697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * its own outputs similarly, and that the vertex shader
589697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * generates at least every output required by the
590697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * fragment shader plus fixed-function hardware (such as
591697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * BFC).
592697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             *
593697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * There is no requirement that semantic indexes start at
594697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * zero or be restricted to a particular range -- nobody
595697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * should be building tables based on semantic index.
596697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             */
597697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_PNTC:
598697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX0:
599697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX1:
600697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX2:
601697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX3:
602697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX4:
603697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX5:
604697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX6:
605697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX7:
606697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_VAR0:
607697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         default:
608697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            /* Actually, let's try and zero-base this just for
609697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * readability of the generated TGSI.
610697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             */
611697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            assert(attr >= FRAG_ATTRIB_TEX0);
612697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
613697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
614697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            if (attr == FRAG_ATTRIB_PNTC)
615ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
616697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            else
617e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie               interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
618697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                                      FALSE);
619697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
620ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         }
621ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      }
622697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      else {
623697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         inputMapping[attr] = -1;
624ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      }
625697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   }
626ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
627697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   /*
628697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák    * Semantics and mapping for outputs
629697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák    */
630697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   {
631697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      uint numColors = 0;
632697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
633697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
634697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      /* if z is written, emit that first */
635697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
636697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
637697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_output_semantic_index[fs_num_outputs] = 0;
638697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
639697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_num_outputs++;
640697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
6413210cad3f26a7e8a73f2dc2f7f3740e594b068bdVinson Lee      }
642a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
643697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
644697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
645697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_output_semantic_index[fs_num_outputs] = 0;
646697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
647697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_num_outputs++;
648697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
6493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
650a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
651697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      /* handle remaining outputs (color) */
652697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
653697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         if (outputsWritten & BITFIELD64_BIT(attr)) {
654697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            switch (attr) {
655697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            case FRAG_RESULT_DEPTH:
656697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            case FRAG_RESULT_STENCIL:
657697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               /* handled above */
658697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               assert(0);
659697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               break;
660697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            case FRAG_RESULT_COLOR:
661697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               write_all = GL_TRUE; /* fallthrough */
662697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            default:
663697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               assert(attr == FRAG_RESULT_COLOR ||
664697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                      (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
665697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
666697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               fs_output_semantic_index[fs_num_outputs] = numColors;
667697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               outputMapping[attr] = fs_num_outputs;
668697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               numColors++;
669697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               break;
670697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            }
671697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
672697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            fs_num_outputs++;
67372cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie         }
67472cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie      }
675697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   }
67672cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie
677697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
678697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (ureg == NULL) {
679697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      FREE(variant);
680697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      return NULL;
681697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   }
682697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
683697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (ST_DEBUG & DEBUG_MESA) {
684697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      _mesa_print_program(&stfp->Base.Base);
685697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
686697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      debug_printf("\n");
687697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   }
688697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (write_all == GL_TRUE)
689697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
6903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
691697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) {
692697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      switch (stfp->Base.FragDepthLayout) {
693697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      case FRAG_DEPTH_LAYOUT_ANY:
694697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY);
695697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         break;
696697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      case FRAG_DEPTH_LAYOUT_GREATER:
697697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER);
698697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         break;
699697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      case FRAG_DEPTH_LAYOUT_LESS:
700697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS);
701697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         break;
702697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      case FRAG_DEPTH_LAYOUT_UNCHANGED:
703697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
704697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         break;
705697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      default:
706697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         assert(0);
707697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      }
7083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
7094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell
710697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (stfp->glsl_to_tgsi)
711697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      st_translate_program(st->ctx,
712697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           TGSI_PROCESSOR_FRAGMENT,
713697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           ureg,
714697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           stfp->glsl_to_tgsi,
715697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           &stfp->Base.Base,
716697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           /* inputs */
717697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           fs_num_inputs,
718697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           inputMapping,
719697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           input_semantic_name,
720697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           input_semantic_index,
721697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           interpMode,
722f40b5723f017bfb9e3819a5463184627ee727cc1Marek Olšák                           is_centroid,
723697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           /* outputs */
724697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           fs_num_outputs,
725697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           outputMapping,
726697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           fs_output_semantic_name,
727697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           fs_output_semantic_index, FALSE,
728697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           key->clamp_color );
729697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   else
730697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      st_translate_mesa_program(st->ctx,
731697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                TGSI_PROCESSOR_FRAGMENT,
732697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                ureg,
733697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                &stfp->Base.Base,
734697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                /* inputs */
735697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                fs_num_inputs,
736697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                inputMapping,
737697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                input_semantic_name,
738697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                input_semantic_index,
739697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                interpMode,
740697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                /* outputs */
741697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                fs_num_outputs,
742697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                outputMapping,
743697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                fs_output_semantic_name,
744697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                fs_output_semantic_index, FALSE,
745697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                key->clamp_color);
746697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
747697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   variant->tgsi.tokens = ureg_get_tokens( ureg, NULL );
748697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ureg_destroy( ureg );
749697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
750aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in variant */
751732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák   variant->driver_shader = pipe->create_fs_state(pipe, &variant->tgsi);
752aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   variant->key = *key;
753f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
754b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
755732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák      tgsi_dump( variant->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
756b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
757b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
7583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7597230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul   if (deleteFP) {
7605cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      /* Free the temporary program made above */
7615cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp = &stfp->Base;
7625cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      _mesa_reference_fragprog(st->ctx, &fp, NULL);
7635cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul   }
7645cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul
765aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   return variant;
766f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
767f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
7683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
7703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed.
7713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
772aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant *
773aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st,
7743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_fragment_program *stfp,
775aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_fp_variant_key *key)
7763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
777aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
7783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
779aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
780aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; fpv = fpv->next) {
7813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&fpv->key, key, sizeof(*key)) == 0) {
7823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
7833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
7843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
7853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!fpv) {
7873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
7883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = st_translate_fragment_program(st, stfp, key);
7893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (fpv) {
7903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
791aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         fpv->next = stfp->variants;
792aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stfp->variants = fpv;
7933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
7943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
7953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return fpv;
7973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
7983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
8003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
801aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant.
8023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
803aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant *
804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st,
8053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_geometry_program *stgp,
806aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_gp_variant_key *key)
807da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint inputMapping[GEOM_ATTRIB_MAX];
809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint outputMapping[GEOM_RESULT_MAX];
810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct pipe_context *pipe = st->pipe;
811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint attr;
8124ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca   GLbitfield64 inputsRead;
813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint vslot = 0;
814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint num_generic = 0;
815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_inputs = 0;
817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_builtin_inputs = 0;
818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_array_offset = 0;
819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_outputs = 0;
823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
824da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLint i;
825da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint maxSlot = 0;
826da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct ureg_program *ureg;
827da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
828aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
8293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
830aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   gpv = CALLOC_STRUCT(st_gp_variant);
8313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv)
8323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
8333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
83483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT);
83583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING);
83683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY );
838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ureg == NULL) {
8393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      FREE(gpv);
8403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
842da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
843da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* which vertex output goes to the first geometry input */
8447c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   vslot = 0;
845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
846425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(inputMapping, 0, sizeof(inputMapping));
847425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(outputMapping, 0, sizeof(outputMapping));
848425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin
849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Convert Mesa program inputs to TGSI input register semantics.
851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
8524ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca   inputsRead = stgp->Base.Base.InputsRead;
853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) {
854dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich      if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         const GLuint slot = gs_num_inputs;
856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_inputs++;
858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         inputMapping[attr] = slot;
860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs;
862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_to_index[attr] = vslot;
863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->index_to_input[vslot] = attr;
864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         ++vslot;
865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
8667c42390453e611367cf1ba11446692ec04e0abfbZack Rusin         if (attr != GEOM_ATTRIB_PRIMITIVE_ID) {
867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_array_offset += 2;
868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         } else
869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            ++gs_builtin_inputs;
870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
8713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0
872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         debug_printf("input map at %d = %d\n",
873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]);
874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_PRIMITIVE_ID:
878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID;
879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
880da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
881da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_POSITION:
882da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
883da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
884da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
885da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR0:
886da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
887da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
888da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
889da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR1:
890da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
891da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 1;
892da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
893da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_FOG_FRAG_COORD:
894da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
895da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
896da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
897da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_TEX_COORD:
898da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
899da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
900da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
901da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_VAR0:
902da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
903da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
904da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
905da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
906da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
907da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
908da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
909da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
910da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* initialize output semantics to defaults */
911da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
912da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
913da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_index[i] = 0;
914da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
915da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
916da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   num_generic = 0;
917da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
918da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Determine number of outputs, the (default) output register
919da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * mapping and the semantic information for each output.
920da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
921da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
922aa878f94ab77fe3be352d820aaa950b32836c814Brian Paul      if (stgp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) {
923da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         GLuint slot;
924da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
925da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         slot = gs_num_outputs;
926da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_outputs++;
927da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         outputMapping[attr] = slot;
928da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
929da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
930da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_POS:
931da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot == 0);
932da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
933da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
934da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
935da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL0:
936da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
937da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
938da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
939da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL1:
940da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
941da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
942da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
943da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL0:
944da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
945da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
946da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
947da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL1:
948da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
949da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
950da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
951da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_FOGC:
952da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
953da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
954da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
955da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_PSIZ:
956da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
957da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
958da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
959da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX0:
960da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX1:
961da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX2:
962da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX3:
963da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX4:
964da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX5:
965da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX6:
966da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX7:
967da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
968da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_VAR0:
969da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
970da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
971da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot < Elements(gs_output_semantic_name));
972da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* use default semantic info */
973da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
974da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = num_generic++;
975da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
976da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
977da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
978da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
979da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION);
980da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
981da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* find max output slot referenced to compute gs_num_outputs */
982da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
983da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot)
984da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         maxSlot = outputMapping[attr];
985da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
986da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   gs_num_outputs = maxSlot + 1;
987da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
988da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */
989da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   {
990da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      GLuint i;
991da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("outputMapping? %d\n", outputMapping ? 1 : 0);
992da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping) {
993da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf("attr -> slot\n");
994da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         for (i = 0; i < 16;  i++) {
995da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            printf(" %2d       %3d\n", i, outputMapping[i]);
996da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
997da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
998da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("slot    sem_name  sem_index\n");
999da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      for (i = 0; i < gs_num_outputs; i++) {
1000da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf(" %2d         %d         %d\n",
1001da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                i,
1002da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_name[i],
1003da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_index[i]);
1004da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
1005da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
1006da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
1007da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1008da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* free old shader state, if any */
1009da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (stgp->tgsi.tokens) {
1010da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      st_free_tokens(stgp->tgsi.tokens);
1011da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      stgp->tgsi.tokens = NULL;
1012da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
1013da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1014da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_input_prim(ureg, stgp->Base.InputType);
1015da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
1016da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
1017da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
10182f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák   st_translate_mesa_program(st->ctx,
10192f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             TGSI_PROCESSOR_GEOMETRY,
10202f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             ureg,
10212f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             &stgp->Base.Base,
10222f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             /* inputs */
10232f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_num_inputs,
10242f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             inputMapping,
10252f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             stgp->input_semantic_name,
10262f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             stgp->input_semantic_index,
10272f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             NULL,
10282f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             /* outputs */
10292f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_num_outputs,
10302f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             outputMapping,
10312f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_output_semantic_name,
10322f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_output_semantic_index,
1033bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák                             FALSE,
10342f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             FALSE);
1035da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1036da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->num_inputs = gs_num_inputs;
1037da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
1038da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_destroy( ureg );
10393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1040c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák   if (stgp->glsl_to_tgsi) {
1041c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák      st_translate_stream_output_info(stgp->glsl_to_tgsi,
1042c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák                                      outputMapping,
1043c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák                                      &stgp->tgsi.stream_output);
1044c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák   }
1045c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák
1046aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in new variant */
10473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
10483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->key = *key;
1049da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1050da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
1051da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      _mesa_print_program(&stgp->Base.Base);
1052da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
1053da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
1054da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1055da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ST_DEBUG & DEBUG_TGSI) {
1056da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      tgsi_dump(stgp->tgsi.tokens, 0);
1057da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
1058da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
10593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
10613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
10623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
10653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant.
10663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1067aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant *
1068aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st,
10693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_geometry_program *stgp,
1070aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_gp_variant_key *key)
10713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1072aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
10733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1074aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
1075aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; gpv = gpv->next) {
10763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&gpv->key, key, sizeof(*key)) == 0) {
10773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
10783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
10803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv) {
10823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
10833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = st_translate_geometry_program(st, stgp, key);
10843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (gpv) {
10853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
1086aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         gpv->next = stgp->variants;
1087aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stgp->variants = gpv;
10883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
10903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
1092da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin}
1093678f80b347801d925c07a774faee1ed3f716de15Brian Paul
10943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1097678f80b347801d925c07a774faee1ed3f716de15Brian Paul/**
1098678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text
1099678f80b347801d925c07a774faee1ed3f716de15Brian Paul */
1100678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid
1101f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx)
1102678f80b347801d925c07a774faee1ed3f716de15Brian Paul{
110384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   struct gl_shader_program *shProg[3] = {
110484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentVertexProgram,
110584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentGeometryProgram,
110684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentFragmentProgram,
110784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   };
110884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   unsigned j;
110984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
111084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   for (j = 0; j < 3; j++) {
111184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      unsigned i;
111284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
111384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      if (shProg[j] == NULL)
111484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 continue;
111584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
111684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      for (i = 0; i < shProg[j]->NumShaders; i++) {
111784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 struct gl_shader *sh;
111884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
111984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 switch (shProg[j]->Shaders[i]->Type) {
112084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_VERTEX_SHADER:
112184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 0) ? NULL : shProg[j]->Shaders[i];
112284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
112384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_GEOMETRY_SHADER_ARB:
112484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 1) ? NULL : shProg[j]->Shaders[i];
112584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
112684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_FRAGMENT_SHADER:
112784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 2) ? NULL : shProg[j]->Shaders[i];
112884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
1129a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	 default:
1130a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    assert(0);
1131a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    sh = NULL;
1132a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    break;
113384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
113484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
113584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 if (sh != NULL) {
113684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders);
113784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("%s\n", sh->Source);
113884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
1139678f80b347801d925c07a774faee1ed3f716de15Brian Paul      }
1140678f80b347801d925c07a774faee1ed3f716de15Brian Paul   }
1141678f80b347801d925c07a774faee1ed3f716de15Brian Paul}
11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants.  Free all the
11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context.
11473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
11483d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
11493d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program)
11503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!program)
11523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return;
11533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (program->Target) {
11553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_PROGRAM_ARB:
11563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_vertex_program *stvp = (struct st_vertex_program *) program;
1158aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_vp_variant *vpv, **prevPtr = &stvp->variants;
11593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1160aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (vpv = stvp->variants; vpv; ) {
1161aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_vp_variant *next = vpv->next;
11623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (vpv->key.st == st) {
11633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1164a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
11653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1166aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_vp_variant(st, vpv);
11673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1169a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &vpv->next;
11703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            vpv = next;
11723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
11733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
11753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_PROGRAM_ARB:
11763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_fragment_program *stfp =
11783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            (struct st_fragment_program *) program;
1179aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_fp_variant *fpv, **prevPtr = &stfp->variants;
11803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1181aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (fpv = stfp->variants; fpv; ) {
1182aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_fp_variant *next = fpv->next;
11833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (fpv->key.st == st) {
11843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1185a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
11863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1187aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_fp_variant(st, fpv);
11883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1190a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &fpv->next;
11913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fpv = next;
11933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
11943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
1196c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul   case MESA_GEOMETRY_PROGRAM:
1197c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      {
1198c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         struct st_geometry_program *stgp =
1199c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            (struct st_geometry_program *) program;
1200aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_gp_variant *gpv, **prevPtr = &stgp->variants;
1201c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul
1202aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (gpv = stgp->variants; gpv; ) {
1203aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_gp_variant *next = gpv->next;
1204c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            if (gpv->key.st == st) {
1205c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* unlink from list */
1206a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
1207c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* destroy this variant */
1208aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_gp_variant(st, gpv);
1209c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1210c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            else {
1211a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &gpv->next;
1212c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1213c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            gpv = next;
1214c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         }
1215c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      }
1216c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      break;
12173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
1218e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul      _mesa_problem(NULL, "Unexpected program target 0x%x in "
1219e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul                    "destroy_program_variants_cb()", program->Target);
12203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
12213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
12223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
12253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the shader's program variants
12263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context.
12273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
12283d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
12293d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData)
12303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
12313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
12323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_shader *shader = (struct gl_shader *) data;
12333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (shader->Type) {
12353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_SHADER_PROGRAM_MESA:
12363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
12373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct gl_shader_program *shProg = (struct gl_shader_program *) data;
12383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         GLuint i;
12393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         for (i = 0; i < shProg->NumShaders; i++) {
12413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            destroy_program_variants(st, shProg->Shaders[i]->Program);
12423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
12433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
124477d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick	 for (i = 0; i < Elements(shProg->_LinkedShaders); i++) {
1245ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin	    if (shProg->_LinkedShaders[i])
1246ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin               destroy_program_variants(st, shProg->_LinkedShaders[i]->Program);
124777d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick	 }
12483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
12493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
12503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_SHADER:
12513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_SHADER:
12523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_GEOMETRY_SHADER:
12533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
12543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, shader->Program);
12553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
12563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
12573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
12583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      assert(0);
12593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
12603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
12613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
12643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the program variants which match
12653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context.
12663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
12673d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
12683d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData)
12693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
12703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
12713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_program *program = (struct gl_program *) data;
12723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   destroy_program_variants(st, program);
12733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
12743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
12773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which
12783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context.
12793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down.
12803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
12813d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
12823d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st)
12833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
12843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* ARB vert/frag program */
12853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->Programs,
12863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_program_variants_cb, st);
12873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* GLSL vert/frag/geom shaders */
12893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->ShaderObjects,
12903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_shader_program_variants_cb, st);
12913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
12926792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
12936792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
12946792969cbc0d233942b15285e0fa84e6602733c2Brian Paul/**
12956792969cbc0d233942b15285e0fa84e6602733c2Brian Paul * For debugging, print/dump the current vertex program.
12966792969cbc0d233942b15285e0fa84e6602733c2Brian Paul */
12976792969cbc0d233942b15285e0fa84e6602733c2Brian Paulvoid
12986792969cbc0d233942b15285e0fa84e6602733c2Brian Paulst_print_current_vertex_program(void)
12996792969cbc0d233942b15285e0fa84e6602733c2Brian Paul{
13006792969cbc0d233942b15285e0fa84e6602733c2Brian Paul   GET_CURRENT_CONTEXT(ctx);
13016792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
13026792969cbc0d233942b15285e0fa84e6602733c2Brian Paul   if (ctx->VertexProgram._Current) {
13036792969cbc0d233942b15285e0fa84e6602733c2Brian Paul      struct st_vertex_program *stvp =
13046792969cbc0d233942b15285e0fa84e6602733c2Brian Paul         (struct st_vertex_program *) ctx->VertexProgram._Current;
13056792969cbc0d233942b15285e0fa84e6602733c2Brian Paul      struct st_vp_variant *stv;
13066792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
13076792969cbc0d233942b15285e0fa84e6602733c2Brian Paul      debug_printf("Vertex program %u\n", stvp->Base.Base.Id);
13086792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
13096792969cbc0d233942b15285e0fa84e6602733c2Brian Paul      for (stv = stvp->variants; stv; stv = stv->next) {
13106792969cbc0d233942b15285e0fa84e6602733c2Brian Paul         debug_printf("variant %p\n", stv);
13116792969cbc0d233942b15285e0fa84e6602733c2Brian Paul         tgsi_dump(stv->tgsi.tokens, 0);
13126792969cbc0d233942b15285e0fa84e6602733c2Brian Paul      }
13136792969cbc0d233942b15285e0fa84e6602733c2Brian Paul   }
13146792969cbc0d233942b15285e0fa84e6602733c2Brian Paul}
1315