st_program.c revision e620f3e763f69245531d605ff383f160bd0c0e8c
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 */
350f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   /* outputs */
351f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->num_outputs,
352f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->result_to_output,
353f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->output_semantic_name,
354f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                   stvp->output_semantic_index,
355bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák                                   key->passthrough_edgeflags,
356bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák                                   key->clamp_color);
357f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain   else
358f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain      error = st_translate_mesa_program(st->ctx,
359f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        TGSI_PROCESSOR_VERTEX,
360f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        ureg,
361f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        &stvp->Base.Base,
362f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        /* inputs */
363f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        vpv->num_inputs,
364f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->input_to_index,
365f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        NULL, /* input semantic name */
366f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        NULL, /* input semantic index */
367f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        NULL,
368f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        /* outputs */
369f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        num_outputs,
370f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->result_to_output,
371f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->output_semantic_name,
372f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain                                        stvp->output_semantic_index,
373bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák                                        key->passthrough_edgeflags,
374bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák                                        key->clamp_color);
37525b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
376a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   if (error)
377a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      goto fail;
378a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
379b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL );
380b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   if (!vpv->tgsi.tokens)
3819d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger      goto fail;
3829d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
383a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
38425b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
385c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák   if (stvp->glsl_to_tgsi) {
386c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák      st_translate_stream_output_info(stvp->glsl_to_tgsi,
387c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák                                      stvp->result_to_output,
388c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák                                      &vpv->tgsi.stream_output);
389c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák   }
390c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák
391b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
392f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
393b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
394b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( vpv->tgsi.tokens, 0 );
395b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
396b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
39707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
39807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   return vpv;
399a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
400a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail:
4019d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);
4029d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   _mesa_print_program(&stvp->Base.Base);
4039d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_assert(0);
4049d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
405a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
406a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   return NULL;
407f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
408f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
409f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
4103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
411aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant.
4123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
413aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant *
414aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st,
4153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_vertex_program *stvp,
416aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_vp_variant_key *key)
4173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
418aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_vp_variant *vpv;
4193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
420aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
421aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (vpv = stvp->variants; vpv; vpv = vpv->next) {
4223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&vpv->key, key, sizeof(*key)) == 0) {
4233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
4243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
4253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
4263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!vpv) {
4283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create now */
4293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      vpv = st_translate_vertex_program(st, stvp, key);
4303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (vpv) {
4313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
432aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         vpv->next = stvp->variants;
433aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stvp->variants = vpv;
4343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
4353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
4363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
4373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return vpv;
4383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
4393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
440af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul
441af734468fee1e1fc0714557ddd199e2f91940afcBrian Paulstatic unsigned
442e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airliest_translate_interp(enum glsl_interp_qualifier glsl_qual, bool is_color)
4434dfee0011acb31f88889f298e4a355489889a542Dave Airlie{
4444dfee0011acb31f88889f298e4a355489889a542Dave Airlie   switch (glsl_qual) {
4454dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_NONE:
446e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie      if (is_color)
44767e3cbf1632e361220234013147331e4618b70cbDave Airlie         return TGSI_INTERPOLATE_COLOR;
448e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie      return TGSI_INTERPOLATE_PERSPECTIVE;
4494dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_SMOOTH:
4504dfee0011acb31f88889f298e4a355489889a542Dave Airlie      return TGSI_INTERPOLATE_PERSPECTIVE;
4514dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_FLAT:
4524dfee0011acb31f88889f298e4a355489889a542Dave Airlie      return TGSI_INTERPOLATE_CONSTANT;
4534dfee0011acb31f88889f298e4a355489889a542Dave Airlie   case INTERP_QUALIFIER_NOPERSPECTIVE:
4544dfee0011acb31f88889f298e4a355489889a542Dave Airlie      return TGSI_INTERPOLATE_LINEAR;
455af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul   default:
456af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul      assert(0 && "unexpected interp mode in st_translate_interp()");
457af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul      return TGSI_INTERPOLATE_PERSPECTIVE;
4584dfee0011acb31f88889f298e4a355489889a542Dave Airlie   }
4594dfee0011acb31f88889f298e4a355489889a542Dave Airlie}
460f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
461af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul
462f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
4633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in
4643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key.
4653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return  new fragment program variant
466f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
467aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant *
468f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st,
4693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_fragment_program *stfp,
470aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_fp_variant_key *key)
471f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
472339e7ec6805e6de8794514c0a935081b5d36d38fBrian   struct pipe_context *pipe = st->pipe;
473aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
4747230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul   GLboolean deleteFP = GL_FALSE;
475f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
476697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   GLuint outputMapping[FRAG_RESULT_MAX];
477697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   GLuint inputMapping[FRAG_ATTRIB_MAX];
478697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   GLuint interpMode[PIPE_MAX_SHADER_INPUTS];  /* XXX size? */
479697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   GLuint attr;
4804ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca   GLbitfield64 inputsRead;
481697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   struct ureg_program *ureg;
482697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
483697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   GLboolean write_all = GL_FALSE;
484697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
485697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
486697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
487697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   uint fs_num_inputs = 0;
488697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
489697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
490697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
491697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   uint fs_num_outputs = 0;
492697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
493aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   if (!variant)
4943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
495fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
4963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   assert(!(key->bitmap && key->drawpixels));
497fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
498c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#if FEATURE_drawpix
4993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (key->bitmap) {
5003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glBitmap drawing */
5015cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp; /* we free this temp program below */
50283baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
5033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      st_make_bitmap_fragment_program(st, &stfp->Base,
504aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                                      &fp, &variant->bitmap_sampler);
505f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
506aa5ba96d294698809186cc4b59034abbd3076812Brian Paul      variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
50743125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
5087230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul      deleteFP = GL_TRUE;
5093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
5103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   else if (key->drawpixels) {
5113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* glDrawPixels drawing */
5125cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp; /* we free this temp program below */
513e785f190f0d49f0367f7468c22b77962d0f14ea0Brian
5143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (key->drawpixels_z || key->drawpixels_stencil) {
5153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z,
5163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                                                key->drawpixels_stencil);
517f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
518e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      else {
5193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* RGBA */
5203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         st_make_drawpix_fragment_program(st, &stfp->Base, &fp);
521aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters);
5227230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul         deleteFP = GL_TRUE;
523e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      }
52443125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul      stfp = st_fragment_program(fp);
525f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
526c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#endif
527f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
528697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (!stfp->glsl_to_tgsi)
529697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
530f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
531697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   /*
532697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák    * Convert Mesa program inputs to TGSI input register semantics.
533697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák    */
5344ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca   inputsRead = stfp->Base.Base.InputsRead;
535697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
536697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
537697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         const GLuint slot = fs_num_inputs++;
538ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
539697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         inputMapping[attr] = slot;
540ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
541697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         switch (attr) {
542697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_WPOS:
543697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
544697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 0;
545697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
546697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
547697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_COL0:
548697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
549697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 0;
550697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
551697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                                   TRUE);
552697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
553697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_COL1:
554697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
555697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 1;
556697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
557697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                                   TRUE);
558697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
559697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_FOGC:
560697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
561697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 0;
562697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
563697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
564697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_FACE:
565697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
566697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 0;
567697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
568697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
569697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_CLIP_DIST0:
570697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
571697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 0;
572e620f3e763f69245531d605ff383f160bd0c0e8cOlivier Galibert            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
573697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
574697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_CLIP_DIST1:
575697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
576697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = 1;
577e620f3e763f69245531d605ff383f160bd0c0e8cOlivier Galibert            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
578697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
579697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            /* In most cases, there is nothing special about these
580697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * inputs, so adopt a convention to use the generic
581697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * semantic name and the mesa FRAG_ATTRIB_ number as the
582697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * index.
583697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             *
584697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * All that is required is that the vertex shader labels
585697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * its own outputs similarly, and that the vertex shader
586697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * generates at least every output required by the
587697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * fragment shader plus fixed-function hardware (such as
588697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * BFC).
589697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             *
590697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * There is no requirement that semantic indexes start at
591697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * zero or be restricted to a particular range -- nobody
592697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * should be building tables based on semantic index.
593697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             */
594697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_PNTC:
595697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX0:
596697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX1:
597697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX2:
598697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX3:
599697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX4:
600697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX5:
601697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX6:
602697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_TEX7:
603697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         case FRAG_ATTRIB_VAR0:
604697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         default:
605697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            /* Actually, let's try and zero-base this just for
606697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             * readability of the generated TGSI.
607697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák             */
608697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            assert(attr >= FRAG_ATTRIB_TEX0);
609697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
610697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
611697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            if (attr == FRAG_ATTRIB_PNTC)
612ffb7d02154186402f64e0b628998485309774bb8Bryan Cain               interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
613697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            else
614e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie               interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr],
615697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                                      FALSE);
616697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            break;
617ffb7d02154186402f64e0b628998485309774bb8Bryan Cain         }
618ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      }
619697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      else {
620697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         inputMapping[attr] = -1;
621ffb7d02154186402f64e0b628998485309774bb8Bryan Cain      }
622697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   }
623ffb7d02154186402f64e0b628998485309774bb8Bryan Cain
624697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   /*
625697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák    * Semantics and mapping for outputs
626697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák    */
627697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   {
628697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      uint numColors = 0;
629697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
630697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
631697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      /* if z is written, emit that first */
632697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
633697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
634697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_output_semantic_index[fs_num_outputs] = 0;
635697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
636697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_num_outputs++;
637697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
6383210cad3f26a7e8a73f2dc2f7f3740e594b068bdVinson Lee      }
639a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
640697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
641697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL;
642697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_output_semantic_index[fs_num_outputs] = 0;
643697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
644697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         fs_num_outputs++;
645697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
6463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
647a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
648697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      /* handle remaining outputs (color) */
649697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
650697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         if (outputsWritten & BITFIELD64_BIT(attr)) {
651697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            switch (attr) {
652697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            case FRAG_RESULT_DEPTH:
653697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            case FRAG_RESULT_STENCIL:
654697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               /* handled above */
655697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               assert(0);
656697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               break;
657697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            case FRAG_RESULT_COLOR:
658697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               write_all = GL_TRUE; /* fallthrough */
659697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            default:
660697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               assert(attr == FRAG_RESULT_COLOR ||
661697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                      (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
662697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
663697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               fs_output_semantic_index[fs_num_outputs] = numColors;
664697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               outputMapping[attr] = fs_num_outputs;
665697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               numColors++;
666697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák               break;
667697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            }
668697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
669697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák            fs_num_outputs++;
67072cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie         }
67172cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie      }
672697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   }
67372cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie
674697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
675697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (ureg == NULL) {
676697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      FREE(variant);
677697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      return NULL;
678697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   }
679697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
680697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (ST_DEBUG & DEBUG_MESA) {
681697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      _mesa_print_program(&stfp->Base.Base);
682697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
683697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      debug_printf("\n");
684697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   }
685697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (write_all == GL_TRUE)
686697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      ureg_property_fs_color0_writes_all_cbufs(ureg, 1);
6873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
688697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) {
689697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      switch (stfp->Base.FragDepthLayout) {
690697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      case FRAG_DEPTH_LAYOUT_ANY:
691697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY);
692697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         break;
693697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      case FRAG_DEPTH_LAYOUT_GREATER:
694697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER);
695697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         break;
696697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      case FRAG_DEPTH_LAYOUT_LESS:
697697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS);
698697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         break;
699697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      case FRAG_DEPTH_LAYOUT_UNCHANGED:
700697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
701697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         break;
702697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      default:
703697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák         assert(0);
704697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      }
7053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
7064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell
707697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   if (stfp->glsl_to_tgsi)
708697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      st_translate_program(st->ctx,
709697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           TGSI_PROCESSOR_FRAGMENT,
710697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           ureg,
711697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           stfp->glsl_to_tgsi,
712697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           &stfp->Base.Base,
713697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           /* inputs */
714697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           fs_num_inputs,
715697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           inputMapping,
716697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           input_semantic_name,
717697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           input_semantic_index,
718697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           interpMode,
719697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           /* outputs */
720697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           fs_num_outputs,
721697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           outputMapping,
722697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           fs_output_semantic_name,
723697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           fs_output_semantic_index, FALSE,
724697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                           key->clamp_color );
725697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   else
726697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák      st_translate_mesa_program(st->ctx,
727697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                TGSI_PROCESSOR_FRAGMENT,
728697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                ureg,
729697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                &stfp->Base.Base,
730697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                /* inputs */
731697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                fs_num_inputs,
732697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                inputMapping,
733697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                input_semantic_name,
734697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                input_semantic_index,
735697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                interpMode,
736697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                /* outputs */
737697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                fs_num_outputs,
738697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                outputMapping,
739697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                fs_output_semantic_name,
740697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                fs_output_semantic_index, FALSE,
741697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák                                key->clamp_color);
742697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
743697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   variant->tgsi.tokens = ureg_get_tokens( ureg, NULL );
744697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák   ureg_destroy( ureg );
745697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák
746aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in variant */
747732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák   variant->driver_shader = pipe->create_fs_state(pipe, &variant->tgsi);
748aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   variant->key = *key;
749f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
750b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
751732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák      tgsi_dump( variant->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
752b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
753b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
7543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7557230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul   if (deleteFP) {
7565cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      /* Free the temporary program made above */
7575cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      struct gl_fragment_program *fp = &stfp->Base;
7585cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul      _mesa_reference_fragprog(st->ctx, &fp, NULL);
7595cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul   }
7605cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul
761aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   return variant;
762f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
763f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
7643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
7663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed.
7673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
768aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant *
769aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st,
7703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_fragment_program *stfp,
771aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_fp_variant_key *key)
7723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
773aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_fp_variant *fpv;
7743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
775aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
776aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (fpv = stfp->variants; fpv; fpv = fpv->next) {
7773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&fpv->key, key, sizeof(*key)) == 0) {
7783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
7793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
7803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
7813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!fpv) {
7833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
7843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      fpv = st_translate_fragment_program(st, stfp, key);
7853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (fpv) {
7863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
787aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         fpv->next = stfp->variants;
788aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stfp->variants = fpv;
7893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
7903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
7913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return fpv;
7933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
7943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
7963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
797aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant.
7983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
799aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant *
800da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st,
8013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                              struct st_geometry_program *stgp,
802aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                              const struct st_gp_variant_key *key)
803da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{
804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint inputMapping[GEOM_ATTRIB_MAX];
805da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint outputMapping[GEOM_RESULT_MAX];
806da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct pipe_context *pipe = st->pipe;
807da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint attr;
8084ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca   GLbitfield64 inputsRead;
809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint vslot = 0;
810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint num_generic = 0;
811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
812da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_inputs = 0;
813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_builtin_inputs = 0;
814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_array_offset = 0;
815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   uint gs_num_outputs = 0;
819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLint i;
821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   GLuint maxSlot = 0;
822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   struct ureg_program *ureg;
823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
824aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
8253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
826aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   gpv = CALLOC_STRUCT(st_gp_variant);
8273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv)
8283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
8293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
83083baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT);
83183baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák   _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING);
83283baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák
833da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY );
834da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ureg == NULL) {
8353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      FREE(gpv);
8363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return NULL;
837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
839da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* which vertex output goes to the first geometry input */
8407c42390453e611367cf1ba11446692ec04e0abfbZack Rusin   vslot = 0;
841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
842425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(inputMapping, 0, sizeof(inputMapping));
843425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin   memset(outputMapping, 0, sizeof(outputMapping));
844425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin
845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
846da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Convert Mesa program inputs to TGSI input register semantics.
847da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
8484ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca   inputsRead = stgp->Base.Base.InputsRead;
849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) {
850dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich      if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         const GLuint slot = gs_num_inputs;
852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_inputs++;
854da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         inputMapping[attr] = slot;
856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs;
858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->input_to_index[attr] = vslot;
859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         stgp->index_to_input[vslot] = attr;
860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         ++vslot;
861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
8627c42390453e611367cf1ba11446692ec04e0abfbZack Rusin         if (attr != GEOM_ATTRIB_PRIMITIVE_ID) {
863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_array_offset += 2;
864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         } else
865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            ++gs_builtin_inputs;
866da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
8673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0
868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         debug_printf("input map at %d = %d\n",
869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                      slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]);
870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
871da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_PRIMITIVE_ID:
874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID;
875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_POSITION:
878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
880da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
881da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR0:
882da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
883da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
884da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
885da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_COLOR1:
886da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
887da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 1;
888da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
889da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_FOG_FRAG_COORD:
890da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
891da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = 0;
892da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
893da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_TEX_COORD:
894da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
895da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
896da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
897da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_ATTRIB_VAR0:
898da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
899da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
900da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
901da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            stgp->input_semantic_index[slot] = num_generic++;
902da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
903da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
904da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
905da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
906da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* initialize output semantics to defaults */
907da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
908da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
909da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      gs_output_semantic_index[i] = 0;
910da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
911da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
912da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   num_generic = 0;
913da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /*
914da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * Determine number of outputs, the (default) output register
915da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    * mapping and the semantic information for each output.
916da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin    */
917da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
918aa878f94ab77fe3be352d820aaa950b32836c814Brian Paul      if (stgp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) {
919da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         GLuint slot;
920da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
921da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         slot = gs_num_outputs;
922da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         gs_num_outputs++;
923da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         outputMapping[attr] = slot;
924da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
925da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         switch (attr) {
926da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_POS:
927da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot == 0);
928da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
929da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
930da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
931da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL0:
932da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
933da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
934da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
935da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_COL1:
936da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
937da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
938da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
939da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL0:
940da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
941da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
942da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
943da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_SCOL1:
944da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
945da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 1;
946da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
947da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_FOGC:
948da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
949da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
950da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
951da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_PSIZ:
952da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
953da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = 0;
954da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            break;
955da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX0:
956da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX1:
957da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX2:
958da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX3:
959da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX4:
960da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX5:
961da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX6:
962da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_TEX7:
963da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
964da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         case GEOM_RESULT_VAR0:
965da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* fall-through */
966da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         default:
967da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            assert(slot < Elements(gs_output_semantic_name));
968da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            /* use default semantic info */
969da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
970da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            gs_output_semantic_index[slot] = num_generic++;
971da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
972da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
973da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
974da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
975da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION);
976da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
977da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* find max output slot referenced to compute gs_num_outputs */
978da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   for (attr = 0; attr < GEOM_RESULT_MAX; attr++) {
979da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot)
980da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         maxSlot = outputMapping[attr];
981da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
982da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   gs_num_outputs = maxSlot + 1;
983da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
984da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */
985da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   {
986da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      GLuint i;
987da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("outputMapping? %d\n", outputMapping ? 1 : 0);
988da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      if (outputMapping) {
989da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf("attr -> slot\n");
990da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         for (i = 0; i < 16;  i++) {
991da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin            printf(" %2d       %3d\n", i, outputMapping[i]);
992da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         }
993da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
994da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      printf("slot    sem_name  sem_index\n");
995da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      for (i = 0; i < gs_num_outputs; i++) {
996da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin         printf(" %2d         %d         %d\n",
997da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                i,
998da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_name[i],
999da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin                gs_output_semantic_index[i]);
1000da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      }
1001da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
1002da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif
1003da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1004da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   /* free old shader state, if any */
1005da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (stgp->tgsi.tokens) {
1006da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      st_free_tokens(stgp->tgsi.tokens);
1007da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      stgp->tgsi.tokens = NULL;
1008da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
1009da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1010da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_input_prim(ureg, stgp->Base.InputType);
1011da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_output_prim(ureg, stgp->Base.OutputType);
1012da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut);
1013da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
10142f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák   st_translate_mesa_program(st->ctx,
10152f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             TGSI_PROCESSOR_GEOMETRY,
10162f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             ureg,
10172f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             &stgp->Base.Base,
10182f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             /* inputs */
10192f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_num_inputs,
10202f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             inputMapping,
10212f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             stgp->input_semantic_name,
10222f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             stgp->input_semantic_index,
10232f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             NULL,
10242f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             /* outputs */
10252f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_num_outputs,
10262f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             outputMapping,
10272f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_output_semantic_name,
10282f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             gs_output_semantic_index,
1029bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák                             FALSE,
10302f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák                             FALSE);
1031da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1032da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->num_inputs = gs_num_inputs;
1033da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
1034da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   ureg_destroy( ureg );
10353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1036c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák   if (stgp->glsl_to_tgsi) {
1037c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák      st_translate_stream_output_info(stgp->glsl_to_tgsi,
1038c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák                                      outputMapping,
1039c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák                                      &stgp->tgsi.stream_output);
1040c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák   }
1041c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák
1042aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* fill in new variant */
10433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
10443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   gpv->key = *key;
1045da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1046da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
1047da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      _mesa_print_program(&stgp->Base.Base);
1048da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
1049da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
1050da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin
1051da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   if (ST_DEBUG & DEBUG_TGSI) {
1052da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      tgsi_dump(stgp->tgsi.tokens, 0);
1053da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin      debug_printf("\n");
1054da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin   }
10553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
10573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
10583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
10613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant.
10623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
1063aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant *
1064aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st,
10653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  struct st_geometry_program *stgp,
1066aa5ba96d294698809186cc4b59034abbd3076812Brian Paul                  const struct st_gp_variant_key *key)
10673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
1068aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   struct st_gp_variant *gpv;
10693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1070aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   /* Search for existing variant */
1071aa5ba96d294698809186cc4b59034abbd3076812Brian Paul   for (gpv = stgp->variants; gpv; gpv = gpv->next) {
10723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (memcmp(&gpv->key, key, sizeof(*key)) == 0) {
10733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         break;
10743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
10763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!gpv) {
10783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      /* create new */
10793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      gpv = st_translate_geometry_program(st, stgp, key);
10803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      if (gpv) {
10813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         /* insert into list */
1082aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         gpv->next = stgp->variants;
1083aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         stgp->variants = gpv;
10843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
10853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
10863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   return gpv;
1088da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin}
1089678f80b347801d925c07a774faee1ed3f716de15Brian Paul
10903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
10923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1093678f80b347801d925c07a774faee1ed3f716de15Brian Paul/**
1094678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text
1095678f80b347801d925c07a774faee1ed3f716de15Brian Paul */
1096678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid
1097f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx)
1098678f80b347801d925c07a774faee1ed3f716de15Brian Paul{
109984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   struct gl_shader_program *shProg[3] = {
110084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentVertexProgram,
110184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentGeometryProgram,
110284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      ctx->Shader.CurrentFragmentProgram,
110384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   };
110484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   unsigned j;
110584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
110684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick   for (j = 0; j < 3; j++) {
110784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      unsigned i;
110884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
110984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      if (shProg[j] == NULL)
111084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 continue;
111184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
111284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick      for (i = 0; i < shProg[j]->NumShaders; i++) {
111384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 struct gl_shader *sh;
111484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
111584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 switch (shProg[j]->Shaders[i]->Type) {
111684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_VERTEX_SHADER:
111784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 0) ? NULL : shProg[j]->Shaders[i];
111884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
111984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_GEOMETRY_SHADER_ARB:
112084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 1) ? NULL : shProg[j]->Shaders[i];
112184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
112284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 case GL_FRAGMENT_SHADER:
112384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    sh = (i != 2) ? NULL : shProg[j]->Shaders[i];
112484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    break;
1125a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	 default:
1126a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    assert(0);
1127a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    sh = NULL;
1128a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee	    break;
112984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
113084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick
113184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 if (sh != NULL) {
113284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders);
113384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	    printf("%s\n", sh->Source);
113484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick	 }
1135678f80b347801d925c07a774faee1ed3f716de15Brian Paul      }
1136678f80b347801d925c07a774faee1ed3f716de15Brian Paul   }
1137678f80b347801d925c07a774faee1ed3f716de15Brian Paul}
11383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
11413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants.  Free all the
11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context.
11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
11453d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program)
11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
11473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   if (!program)
11483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      return;
11493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
11503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (program->Target) {
11513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_PROGRAM_ARB:
11523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_vertex_program *stvp = (struct st_vertex_program *) program;
1154aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_vp_variant *vpv, **prevPtr = &stvp->variants;
11553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1156aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (vpv = stvp->variants; vpv; ) {
1157aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_vp_variant *next = vpv->next;
11583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (vpv->key.st == st) {
11593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1160a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
11613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1162aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_vp_variant(st, vpv);
11633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1165a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &vpv->next;
11663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            vpv = next;
11683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
11693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
11713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_PROGRAM_ARB:
11723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
11733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct st_fragment_program *stfp =
11743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            (struct st_fragment_program *) program;
1175aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_fp_variant *fpv, **prevPtr = &stfp->variants;
11763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
1177aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (fpv = stfp->variants; fpv; ) {
1178aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_fp_variant *next = fpv->next;
11793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            if (fpv->key.st == st) {
11803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* unlink from list */
1181a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
11823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul               /* destroy this variant */
1183aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_fp_variant(st, fpv);
11843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            else {
1186a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &fpv->next;
11873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            }
11883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            fpv = next;
11893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
11903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
11913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
1192c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul   case MESA_GEOMETRY_PROGRAM:
1193c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      {
1194c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         struct st_geometry_program *stgp =
1195c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            (struct st_geometry_program *) program;
1196aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         struct st_gp_variant *gpv, **prevPtr = &stgp->variants;
1197c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul
1198aa5ba96d294698809186cc4b59034abbd3076812Brian Paul         for (gpv = stgp->variants; gpv; ) {
1199aa5ba96d294698809186cc4b59034abbd3076812Brian Paul            struct st_gp_variant *next = gpv->next;
1200c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            if (gpv->key.st == st) {
1201c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* unlink from list */
1202a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               *prevPtr = next;
1203c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul               /* destroy this variant */
1204aa5ba96d294698809186cc4b59034abbd3076812Brian Paul               delete_gp_variant(st, gpv);
1205c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1206c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            else {
1207a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul               prevPtr = &gpv->next;
1208c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            }
1209c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul            gpv = next;
1210c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul         }
1211c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      }
1212c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul      break;
12133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
1214e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul      _mesa_problem(NULL, "Unexpected program target 0x%x in "
1215e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul                    "destroy_program_variants_cb()", program->Target);
12163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
12173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
12183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
12213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the shader's program variants
12223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context.
12233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
12243d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
12253d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData)
12263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
12273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
12283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_shader *shader = (struct gl_shader *) data;
12293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   switch (shader->Type) {
12313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_SHADER_PROGRAM_MESA:
12323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
12333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         struct gl_shader_program *shProg = (struct gl_shader_program *) data;
12343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         GLuint i;
12353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         for (i = 0; i < shProg->NumShaders; i++) {
12373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul            destroy_program_variants(st, shProg->Shaders[i]->Program);
12383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         }
12393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
124077d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick	 for (i = 0; i < Elements(shProg->_LinkedShaders); i++) {
1241ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin	    if (shProg->_LinkedShaders[i])
1242ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin               destroy_program_variants(st, shProg->_LinkedShaders[i]->Program);
124377d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick	 }
12443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
12453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
12463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_VERTEX_SHADER:
12473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_FRAGMENT_SHADER:
12483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   case GL_GEOMETRY_SHADER:
12493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      {
12503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul         destroy_program_variants(st, shader->Program);
12513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      }
12523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      break;
12533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   default:
12543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul      assert(0);
12553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   }
12563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
12573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
12603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk.  Free all the program variants which match
12613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context.
12623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
12633d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void
12643d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData)
12653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
12663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct st_context *st = (struct st_context *) userData;
12673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   struct gl_program *program = (struct gl_program *) data;
12683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   destroy_program_variants(st, program);
12693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
12703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/**
12733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which
12743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context.
12753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down.
12763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */
12773d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid
12783d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st)
12793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{
12803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* ARB vert/frag program */
12813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->Programs,
12823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_program_variants_cb, st);
12833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul
12843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   /* GLSL vert/frag/geom shaders */
12853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul   _mesa_HashWalk(st->ctx->Shared->ShaderObjects,
12863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul                  destroy_shader_program_variants_cb, st);
12873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul}
12886792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
12896792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
12906792969cbc0d233942b15285e0fa84e6602733c2Brian Paul/**
12916792969cbc0d233942b15285e0fa84e6602733c2Brian Paul * For debugging, print/dump the current vertex program.
12926792969cbc0d233942b15285e0fa84e6602733c2Brian Paul */
12936792969cbc0d233942b15285e0fa84e6602733c2Brian Paulvoid
12946792969cbc0d233942b15285e0fa84e6602733c2Brian Paulst_print_current_vertex_program(void)
12956792969cbc0d233942b15285e0fa84e6602733c2Brian Paul{
12966792969cbc0d233942b15285e0fa84e6602733c2Brian Paul   GET_CURRENT_CONTEXT(ctx);
12976792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
12986792969cbc0d233942b15285e0fa84e6602733c2Brian Paul   if (ctx->VertexProgram._Current) {
12996792969cbc0d233942b15285e0fa84e6602733c2Brian Paul      struct st_vertex_program *stvp =
13006792969cbc0d233942b15285e0fa84e6602733c2Brian Paul         (struct st_vertex_program *) ctx->VertexProgram._Current;
13016792969cbc0d233942b15285e0fa84e6602733c2Brian Paul      struct st_vp_variant *stv;
13026792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
13036792969cbc0d233942b15285e0fa84e6602733c2Brian Paul      debug_printf("Vertex program %u\n", stvp->Base.Base.Id);
13046792969cbc0d233942b15285e0fa84e6602733c2Brian Paul
13056792969cbc0d233942b15285e0fa84e6602733c2Brian Paul      for (stv = stvp->variants; stv; stv = stv->next) {
13066792969cbc0d233942b15285e0fa84e6602733c2Brian Paul         debug_printf("variant %p\n", stv);
13076792969cbc0d233942b15285e0fa84e6602733c2Brian Paul         tgsi_dump(stv->tgsi.tokens, 0);
13086792969cbc0d233942b15285e0fa84e6602733c2Brian Paul      }
13096792969cbc0d233942b15285e0fa84e6602733c2Brian Paul   }
13106792969cbc0d233942b15285e0fa84e6602733c2Brian Paul}
1311