st_program.c revision aa5ba96d294698809186cc4b59034abbd3076812
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" 36b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/mtypes.h" 373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "program/prog_parameter.h" 38ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_print.h" 39ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/programopt.h" 40f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 41f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h" 42f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h" 43abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h" 446acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h" 45c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h" 461b8aa2176c4fc580cc31c57c7e50e7f39ef2cc04Vinson Lee#include "tgsi/tgsi_ureg.h" 47f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 48b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "st_debug.h" 493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_bitmap.h" 503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_drawpixels.h" 51f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h" 52f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h" 53ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h" 54339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 55f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 568468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 578468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 588468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/** 59aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a vertex program variant. Note the caller must unlink 60aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list. 613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 623d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 63aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_vp_variant(struct st_context *st, struct st_vp_variant *vpv) 643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->driver_shader) 663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_delete_vertex_shader(st->cso_context, vpv->driver_shader); 673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if FEATURE_feedback || FEATURE_rastpos 693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->draw_shader) 703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul draw_delete_vertex_shader( st->draw, vpv->draw_shader ); 713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#endif 723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->tgsi.tokens) 743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_free_tokens(vpv->tgsi.tokens); 753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE( vpv ); 773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 828468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations: 838468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */ 8407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid 85aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_vp_variants( struct st_context *st, 8607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp ) 8707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 88aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv; 8907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 90aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; ) { 91aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *next = vpv->next; 92aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_vp_variant(st, vpv); 933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = next; 943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 96aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stvp->variants = NULL; 973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 102aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a fragment program variant. Note the caller must unlink 103aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list. 1043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1053d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 106aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_fp_variant(struct st_context *st, struct st_fp_variant *fpv) 1073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 1083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv->driver_shader) 1093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_delete_fragment_shader(st->cso_context, fpv->driver_shader); 11007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(fpv); 1123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 116aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a fragment program. 1173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1183d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 119aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp) 1203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 121aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv; 1223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 123aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; ) { 124aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *next = fpv->next; 125aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_fp_variant(st, fpv); 1263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = next; 1273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 1283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 129aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stfp->variants = NULL; 1303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 134aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a geometry program variant. Note the caller must unlink 135aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list. 1363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1373d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 138aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_gp_variant(struct st_context *st, struct st_gp_variant *gpv) 1393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 1403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (gpv->driver_shader) 1413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_delete_geometry_shader(st->cso_context, gpv->driver_shader); 14207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(gpv); 1443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 14507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 148aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a geometry program. 1493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1503d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 151aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp) 1523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 153aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 1543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 155aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; ) { 156aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *next = gpv->next; 157aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_gp_variant(st, gpv); 1583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv = next; 15907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 16007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 161aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stgp->variants = NULL; 16207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 16307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 16407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 16507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 166f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader. 169e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping to map vertex program output registers (VERT_RESULT_x) 170e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * to TGSI output slots 171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 1743d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 17507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st, 17607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp) 177f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 17807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell GLuint attr; 179c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 18007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs = 0; 18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_outputs = 0; 182f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 183f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs if (stvp->Base.IsPositionInvariant) 184f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs _mesa_insert_mvp_code(st->ctx, &stvp->Base); 185f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs 186325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell assert(stvp->Base.Base.NumInstructions > 1); 187325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell 188f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 189f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of inputs, the mappings between VERT_ATTRIB_x 190f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * and TGSI generic input indexes, plus input attrib semantic info. 191f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.InputsRead & (1 << attr)) { 19407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->input_to_index[attr] = stvp->num_inputs; 19507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->index_to_input[stvp->num_inputs] = attr; 19607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs++; 197f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 198f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 19950caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger /* bit of a hack, presetup potentially unused edgeflag input */ 20050caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs; 20150caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG; 202f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 20307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Compute mapping of vertex program outputs to slots. 204f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 205f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 206b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) { 20707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = ~0; 20807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 20907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell else { 21007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell unsigned slot = stvp->num_outputs++; 21107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 21207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = slot; 213f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 214f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 215f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 21607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 21707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 218f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 22007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 22107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 222f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 22407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 22507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 226f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 22807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 22907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 230f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 23207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 23307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 234f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 23607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 23707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 238f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 24007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 24107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 242f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 244f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 245f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 24607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX0: 248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX1: 249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX2: 250f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX3: 251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX4: 252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX5: 253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX6: 254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX7: 25507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 25607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0; 25707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 25807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 259f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 26107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr < VERT_RESULT_MAX); 26207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 26307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 - 26407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FRAG_ATTRIB_TEX0 + 26507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell attr - 26607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell VERT_RESULT_VAR0); 26707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 268f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 269f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 270f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 271890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger /* similar hack to above, presetup potentially unused edgeflag output */ 272890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs; 273890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG; 274890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_index[stvp->num_outputs] = 0; 27507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 276f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 277509d9eb686411254b24139012b7594e10a760b6cBrian Paul 2783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 279aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a vertex program to create a new variant. 2803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 281aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_vp_variant * 28207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st, 28307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp, 284aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 28507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 286aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant); 28707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct pipe_context *pipe = st->pipe; 288a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 289a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger enum pipe_error error; 290890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger unsigned num_outputs; 291a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 2923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_prepare_vertex_program( st, stvp ); 2933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 29483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT); 29583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING); 29683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 297a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_VERTEX ); 298b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee if (ureg == NULL) { 299b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee FREE(vpv); 300a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 301b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee } 302a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 303c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák vpv->key = *key; 304c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák 30550caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger vpv->num_inputs = stvp->num_inputs; 306890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs = stvp->num_outputs; 307890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger if (key->passthrough_edgeflags) { 308890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger vpv->num_inputs++; 309890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs++; 310890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger } 311a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 312ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul if (ST_DEBUG & DEBUG_MESA) { 313ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program(&stvp->Base.Base); 314ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program_parameters(st->ctx, &stvp->Base.Base); 315ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul debug_printf("\n"); 316ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul } 317ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul 31883d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul error = st_translate_mesa_program(st->ctx, 31983d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul TGSI_PROCESSOR_VERTEX, 32083d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul ureg, 32183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul &stvp->Base.Base, 32283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul /* inputs */ 32383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul vpv->num_inputs, 32483d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->input_to_index, 32583d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul NULL, /* input semantic name */ 32683d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul NULL, /* input semantic index */ 32783d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul NULL, 32883d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul /* outputs */ 32983d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul num_outputs, 33083d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->result_to_output, 33183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->output_semantic_name, 33283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->output_semantic_index, 33383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul key->passthrough_edgeflags ); 33425b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 335a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger if (error) 336a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell goto fail; 337a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 338b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 339b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul if (!vpv->tgsi.tokens) 3409d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger goto fail; 3419d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 342a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 34325b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 344b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi); 345f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 346b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 347b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( vpv->tgsi.tokens, 0 ); 348b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 349b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 35007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 35107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell return vpv; 352a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 353a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail: 3549d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__); 3559d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger _mesa_print_program(&stvp->Base.Base); 3569d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_assert(0); 3579d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 358a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 359a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 360f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 361f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 362f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 3633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 364aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant. 3653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 366aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant * 367aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st, 3683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp, 369aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 3703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 371aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv; 3723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 373aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 374aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; vpv = vpv->next) { 3753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&vpv->key, key, sizeof(*key)) == 0) { 3763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 3773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 3803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!vpv) { 3813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create now */ 3823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = st_translate_vertex_program(st, stvp, key); 3833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv) { 3843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 385aa5ba96d294698809186cc4b59034abbd3076812Brian Paul vpv->next = stvp->variants; 386aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stvp->variants = vpv; 3873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 3903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return vpv; 3913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 3923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 393f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 394f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 3953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in 3963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key. 3973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return new fragment program variant 398f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 399aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant * 400f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 4013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 402aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 403f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 404339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 405aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant); 406f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 407aa5ba96d294698809186cc4b59034abbd3076812Brian Paul if (!variant) 4083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 409fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 4103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(!(key->bitmap && key->drawpixels)); 411fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 4123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->bitmap) { 4133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glBitmap drawing */ 4143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_fragment_program *fp; 41583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 4163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_bitmap_fragment_program(st, &stfp->Base, 417aa5ba96d294698809186cc4b59034abbd3076812Brian Paul &fp, &variant->bitmap_sampler); 418f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 419aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 42043125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 4213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else if (key->drawpixels) { 4233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glDrawPixels drawing */ 4243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_fragment_program *fp; 425e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 4263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->drawpixels_z || key->drawpixels_stencil) { 4273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z, 4283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul key->drawpixels_stencil); 429f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 430e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell else { 4313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* RGBA */ 4323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_drawpix_fragment_program(st, &stfp->Base, &fp); 433aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 434e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell } 43543125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 436f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 437f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 4383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!stfp->tgsi.tokens) { 4393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* need to translate Mesa instructions to TGSI now */ 4403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint outputMapping[FRAG_RESULT_MAX]; 4413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint inputMapping[FRAG_ATTRIB_MAX]; 4423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ 4433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint attr; 4443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul enum pipe_error error; 4453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul const GLbitfield inputsRead = stfp->Base.Base.InputsRead; 4463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct ureg_program *ureg; 447635c4c41bdf111462939da292d65328595d314e8Brian 4483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 4493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 4503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul uint fs_num_inputs = 0; 4513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 4533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 4543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul uint fs_num_outputs = 0; 4553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT); 4583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* 4603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Convert Mesa program inputs to TGSI input register semantics. 4613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 4623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 4633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (inputsRead & (1 << attr)) { 4643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul const GLuint slot = fs_num_inputs++; 4653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping[attr] = slot; 467ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie 468635c4c41bdf111462939da292d65328595d314e8Brian switch (attr) { 4693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_WPOS: 4703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 4713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 4733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_COL0: 4753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 4763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 4783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_COL1: 4803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 4813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 1; 4823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 4833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_FOGC: 4853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 4863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 488635c4c41bdf111462939da292d65328595d314e8Brian break; 4893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_FACE: 4903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_FACE; 4913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 4933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* In most cases, there is nothing special about these 4953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * inputs, so adopt a convention to use the generic 4963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * semantic name and the mesa FRAG_ATTRIB_ number as the 4973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * index. 4983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * 4993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * All that is required is that the vertex shader labels 5003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * its own outputs similarly, and that the vertex shader 5013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * generates at least every output required by the 5023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * fragment shader plus fixed-function hardware (such as 5033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * BFC). 5043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * 5053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * There is no requirement that semantic indexes start at 5063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * zero or be restricted to a particular range -- nobody 5073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * should be building tables based on semantic index. 5083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 5093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_PNTC: 5103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX0: 5113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX1: 5123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX2: 5133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX3: 5143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX4: 5153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX5: 5163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX6: 5173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX7: 5183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_VAR0: 519af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca default: 5203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* Actually, let's try and zero-base this just for 5213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * readability of the generated TGSI. 5223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 5233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(attr >= FRAG_ATTRIB_TEX0); 5243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0); 5253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 5263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (attr == FRAG_ATTRIB_PNTC) 5273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 5283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else 5293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 530635c4c41bdf111462939da292d65328595d314e8Brian break; 531635c4c41bdf111462939da292d65328595d314e8Brian } 5323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 5343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping[attr] = -1; 5353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* 5393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Semantics and mapping for outputs 5403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 5413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 5423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul uint numColors = 0; 5433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten; 5443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* if z is written, emit that first */ 5463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { 5473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 5483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index[fs_num_outputs] = 0; 5493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 5503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_outputs++; 5513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 5523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 553c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 5543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) { 5553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL; 5563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index[fs_num_outputs] = 0; 5573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs; 558fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 5593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); 5603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* handle remaning outputs (color) */ 5633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 5643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (outputsWritten & BITFIELD64_BIT(attr)) { 5653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (attr) { 5663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_RESULT_DEPTH: 5673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_RESULT_STENCIL: 5683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* handled above */ 5693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(0); 5703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 5713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 5723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(attr == FRAG_RESULT_COLOR || 5733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX)); 5743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 5753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index[fs_num_outputs] = numColors; 5763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping[attr] = fs_num_outputs; 5773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul numColors++; 5783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 5793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_outputs++; 5823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 583f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 584f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 585f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 5863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); 5873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (ureg == NULL) 5883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 589a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 5903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (ST_DEBUG & DEBUG_MESA) { 5913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_print_program(&stfp->Base.Base); 5923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_print_program_parameters(st->ctx, &stfp->Base.Base); 5933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul debug_printf("\n"); 5943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 595a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 5963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul error = st_translate_mesa_program(st->ctx, 5973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul TGSI_PROCESSOR_FRAGMENT, 5983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg, 5993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul &stfp->Base.Base, 6003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* inputs */ 6013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_inputs, 6023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping, 6033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name, 6043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index, 6053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode, 6063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* outputs */ 6073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_outputs, 6083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping, 6093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name, 6103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index, FALSE ); 6113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 6133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg_destroy( ureg ); 6143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 616aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in variant */ 617aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi); 618aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->key = *key; 619f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 620b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 621b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 622b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 623b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 6243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 625aa5ba96d294698809186cc4b59034abbd3076812Brian Paul return variant; 626f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 627f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 6283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 6303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed. 6313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 632aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant * 633aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st, 6343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 635aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 6363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 637aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv; 6383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 639aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 640aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; fpv = fpv->next) { 6413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&fpv->key, key, sizeof(*key)) == 0) { 6423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 6433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!fpv) { 6473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 6483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = st_translate_fragment_program(st, stfp, key); 6493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv) { 6503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 651aa5ba96d294698809186cc4b59034abbd3076812Brian Paul fpv->next = stfp->variants; 652aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stfp->variants = fpv; 6533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return fpv; 6573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 6583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 661aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant. 6623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 663aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant * 664da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st, 6653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 666aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 667da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{ 668da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint inputMapping[GEOM_ATTRIB_MAX]; 669da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint outputMapping[GEOM_RESULT_MAX]; 670da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct pipe_context *pipe = st->pipe; 671da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin enum pipe_error error; 672da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint attr; 673da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLbitfield inputsRead = stgp->Base.Base.InputsRead; 674da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint vslot = 0; 675da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint num_generic = 0; 676da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 677da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_inputs = 0; 678da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_builtin_inputs = 0; 679da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_array_offset = 0; 680da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 681da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 682da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 683da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_outputs = 0; 684da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 685da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLint i; 686da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint maxSlot = 0; 687da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct ureg_program *ureg; 688da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 689aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 6903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 691aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv = CALLOC_STRUCT(st_gp_variant); 6923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) 6933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 6943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 69583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT); 69683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING); 69783baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 698da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY ); 699da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ureg == NULL) { 7003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(gpv); 7013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 702da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 703da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 704da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* which vertex output goes to the first geometry input */ 7057c42390453e611367cf1ba11446692ec04e0abfbZack Rusin vslot = 0; 706da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 707425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(inputMapping, 0, sizeof(inputMapping)); 708425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(outputMapping, 0, sizeof(outputMapping)); 709425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin 710da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 711da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Convert Mesa program inputs to TGSI input register semantics. 712da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 713da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) { 714da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (inputsRead & (1 << attr)) { 715da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLuint slot = gs_num_inputs; 716da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 717da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_inputs++; 718da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 719da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputMapping[attr] = slot; 720da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 721da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs; 722da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_to_index[attr] = vslot; 723da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->index_to_input[vslot] = attr; 724da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++vslot; 725da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 7267c42390453e611367cf1ba11446692ec04e0abfbZack Rusin if (attr != GEOM_ATTRIB_PRIMITIVE_ID) { 727da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_array_offset += 2; 728da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } else 729da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++gs_builtin_inputs; 730da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 7313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0 732da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("input map at %d = %d\n", 733da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]); 734da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 735da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 736da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 737da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_PRIMITIVE_ID: 738da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID; 739da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 740da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 741da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_POSITION: 742da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 743da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 744da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 745da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR0: 746da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 747da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 748da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 749da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR1: 750da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 751da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 1; 752da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 753da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_FOG_FRAG_COORD: 754da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 755da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 756da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 757da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_TEX_COORD: 758da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 759da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 760da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 761da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_VAR0: 762da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 763da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 764da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 765da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 766da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 767da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 768da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 769da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 770da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* initialize output semantics to defaults */ 771da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 772da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 773da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i] = 0; 774da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 775da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 776da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin num_generic = 0; 777da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 778da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Determine number of outputs, the (default) output register 779da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * mapping and the semantic information for each output. 780da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 781da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 782da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->Base.Base.OutputsWritten & (1 << attr)) { 783da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint slot; 784da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 785da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot = gs_num_outputs; 786da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs++; 787da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputMapping[attr] = slot; 788da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 789da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 790da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_POS: 791da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot == 0); 792da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 793da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 794da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 795da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL0: 796da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 797da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 798da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 799da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL1: 800da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 801da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 802da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 803da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL0: 804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 805da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 806da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 807da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL1: 808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_FOGC: 812da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_PSIZ: 816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX0: 820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX1: 821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX2: 822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX3: 823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX4: 824da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX5: 825da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX6: 826da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX7: 827da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 828da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_VAR0: 829da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 830da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 831da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot < Elements(gs_output_semantic_name)); 832da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* use default semantic info */ 833da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 834da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = num_generic++; 835da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 836da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 839da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION); 840da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* find max output slot referenced to compute gs_num_outputs */ 842da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 843da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot) 844da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin maxSlot = outputMapping[attr]; 845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 846da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs = maxSlot + 1; 847da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 848da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */ 849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin { 850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint i; 851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("outputMapping? %d\n", outputMapping ? 1 : 0); 852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping) { 853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("attr -> slot\n"); 854da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < 16; i++) { 855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %3d\n", i, outputMapping[i]); 856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("slot sem_name sem_index\n"); 859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < gs_num_outputs; i++) { 860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %d %d\n", 861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin i, 862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i], 863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i]); 864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 866da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* free old shader state, if any */ 869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->tgsi.tokens) { 870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin st_free_tokens(stgp->tgsi.tokens); 871da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = NULL; 872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_input_prim(ureg, stgp->Base.InputType); 875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_output_prim(ureg, stgp->Base.OutputType); 876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut); 877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 8783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul error = st_translate_mesa_program(st->ctx, 8793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul TGSI_PROCESSOR_GEOMETRY, 8803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg, 8813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul &stgp->Base.Base, 8823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* inputs */ 8833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_num_inputs, 8843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping, 8853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul stgp->input_semantic_name, 8863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul stgp->input_semantic_index, 8873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul NULL, 8883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* outputs */ 8893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_num_outputs, 8903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping, 8913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_output_semantic_name, 8923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_output_semantic_index, 8933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FALSE); 894da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 895da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->num_inputs = gs_num_inputs; 896da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 897da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_destroy( ureg ); 8983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 899aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in new variant */ 9003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi); 9013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->key = *key; 902da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 903da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { 904da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin _mesa_print_program(&stgp->Base.Base); 905da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 906da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 907da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 908da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ST_DEBUG & DEBUG_TGSI) { 909da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin tgsi_dump(stgp->tgsi.tokens, 0); 910da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 911da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 9123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 9143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 9153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 9183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant. 9193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 920aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant * 921aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st, 9223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 923aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 9243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 925aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 9263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 927aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 928aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; gpv = gpv->next) { 9293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&gpv->key, key, sizeof(*key)) == 0) { 9303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 9313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) { 9353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 9363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv = st_translate_geometry_program(st, stgp, key); 9373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (gpv) { 9383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 939aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv->next = stgp->variants; 940aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stgp->variants = gpv; 9413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 945da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin} 946678f80b347801d925c07a774faee1ed3f716de15Brian Paul 9473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 950678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 951678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 952678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 953678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 954f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx) 955678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 95684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader_program *shProg[3] = { 95784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentVertexProgram, 95884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentGeometryProgram, 95984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentFragmentProgram, 96084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick }; 96184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned j; 96284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 96384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (j = 0; j < 3; j++) { 96484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned i; 96584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 96684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (shProg[j] == NULL) 96784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick continue; 96884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 96984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (i = 0; i < shProg[j]->NumShaders; i++) { 97084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader *sh; 97184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 97284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick switch (shProg[j]->Shaders[i]->Type) { 97384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_VERTEX_SHADER: 97484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 0) ? NULL : shProg[j]->Shaders[i]; 97584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 97684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_GEOMETRY_SHADER_ARB: 97784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 1) ? NULL : shProg[j]->Shaders[i]; 97884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 97984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_FRAGMENT_SHADER: 98084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 2) ? NULL : shProg[j]->Shaders[i]; 98184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 982a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee default: 983a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee assert(0); 984a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee sh = NULL; 985a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee break; 98684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 98784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 98884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (sh != NULL) { 98984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders); 99084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("%s\n", sh->Source); 99184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 992678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 993678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 994678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 9953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 9983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants. Free all the 9993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context. 10003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 10013d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 10023d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program) 10033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 10043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!program) 10053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return; 10063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (program->Target) { 10083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_PROGRAM_ARB: 10093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 10103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp = (struct st_vertex_program *) program; 1011aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv, **prevPtr = &stvp->variants; 10123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1013aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; ) { 1014aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *next = vpv->next; 10153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->key.st == st) { 10163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1017a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 10183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1019aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_vp_variant(st, vpv); 10203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1022a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &vpv->next; 10233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = next; 10253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 10283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_PROGRAM_ARB: 10293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 10303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp = 10313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul (struct st_fragment_program *) program; 1032aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv, **prevPtr = &stfp->variants; 10333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1034aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; ) { 1035aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *next = fpv->next; 10363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv->key.st == st) { 10373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1038a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 10393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1040aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_fp_variant(st, fpv); 10413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1043a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &fpv->next; 10443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = next; 10463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 1049c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul case MESA_GEOMETRY_PROGRAM: 1050c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul { 1051c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul struct st_geometry_program *stgp = 1052c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul (struct st_geometry_program *) program; 1053aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv, **prevPtr = &stgp->variants; 1054c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul 1055aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; ) { 1056aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *next = gpv->next; 1057c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul if (gpv->key.st == st) { 1058c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* unlink from list */ 1059a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 1060c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* destroy this variant */ 1061aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_gp_variant(st, gpv); 1062c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1063c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul else { 1064a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &gpv->next; 1065c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1066c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul gpv = next; 1067c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1068c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1069c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul break; 10703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 10713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_problem(NULL, "Unexpected program target in " 10723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul "destroy_program_variants_cb()"); 10733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 10753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 10783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the shader's program variants 10793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context. 10803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 10813d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 10823d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData) 10833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 10843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 10853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader *shader = (struct gl_shader *) data; 10863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (shader->Type) { 10883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_SHADER_PROGRAM_MESA: 10893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 10903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader_program *shProg = (struct gl_shader_program *) data; 10913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint i; 10923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (i = 0; i < shProg->NumShaders; i++) { 10943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shProg->Shaders[i]->Program); 10953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, (struct gl_program *) 10983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul shProg->VertexProgram); 10993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, (struct gl_program *) 11003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul shProg->FragmentProgram); 11013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, (struct gl_program *) 11023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul shProg->GeometryProgram); 11033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 11053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_SHADER: 11063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_SHADER: 11073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_GEOMETRY_SHADER: 11083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shader->Program); 11103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 11123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 11133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(0); 11143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 11163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 11193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the program variants which match 11203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context. 11213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 11223d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 11233d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData) 11243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 11263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_program *program = (struct gl_program *) data; 11273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, program); 11283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 11293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 11323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which 11333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context. 11343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down. 11353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 11363d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 11373d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st) 11383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* ARB vert/frag program */ 11403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->Programs, 11413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants_cb, st); 11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* GLSL vert/frag/geom shaders */ 11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->ShaderObjects, 11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_shader_program_variants_cb, st); 11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1147