st_program.c revision 80424700574e128070f457d79e1920d512a1efda
1f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/************************************************************************** 2f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 3f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * All Rights Reserved. 5f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 6f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Permission is hereby granted, free of charge, to any person obtaining a 7f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * copy of this software and associated documentation files (the 8f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * "Software"), to deal in the Software without restriction, including 9f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * without limitation the rights to use, copy, modify, merge, publish, 10f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * distribute, sub license, and/or sell copies of the Software, and to 11f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * permit persons to whom the Software is furnished to do so, subject to 12f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * the following conditions: 13f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 14f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * The above copyright notice and this permission notice (including the 15f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * next paragraph) shall be included in all copies or substantial portions 16f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * of the Software. 17f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 18f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 26f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian **************************************************************************/ 27f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 28f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Authors: 29f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Keith Whitwell <keith@tungstengraphics.com> 30f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Brian Paul 31f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 32f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 33f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 34b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/imports.h" 353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "main/hash.h" 36edc09358f72cd48cb2315daf23c82e7646aeaea3Vinson Lee#include "main/mfeatures.h" 37b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/mtypes.h" 383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "program/prog_parameter.h" 39ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_print.h" 40ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/programopt.h" 41f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 42f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h" 43f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h" 44abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h" 456acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h" 46c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h" 471b8aa2176c4fc580cc31c57c7e50e7f39ef2cc04Vinson Lee#include "tgsi/tgsi_ureg.h" 48f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 49b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "st_debug.h" 503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_bitmap.h" 513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_drawpixels.h" 52f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h" 53f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h" 54ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h" 55339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 56f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 578468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 588468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 598468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/** 60aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a vertex program variant. Note the caller must unlink 61aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list. 623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 633d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 64aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_vp_variant(struct st_context *st, struct st_vp_variant *vpv) 653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->driver_shader) 673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_delete_vertex_shader(st->cso_context, vpv->driver_shader); 683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if FEATURE_feedback || FEATURE_rastpos 703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->draw_shader) 713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul draw_delete_vertex_shader( st->draw, vpv->draw_shader ); 723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#endif 733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->tgsi.tokens) 753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_free_tokens(vpv->tgsi.tokens); 763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE( vpv ); 783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 838468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations: 848468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */ 8507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid 86aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_vp_variants( struct st_context *st, 8707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp ) 8807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 89aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv; 9007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 91aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; ) { 92aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *next = vpv->next; 93aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_vp_variant(st, vpv); 943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = next; 953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 97aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stvp->variants = NULL; 983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 103aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a fragment program variant. Note the caller must unlink 104aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list. 1053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1063d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 107aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_fp_variant(struct st_context *st, struct st_fp_variant *fpv) 1083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 1093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv->driver_shader) 1103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_delete_fragment_shader(st->cso_context, fpv->driver_shader); 11180424700574e128070f457d79e1920d512a1efdaThomas Hellstrom if (fpv->parameters) 11280424700574e128070f457d79e1920d512a1efdaThomas Hellstrom _mesa_free_parameter_list(fpv->parameters); 11307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(fpv); 1153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 119aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a fragment program. 1203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1213d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 122aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp) 1233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 124aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv; 1253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 126aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; ) { 127aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *next = fpv->next; 128aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_fp_variant(st, fpv); 1293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = next; 1303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 1313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 132aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stfp->variants = NULL; 1333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 137aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a geometry program variant. Note the caller must unlink 138aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list. 1393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1403d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 141aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_gp_variant(struct st_context *st, struct st_gp_variant *gpv) 1423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 1433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (gpv->driver_shader) 1443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_delete_geometry_shader(st->cso_context, gpv->driver_shader); 14507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(gpv); 1473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 14807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 151aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a geometry program. 1523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1533d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 154aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp) 1553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 156aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 1573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 158aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; ) { 159aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *next = gpv->next; 160aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_gp_variant(st, gpv); 1613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv = next; 16207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 16307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 164aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stgp->variants = NULL; 16507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 16607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 16707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 16807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 169f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader. 172e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping to map vertex program output registers (VERT_RESULT_x) 173e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * to TGSI output slots 174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 175f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 176f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 1773d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 17807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st, 17907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp) 180f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell GLuint attr; 182c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 18307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs = 0; 18407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_outputs = 0; 185f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 186f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs if (stvp->Base.IsPositionInvariant) 187f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs _mesa_insert_mvp_code(st->ctx, &stvp->Base); 188f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs 189325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell assert(stvp->Base.Base.NumInstructions > 1); 190325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell 191f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of inputs, the mappings between VERT_ATTRIB_x 193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * and TGSI generic input indexes, plus input attrib semantic info. 194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 195f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 196f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.InputsRead & (1 << attr)) { 19707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->input_to_index[attr] = stvp->num_inputs; 19807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->index_to_input[stvp->num_inputs] = attr; 19907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs++; 200f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 201f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 20250caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger /* bit of a hack, presetup potentially unused edgeflag input */ 20350caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs; 20450caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG; 205f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 20607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Compute mapping of vertex program outputs to slots. 207f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 208f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 209b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) { 21007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = ~0; 21107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 21207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell else { 21307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell unsigned slot = stvp->num_outputs++; 21407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 21507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = slot; 216f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 217f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 218f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 21907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 22007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 221f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 222f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 22307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 22407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 225f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 226f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 22707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 22807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 229f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 230f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 23107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 23207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 233f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 234f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 23507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 23607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 237f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 238f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 23907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 24007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 241f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 242f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 24307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 24407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 245f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 246f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 24907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 250f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX0: 251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX1: 252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX2: 253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX3: 254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX4: 255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX5: 256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX6: 257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX7: 25807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 25907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0; 26007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 26107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 262f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 263f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 26407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr < VERT_RESULT_MAX); 26507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 26607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 - 26707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FRAG_ATTRIB_TEX0 + 26807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell attr - 26907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell VERT_RESULT_VAR0); 27007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 271f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 272f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 273f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 274890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger /* similar hack to above, presetup potentially unused edgeflag output */ 275890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs; 276890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG; 277890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_index[stvp->num_outputs] = 0; 27807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 279f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 280509d9eb686411254b24139012b7594e10a760b6cBrian Paul 2813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 282aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a vertex program to create a new variant. 2833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 284aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_vp_variant * 28507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st, 28607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp, 287aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 28807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 289aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant); 29007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct pipe_context *pipe = st->pipe; 291a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 292a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger enum pipe_error error; 293890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger unsigned num_outputs; 294a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 2953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_prepare_vertex_program( st, stvp ); 2963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 29783baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT); 29883baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING); 29983baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 300a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_VERTEX ); 301b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee if (ureg == NULL) { 302b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee FREE(vpv); 303a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 304b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee } 305a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 306c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák vpv->key = *key; 307c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák 30850caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger vpv->num_inputs = stvp->num_inputs; 309890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs = stvp->num_outputs; 310890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger if (key->passthrough_edgeflags) { 311890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger vpv->num_inputs++; 312890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs++; 313890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger } 314a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 315ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul if (ST_DEBUG & DEBUG_MESA) { 316ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program(&stvp->Base.Base); 317ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program_parameters(st->ctx, &stvp->Base.Base); 318ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul debug_printf("\n"); 319ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul } 320ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul 32183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul error = st_translate_mesa_program(st->ctx, 32283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul TGSI_PROCESSOR_VERTEX, 32383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul ureg, 32483d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul &stvp->Base.Base, 32583d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul /* inputs */ 32683d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul vpv->num_inputs, 32783d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->input_to_index, 32883d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul NULL, /* input semantic name */ 32983d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul NULL, /* input semantic index */ 33083d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul NULL, 33183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul /* outputs */ 33283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul num_outputs, 33383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->result_to_output, 33483d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->output_semantic_name, 33583d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->output_semantic_index, 33683d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul key->passthrough_edgeflags ); 33725b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 338a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger if (error) 339a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell goto fail; 340a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 341b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 342b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul if (!vpv->tgsi.tokens) 3439d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger goto fail; 3449d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 345a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 34625b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 347b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi); 348f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 349b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 350b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( vpv->tgsi.tokens, 0 ); 351b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 352b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 35307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 35407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell return vpv; 355a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 356a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail: 3579d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__); 3589d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger _mesa_print_program(&stvp->Base.Base); 3599d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_assert(0); 3609d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 361a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 362a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 363f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 364f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 365f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 3663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 367aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant. 3683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 369aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant * 370aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st, 3713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp, 372aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 3733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 374aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv; 3753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 376aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 377aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; vpv = vpv->next) { 3783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&vpv->key, key, sizeof(*key)) == 0) { 3793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 3803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 3833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!vpv) { 3843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create now */ 3853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = st_translate_vertex_program(st, stvp, key); 3863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv) { 3873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 388aa5ba96d294698809186cc4b59034abbd3076812Brian Paul vpv->next = stvp->variants; 389aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stvp->variants = vpv; 3903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 3933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return vpv; 3943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 3953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 396f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 397f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 3983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in 3993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key. 4003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return new fragment program variant 401f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 402aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant * 403f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 4043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 405aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 406f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 407339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 408aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant); 409f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 410aa5ba96d294698809186cc4b59034abbd3076812Brian Paul if (!variant) 4113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 412fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 4133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(!(key->bitmap && key->drawpixels)); 414fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 415c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#if FEATURE_drawpix 4163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->bitmap) { 4173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glBitmap drawing */ 4185cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp; /* we free this temp program below */ 41983baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 4203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_bitmap_fragment_program(st, &stfp->Base, 421aa5ba96d294698809186cc4b59034abbd3076812Brian Paul &fp, &variant->bitmap_sampler); 422f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 423aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 42443125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 4253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else if (key->drawpixels) { 4273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glDrawPixels drawing */ 4285cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp; /* we free this temp program below */ 429e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 4303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->drawpixels_z || key->drawpixels_stencil) { 4313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z, 4323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul key->drawpixels_stencil); 433f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 434e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell else { 4353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* RGBA */ 4363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_drawpix_fragment_program(st, &stfp->Base, &fp); 437aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 438e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell } 43943125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 440f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 441c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#endif 442f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 4433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!stfp->tgsi.tokens) { 4443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* need to translate Mesa instructions to TGSI now */ 4453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint outputMapping[FRAG_RESULT_MAX]; 4463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint inputMapping[FRAG_ATTRIB_MAX]; 4473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ 4483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint attr; 4493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul enum pipe_error error; 4503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul const GLbitfield inputsRead = stfp->Base.Base.InputsRead; 4513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct ureg_program *ureg; 45207498075b5de14955958da44a90eb7ee203218a1Dave Airlie GLboolean write_all = GL_FALSE; 453635c4c41bdf111462939da292d65328595d314e8Brian 4543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 4553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 4563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul uint fs_num_inputs = 0; 4573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 4593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 4603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul uint fs_num_outputs = 0; 4613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT); 4643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* 4663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Convert Mesa program inputs to TGSI input register semantics. 4673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 4683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 4693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (inputsRead & (1 << attr)) { 4703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul const GLuint slot = fs_num_inputs++; 4713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping[attr] = slot; 473ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie 474635c4c41bdf111462939da292d65328595d314e8Brian switch (attr) { 4753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_WPOS: 4763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 4773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 4793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_COL0: 4813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 4823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 4843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_COL1: 4863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 4873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 1; 4883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 4893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_FOGC: 4913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 4923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 494635c4c41bdf111462939da292d65328595d314e8Brian break; 4953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_FACE: 4963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_FACE; 4973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 4993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 5003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* In most cases, there is nothing special about these 5013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * inputs, so adopt a convention to use the generic 5023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * semantic name and the mesa FRAG_ATTRIB_ number as the 5033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * index. 5043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * 5053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * All that is required is that the vertex shader labels 5063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * its own outputs similarly, and that the vertex shader 5073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * generates at least every output required by the 5083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * fragment shader plus fixed-function hardware (such as 5093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * BFC). 5103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * 5113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * There is no requirement that semantic indexes start at 5123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * zero or be restricted to a particular range -- nobody 5133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * should be building tables based on semantic index. 5143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 5153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_PNTC: 5163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX0: 5173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX1: 5183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX2: 5193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX3: 5203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX4: 5213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX5: 5223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX6: 5233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX7: 5243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_VAR0: 525af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca default: 5263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* Actually, let's try and zero-base this just for 5273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * readability of the generated TGSI. 5283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 5293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(attr >= FRAG_ATTRIB_TEX0); 5303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0); 5313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 5323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (attr == FRAG_ATTRIB_PNTC) 5333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 5343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else 5353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 536635c4c41bdf111462939da292d65328595d314e8Brian break; 537635c4c41bdf111462939da292d65328595d314e8Brian } 5383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 5403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping[attr] = -1; 5413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* 5453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Semantics and mapping for outputs 5463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 5473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 5483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul uint numColors = 0; 5493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten; 5503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* if z is written, emit that first */ 5523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { 5533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 5543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index[fs_num_outputs] = 0; 5553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 5563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_outputs++; 5573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 5583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 559c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 5603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) { 5613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL; 5623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index[fs_num_outputs] = 0; 5633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs; 564fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 5653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); 5663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* handle remaning outputs (color) */ 5693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 5703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (outputsWritten & BITFIELD64_BIT(attr)) { 5713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (attr) { 5723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_RESULT_DEPTH: 5733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_RESULT_STENCIL: 5743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* handled above */ 5753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(0); 5763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 57707498075b5de14955958da44a90eb7ee203218a1Dave Airlie case FRAG_RESULT_COLOR: 57807498075b5de14955958da44a90eb7ee203218a1Dave Airlie write_all = GL_TRUE; /* fallthrough */ 5793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 5803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(attr == FRAG_RESULT_COLOR || 5813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX)); 5823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 5833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index[fs_num_outputs] = numColors; 5843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping[attr] = fs_num_outputs; 5853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul numColors++; 5863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 5873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_outputs++; 5903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 591f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 592f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 593f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 5943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); 5953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (ureg == NULL) 5963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 597a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 5983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (ST_DEBUG & DEBUG_MESA) { 5993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_print_program(&stfp->Base.Base); 6003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_print_program_parameters(st->ctx, &stfp->Base.Base); 6013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul debug_printf("\n"); 6023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 60307498075b5de14955958da44a90eb7ee203218a1Dave Airlie if (write_all == GL_TRUE) 60407498075b5de14955958da44a90eb7ee203218a1Dave Airlie ureg_property_fs_color0_writes_all_cbufs(ureg, 1); 605a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 6063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul error = st_translate_mesa_program(st->ctx, 6073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul TGSI_PROCESSOR_FRAGMENT, 6083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg, 6093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul &stfp->Base.Base, 6103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* inputs */ 6113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_inputs, 6123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping, 6133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name, 6143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index, 6153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode, 6163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* outputs */ 6173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_outputs, 6183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping, 6193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name, 6203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index, FALSE ); 6213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 6233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg_destroy( ureg ); 6243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 626aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in variant */ 627aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi); 628aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->key = *key; 629f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 630b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 631b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 632b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 633b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 6343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6355cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul#if FEATURE_drawpix 6365cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul if (key->bitmap || key->drawpixels) { 6375cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul /* Free the temporary program made above */ 6385cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp = &stfp->Base; 6395cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul _mesa_reference_fragprog(st->ctx, &fp, NULL); 6405cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul } 6415cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul#endif 6425cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul 643aa5ba96d294698809186cc4b59034abbd3076812Brian Paul return variant; 644f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 645f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 6463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 6483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed. 6493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 650aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant * 651aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st, 6523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 653aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 6543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 655aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv; 6563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 657aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 658aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; fpv = fpv->next) { 6593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&fpv->key, key, sizeof(*key)) == 0) { 6603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 6613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!fpv) { 6653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 6663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = st_translate_fragment_program(st, stfp, key); 6673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv) { 6683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 669aa5ba96d294698809186cc4b59034abbd3076812Brian Paul fpv->next = stfp->variants; 670aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stfp->variants = fpv; 6713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return fpv; 6753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 6763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 679aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant. 6803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 681aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant * 682da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st, 6833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 684aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 685da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{ 686da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint inputMapping[GEOM_ATTRIB_MAX]; 687da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint outputMapping[GEOM_RESULT_MAX]; 688da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct pipe_context *pipe = st->pipe; 689da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin enum pipe_error error; 690da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint attr; 691da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLbitfield inputsRead = stgp->Base.Base.InputsRead; 692da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint vslot = 0; 693da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint num_generic = 0; 694da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 695da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_inputs = 0; 696da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_builtin_inputs = 0; 697da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_array_offset = 0; 698da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 699da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 700da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 701da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_outputs = 0; 702da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 703da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLint i; 704da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint maxSlot = 0; 705da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct ureg_program *ureg; 706da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 707aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 7083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 709aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv = CALLOC_STRUCT(st_gp_variant); 7103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) 7113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 7123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 71383baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT); 71483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING); 71583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 716da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY ); 717da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ureg == NULL) { 7183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(gpv); 7193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 720da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 721da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 722da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* which vertex output goes to the first geometry input */ 7237c42390453e611367cf1ba11446692ec04e0abfbZack Rusin vslot = 0; 724da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 725425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(inputMapping, 0, sizeof(inputMapping)); 726425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(outputMapping, 0, sizeof(outputMapping)); 727425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin 728da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 729da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Convert Mesa program inputs to TGSI input register semantics. 730da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 731da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) { 732da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (inputsRead & (1 << attr)) { 733da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLuint slot = gs_num_inputs; 734da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 735da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_inputs++; 736da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 737da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputMapping[attr] = slot; 738da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 739da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs; 740da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_to_index[attr] = vslot; 741da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->index_to_input[vslot] = attr; 742da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++vslot; 743da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 7447c42390453e611367cf1ba11446692ec04e0abfbZack Rusin if (attr != GEOM_ATTRIB_PRIMITIVE_ID) { 745da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_array_offset += 2; 746da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } else 747da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++gs_builtin_inputs; 748da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 7493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0 750da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("input map at %d = %d\n", 751da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]); 752da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 753da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 754da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 755da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_PRIMITIVE_ID: 756da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID; 757da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 758da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 759da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_POSITION: 760da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 761da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 762da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 763da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR0: 764da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 765da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 766da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 767da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR1: 768da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 769da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 1; 770da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 771da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_FOG_FRAG_COORD: 772da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 773da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 774da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 775da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_TEX_COORD: 776da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 777da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 778da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 779da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_VAR0: 780da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 781da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 782da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 783da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 784da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 785da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 786da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 787da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 788da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* initialize output semantics to defaults */ 789da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 790da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 791da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i] = 0; 792da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 793da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 794da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin num_generic = 0; 795da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 796da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Determine number of outputs, the (default) output register 797da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * mapping and the semantic information for each output. 798da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 799da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 800da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->Base.Base.OutputsWritten & (1 << attr)) { 801da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint slot; 802da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 803da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot = gs_num_outputs; 804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs++; 805da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputMapping[attr] = slot; 806da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 807da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_POS: 809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot == 0); 810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 812da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL0: 814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL1: 818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL0: 822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 824da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 825da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL1: 826da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 827da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 828da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 829da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_FOGC: 830da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 831da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 832da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 833da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_PSIZ: 834da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 835da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 836da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX0: 838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX1: 839da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX2: 840da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX3: 841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX4: 842da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX5: 843da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX6: 844da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX7: 845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 846da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_VAR0: 847da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 848da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot < Elements(gs_output_semantic_name)); 850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* use default semantic info */ 851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = num_generic++; 853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 854da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION); 858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* find max output slot referenced to compute gs_num_outputs */ 860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot) 862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin maxSlot = outputMapping[attr]; 863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs = maxSlot + 1; 865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 866da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */ 867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin { 868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint i; 869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("outputMapping? %d\n", outputMapping ? 1 : 0); 870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping) { 871da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("attr -> slot\n"); 872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < 16; i++) { 873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %3d\n", i, outputMapping[i]); 874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("slot sem_name sem_index\n"); 877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < gs_num_outputs; i++) { 878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %d %d\n", 879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin i, 880da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i], 881da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i]); 882da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 883da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 884da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 885da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 886da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* free old shader state, if any */ 887da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->tgsi.tokens) { 888da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin st_free_tokens(stgp->tgsi.tokens); 889da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = NULL; 890da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 891da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 892da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_input_prim(ureg, stgp->Base.InputType); 893da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_output_prim(ureg, stgp->Base.OutputType); 894da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut); 895da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 8963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul error = st_translate_mesa_program(st->ctx, 8973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul TGSI_PROCESSOR_GEOMETRY, 8983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg, 8993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul &stgp->Base.Base, 9003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* inputs */ 9013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_num_inputs, 9023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping, 9033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul stgp->input_semantic_name, 9043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul stgp->input_semantic_index, 9053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul NULL, 9063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* outputs */ 9073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_num_outputs, 9083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping, 9093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_output_semantic_name, 9103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_output_semantic_index, 9113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FALSE); 912da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 913da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->num_inputs = gs_num_inputs; 914da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 915da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_destroy( ureg ); 9163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 917aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in new variant */ 9183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi); 9193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->key = *key; 920da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 921da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { 922da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin _mesa_print_program(&stgp->Base.Base); 923da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 924da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 925da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 926da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ST_DEBUG & DEBUG_TGSI) { 927da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin tgsi_dump(stgp->tgsi.tokens, 0); 928da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 929da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 9303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 9323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 9333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 9363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant. 9373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 938aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant * 939aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st, 9403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 941aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 9423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 943aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 9443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 945aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 946aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; gpv = gpv->next) { 9473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&gpv->key, key, sizeof(*key)) == 0) { 9483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 9493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) { 9533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 9543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv = st_translate_geometry_program(st, stgp, key); 9553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (gpv) { 9563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 957aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv->next = stgp->variants; 958aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stgp->variants = gpv; 9593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 963da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin} 964678f80b347801d925c07a774faee1ed3f716de15Brian Paul 9653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 968678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 969678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 970678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 971678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 972f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx) 973678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 97484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader_program *shProg[3] = { 97584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentVertexProgram, 97684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentGeometryProgram, 97784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentFragmentProgram, 97884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick }; 97984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned j; 98084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 98184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (j = 0; j < 3; j++) { 98284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned i; 98384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 98484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (shProg[j] == NULL) 98584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick continue; 98684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 98784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (i = 0; i < shProg[j]->NumShaders; i++) { 98884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader *sh; 98984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 99084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick switch (shProg[j]->Shaders[i]->Type) { 99184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_VERTEX_SHADER: 99284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 0) ? NULL : shProg[j]->Shaders[i]; 99384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 99484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_GEOMETRY_SHADER_ARB: 99584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 1) ? NULL : shProg[j]->Shaders[i]; 99684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 99784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_FRAGMENT_SHADER: 99884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 2) ? NULL : shProg[j]->Shaders[i]; 99984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 1000a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee default: 1001a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee assert(0); 1002a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee sh = NULL; 1003a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee break; 100484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 100584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 100684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (sh != NULL) { 100784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders); 100884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("%s\n", sh->Source); 100984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 1010678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 1011678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 1012678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 10133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 10163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants. Free all the 10173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context. 10183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 10193d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 10203d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program) 10213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 10223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!program) 10233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return; 10243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (program->Target) { 10263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_PROGRAM_ARB: 10273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 10283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp = (struct st_vertex_program *) program; 1029aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv, **prevPtr = &stvp->variants; 10303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1031aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; ) { 1032aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *next = vpv->next; 10333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->key.st == st) { 10343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1035a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 10363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1037aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_vp_variant(st, vpv); 10383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1040a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &vpv->next; 10413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = next; 10433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 10463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_PROGRAM_ARB: 10473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 10483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp = 10493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul (struct st_fragment_program *) program; 1050aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv, **prevPtr = &stfp->variants; 10513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1052aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; ) { 1053aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *next = fpv->next; 10543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv->key.st == st) { 10553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1056a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 10573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1058aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_fp_variant(st, fpv); 10593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1061a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &fpv->next; 10623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = next; 10643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 1067c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul case MESA_GEOMETRY_PROGRAM: 1068c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul { 1069c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul struct st_geometry_program *stgp = 1070c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul (struct st_geometry_program *) program; 1071aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv, **prevPtr = &stgp->variants; 1072c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul 1073aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; ) { 1074aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *next = gpv->next; 1075c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul if (gpv->key.st == st) { 1076c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* unlink from list */ 1077a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 1078c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* destroy this variant */ 1079aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_gp_variant(st, gpv); 1080c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1081c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul else { 1082a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &gpv->next; 1083c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1084c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul gpv = next; 1085c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1086c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1087c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul break; 10883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 10893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_problem(NULL, "Unexpected program target in " 10903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul "destroy_program_variants_cb()"); 10913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 10933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 10963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the shader's program variants 10973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context. 10983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 10993d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 11003d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData) 11013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 11033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader *shader = (struct gl_shader *) data; 11043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (shader->Type) { 11063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_SHADER_PROGRAM_MESA: 11073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader_program *shProg = (struct gl_shader_program *) data; 11093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint i; 11103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (i = 0; i < shProg->NumShaders; i++) { 11123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shProg->Shaders[i]->Program); 11133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, (struct gl_program *) 11163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul shProg->VertexProgram); 11173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, (struct gl_program *) 11183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul shProg->FragmentProgram); 11193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, (struct gl_program *) 11203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul shProg->GeometryProgram); 11213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 11233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_SHADER: 11243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_SHADER: 11253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_GEOMETRY_SHADER: 11263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shader->Program); 11283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 11303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 11313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(0); 11323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 11343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 11373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the program variants which match 11383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context. 11393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 11403d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 11413d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData) 11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_program *program = (struct gl_program *) data; 11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, program); 11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 11473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 11503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which 11513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context. 11523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down. 11533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 11543d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 11553d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st) 11563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* ARB vert/frag program */ 11583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->Programs, 11593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants_cb, st); 11603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* GLSL vert/frag/geom shaders */ 11623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->ShaderObjects, 11633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_shader_program_variants_cb, st); 11643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1165