st_program.c revision edc09358f72cd48cb2315daf23c82e7646aeaea3
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); 11107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(fpv); 1133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 117aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a fragment program. 1183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1193d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 120aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp) 1213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 122aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv; 1233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 124aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; ) { 125aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *next = fpv->next; 126aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_fp_variant(st, fpv); 1273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = next; 1283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 1293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 130aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stfp->variants = NULL; 1313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 135aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a geometry program variant. Note the caller must unlink 136aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list. 1373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1383d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 139aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_gp_variant(struct st_context *st, struct st_gp_variant *gpv) 1403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 1413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (gpv->driver_shader) 1423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_delete_geometry_shader(st->cso_context, gpv->driver_shader); 14307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(gpv); 1453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 14607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 149aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a geometry program. 1503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1513d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 152aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp) 1533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 154aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 1553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 156aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; ) { 157aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *next = gpv->next; 158aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_gp_variant(st, gpv); 1593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv = next; 16007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 16107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 162aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stgp->variants = NULL; 16307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 16407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 16507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 16607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 169f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader. 170e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping to map vertex program output registers (VERT_RESULT_x) 171e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * to TGSI output slots 172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 1753d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 17607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st, 17707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp) 178f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 17907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell GLuint attr; 180c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs = 0; 18207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_outputs = 0; 183f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 184f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs if (stvp->Base.IsPositionInvariant) 185f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs _mesa_insert_mvp_code(st->ctx, &stvp->Base); 186f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs 187325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell assert(stvp->Base.Base.NumInstructions > 1); 188325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell 189f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 190f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of inputs, the mappings between VERT_ATTRIB_x 191f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * and TGSI generic input indexes, plus input attrib semantic info. 192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.InputsRead & (1 << attr)) { 19507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->input_to_index[attr] = stvp->num_inputs; 19607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->index_to_input[stvp->num_inputs] = attr; 19707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs++; 198f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 199f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 20050caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger /* bit of a hack, presetup potentially unused edgeflag input */ 20150caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs; 20250caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG; 203f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 20407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Compute mapping of vertex program outputs to slots. 205f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 206f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 207b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) { 20807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = ~0; 20907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 21007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell else { 21107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell unsigned slot = stvp->num_outputs++; 21207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 21307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = slot; 214f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 215f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 216f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 21707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 21807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 220f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 22107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 22207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 224f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 22507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 22607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 228f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 22907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 23007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 232f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 23307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 23407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 236f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 23707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 23807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 240f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 24107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 24207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 244f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 245f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 246f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 24707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX0: 249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX1: 250f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX2: 251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX3: 252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX4: 253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX5: 254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX6: 255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX7: 25607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 25707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0; 25807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 25907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 261f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 26207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr < VERT_RESULT_MAX); 26307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 26407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 - 26507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FRAG_ATTRIB_TEX0 + 26607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell attr - 26707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell VERT_RESULT_VAR0); 26807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 269f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 270f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 271f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 272890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger /* similar hack to above, presetup potentially unused edgeflag output */ 273890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs; 274890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG; 275890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_index[stvp->num_outputs] = 0; 27607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 277f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 278509d9eb686411254b24139012b7594e10a760b6cBrian Paul 2793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 280aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a vertex program to create a new variant. 2813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 282aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_vp_variant * 28307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st, 28407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp, 285aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 28607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 287aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant); 28807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct pipe_context *pipe = st->pipe; 289a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 290a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger enum pipe_error error; 291890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger unsigned num_outputs; 292a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 2933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_prepare_vertex_program( st, stvp ); 2943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 29583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT); 29683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING); 29783baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 298a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_VERTEX ); 299b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee if (ureg == NULL) { 300b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee FREE(vpv); 301a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 302b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee } 303a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 304c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák vpv->key = *key; 305c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák 30650caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger vpv->num_inputs = stvp->num_inputs; 307890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs = stvp->num_outputs; 308890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger if (key->passthrough_edgeflags) { 309890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger vpv->num_inputs++; 310890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs++; 311890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger } 312a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 313ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul if (ST_DEBUG & DEBUG_MESA) { 314ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program(&stvp->Base.Base); 315ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program_parameters(st->ctx, &stvp->Base.Base); 316ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul debug_printf("\n"); 317ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul } 318ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul 31983d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul error = st_translate_mesa_program(st->ctx, 32083d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul TGSI_PROCESSOR_VERTEX, 32183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul ureg, 32283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul &stvp->Base.Base, 32383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul /* inputs */ 32483d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul vpv->num_inputs, 32583d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->input_to_index, 32683d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul NULL, /* input semantic name */ 32783d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul NULL, /* input semantic index */ 32883d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul NULL, 32983d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul /* outputs */ 33083d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul num_outputs, 33183d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->result_to_output, 33283d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->output_semantic_name, 33383d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul stvp->output_semantic_index, 33483d50c3ee1309ee12bc4516d6c836a3c03fa9026Brian Paul key->passthrough_edgeflags ); 33525b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 336a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger if (error) 337a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell goto fail; 338a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 339b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 340b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul if (!vpv->tgsi.tokens) 3419d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger goto fail; 3429d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 343a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 34425b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 345b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi); 346f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 347b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 348b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( vpv->tgsi.tokens, 0 ); 349b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 350b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 35107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 35207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell return vpv; 353a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 354a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail: 3559d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__); 3569d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger _mesa_print_program(&stvp->Base.Base); 3579d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_assert(0); 3589d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 359a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 360a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 361f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 362f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 363f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 3643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 365aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant. 3663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 367aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant * 368aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st, 3693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp, 370aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 3713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 372aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv; 3733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 374aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 375aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; vpv = vpv->next) { 3763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&vpv->key, key, sizeof(*key)) == 0) { 3773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 3783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 3813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!vpv) { 3823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create now */ 3833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = st_translate_vertex_program(st, stvp, key); 3843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv) { 3853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 386aa5ba96d294698809186cc4b59034abbd3076812Brian Paul vpv->next = stvp->variants; 387aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stvp->variants = vpv; 3883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 3903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 3913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return vpv; 3923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 3933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 394f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 395f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 3963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in 3973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key. 3983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return new fragment program variant 399f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 400aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant * 401f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 4023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 403aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 404f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 405339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 406aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant); 407f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 408aa5ba96d294698809186cc4b59034abbd3076812Brian Paul if (!variant) 4093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 410fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 4113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(!(key->bitmap && key->drawpixels)); 412fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 413c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#if FEATURE_drawpix 4143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->bitmap) { 4153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glBitmap drawing */ 4163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_fragment_program *fp; 41783baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 4183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_bitmap_fragment_program(st, &stfp->Base, 419aa5ba96d294698809186cc4b59034abbd3076812Brian Paul &fp, &variant->bitmap_sampler); 420f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 421aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 42243125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 4233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else if (key->drawpixels) { 4253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glDrawPixels drawing */ 4263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_fragment_program *fp; 427e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 4283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->drawpixels_z || key->drawpixels_stencil) { 4293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z, 4303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul key->drawpixels_stencil); 431f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 432e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell else { 4333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* RGBA */ 4343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_drawpix_fragment_program(st, &stfp->Base, &fp); 435aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 436e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell } 43743125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 438f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 439c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#endif 440f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 4413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!stfp->tgsi.tokens) { 4423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* need to translate Mesa instructions to TGSI now */ 4433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint outputMapping[FRAG_RESULT_MAX]; 4443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint inputMapping[FRAG_ATTRIB_MAX]; 4453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ 4463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint attr; 4473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul enum pipe_error error; 4483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul const GLbitfield inputsRead = stfp->Base.Base.InputsRead; 4493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct ureg_program *ureg; 45007498075b5de14955958da44a90eb7ee203218a1Dave Airlie GLboolean write_all = GL_FALSE; 451635c4c41bdf111462939da292d65328595d314e8Brian 4523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 4533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 4543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul uint fs_num_inputs = 0; 4553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 4573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 4583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul uint fs_num_outputs = 0; 4593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT); 4623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* 4643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Convert Mesa program inputs to TGSI input register semantics. 4653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 4663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 4673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (inputsRead & (1 << attr)) { 4683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul const GLuint slot = fs_num_inputs++; 4693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping[attr] = slot; 471ef8bb7ada98f1ddc8e2554a7336af5d669cb1290Dave Airlie 472635c4c41bdf111462939da292d65328595d314e8Brian switch (attr) { 4733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_WPOS: 4743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 4753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 4773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_COL0: 4793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 4803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 4823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_COL1: 4843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 4853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 1; 4863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 4873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_FOGC: 4893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 4903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 492635c4c41bdf111462939da292d65328595d314e8Brian break; 4933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_FACE: 4943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_FACE; 4953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = 0; 4963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 4973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* In most cases, there is nothing special about these 4993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * inputs, so adopt a convention to use the generic 5003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * semantic name and the mesa FRAG_ATTRIB_ number as the 5013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * index. 5023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * 5033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * All that is required is that the vertex shader labels 5043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * its own outputs similarly, and that the vertex shader 5053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * generates at least every output required by the 5063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * fragment shader plus fixed-function hardware (such as 5073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * BFC). 5083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * 5093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * There is no requirement that semantic indexes start at 5103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * zero or be restricted to a particular range -- nobody 5113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * should be building tables based on semantic index. 5123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 5133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_PNTC: 5143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX0: 5153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX1: 5163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX2: 5173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX3: 5183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX4: 5193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX5: 5203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX6: 5213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_TEX7: 5223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_ATTRIB_VAR0: 523af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca default: 5243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* Actually, let's try and zero-base this just for 5253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * readability of the generated TGSI. 5263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 5273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(attr >= FRAG_ATTRIB_TEX0); 5283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0); 5293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 5303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (attr == FRAG_ATTRIB_PNTC) 5313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 5323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else 5333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 534635c4c41bdf111462939da292d65328595d314e8Brian break; 535635c4c41bdf111462939da292d65328595d314e8Brian } 5363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 5383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping[attr] = -1; 5393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* 5433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Semantics and mapping for outputs 5443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 5453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 5463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul uint numColors = 0; 5473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten; 5483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* if z is written, emit that first */ 5503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { 5513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 5523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index[fs_num_outputs] = 0; 5533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 5543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_outputs++; 5553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 5563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 557c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 5583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) { 5593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL; 5603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index[fs_num_outputs] = 0; 5613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs; 562fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 5633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); 5643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* handle remaning outputs (color) */ 5673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 5683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (outputsWritten & BITFIELD64_BIT(attr)) { 5693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (attr) { 5703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_RESULT_DEPTH: 5713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case FRAG_RESULT_STENCIL: 5723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* handled above */ 5733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(0); 5743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 57507498075b5de14955958da44a90eb7ee203218a1Dave Airlie case FRAG_RESULT_COLOR: 57607498075b5de14955958da44a90eb7ee203218a1Dave Airlie write_all = GL_TRUE; /* fallthrough */ 5773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 5783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(attr == FRAG_RESULT_COLOR || 5793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX)); 5803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 5813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index[fs_num_outputs] = numColors; 5823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping[attr] = fs_num_outputs; 5833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul numColors++; 5843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 5853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 5873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_outputs++; 5883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 589f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 590f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 591f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 5923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); 5933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (ureg == NULL) 5943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 595a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 5963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (ST_DEBUG & DEBUG_MESA) { 5973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_print_program(&stfp->Base.Base); 5983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_print_program_parameters(st->ctx, &stfp->Base.Base); 5993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul debug_printf("\n"); 6003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 60107498075b5de14955958da44a90eb7ee203218a1Dave Airlie if (write_all == GL_TRUE) 60207498075b5de14955958da44a90eb7ee203218a1Dave Airlie ureg_property_fs_color0_writes_all_cbufs(ureg, 1); 603a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 6043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul error = st_translate_mesa_program(st->ctx, 6053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul TGSI_PROCESSOR_FRAGMENT, 6063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg, 6073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul &stfp->Base.Base, 6083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* inputs */ 6093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_inputs, 6103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping, 6113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_name, 6123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul input_semantic_index, 6133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul interpMode, 6143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* outputs */ 6153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_num_outputs, 6163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping, 6173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_name, 6183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fs_output_semantic_index, FALSE ); 6193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 6213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg_destroy( ureg ); 6223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 624aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in variant */ 625aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi); 626aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->key = *key; 627f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 628b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 629b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 630b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 631b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 6323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 633aa5ba96d294698809186cc4b59034abbd3076812Brian Paul return variant; 634f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 635f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 6363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 6383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed. 6393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 640aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant * 641aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st, 6423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 643aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 6443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 645aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv; 6463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 647aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 648aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; fpv = fpv->next) { 6493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&fpv->key, key, sizeof(*key)) == 0) { 6503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 6513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!fpv) { 6553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 6563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = st_translate_fragment_program(st, stfp, key); 6573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv) { 6583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 659aa5ba96d294698809186cc4b59034abbd3076812Brian Paul fpv->next = stfp->variants; 660aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stfp->variants = fpv; 6613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 6633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return fpv; 6653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 6663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 6683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 669aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant. 6703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 671aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant * 672da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st, 6733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 674aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 675da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{ 676da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint inputMapping[GEOM_ATTRIB_MAX]; 677da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint outputMapping[GEOM_RESULT_MAX]; 678da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct pipe_context *pipe = st->pipe; 679da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin enum pipe_error error; 680da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint attr; 681da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLbitfield inputsRead = stgp->Base.Base.InputsRead; 682da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint vslot = 0; 683da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint num_generic = 0; 684da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 685da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_inputs = 0; 686da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_builtin_inputs = 0; 687da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_array_offset = 0; 688da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 689da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 690da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 691da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_outputs = 0; 692da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 693da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLint i; 694da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint maxSlot = 0; 695da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct ureg_program *ureg; 696da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 697aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 6983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 699aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv = CALLOC_STRUCT(st_gp_variant); 7003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) 7013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 7023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 70383baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT); 70483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING); 70583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 706da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY ); 707da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ureg == NULL) { 7083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(gpv); 7093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 710da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 711da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 712da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* which vertex output goes to the first geometry input */ 7137c42390453e611367cf1ba11446692ec04e0abfbZack Rusin vslot = 0; 714da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 715425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(inputMapping, 0, sizeof(inputMapping)); 716425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(outputMapping, 0, sizeof(outputMapping)); 717425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin 718da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 719da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Convert Mesa program inputs to TGSI input register semantics. 720da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 721da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) { 722da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (inputsRead & (1 << attr)) { 723da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLuint slot = gs_num_inputs; 724da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 725da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_inputs++; 726da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 727da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputMapping[attr] = slot; 728da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 729da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs; 730da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_to_index[attr] = vslot; 731da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->index_to_input[vslot] = attr; 732da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++vslot; 733da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 7347c42390453e611367cf1ba11446692ec04e0abfbZack Rusin if (attr != GEOM_ATTRIB_PRIMITIVE_ID) { 735da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_array_offset += 2; 736da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } else 737da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++gs_builtin_inputs; 738da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 7393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0 740da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("input map at %d = %d\n", 741da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]); 742da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 743da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 744da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 745da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_PRIMITIVE_ID: 746da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID; 747da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 748da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 749da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_POSITION: 750da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 751da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 752da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 753da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR0: 754da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 755da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 756da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 757da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR1: 758da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 759da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 1; 760da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 761da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_FOG_FRAG_COORD: 762da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 763da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 764da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 765da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_TEX_COORD: 766da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 767da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 768da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 769da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_VAR0: 770da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 771da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 772da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 773da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 774da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 775da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 776da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 777da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 778da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* initialize output semantics to defaults */ 779da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 780da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 781da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i] = 0; 782da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 783da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 784da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin num_generic = 0; 785da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 786da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Determine number of outputs, the (default) output register 787da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * mapping and the semantic information for each output. 788da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 789da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 790da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->Base.Base.OutputsWritten & (1 << attr)) { 791da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint slot; 792da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 793da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot = gs_num_outputs; 794da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs++; 795da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputMapping[attr] = slot; 796da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 797da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 798da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_POS: 799da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot == 0); 800da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 801da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 802da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 803da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL0: 804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 805da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 806da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 807da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL1: 808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL0: 812da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL1: 816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_FOGC: 820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_PSIZ: 824da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 825da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 826da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 827da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX0: 828da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX1: 829da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX2: 830da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX3: 831da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX4: 832da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX5: 833da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX6: 834da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX7: 835da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 836da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_VAR0: 837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 839da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot < Elements(gs_output_semantic_name)); 840da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* use default semantic info */ 841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 842da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = num_generic++; 843da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 844da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 846da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 847da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION); 848da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* find max output slot referenced to compute gs_num_outputs */ 850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot) 852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin maxSlot = outputMapping[attr]; 853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 854da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs = maxSlot + 1; 855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */ 857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin { 858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint i; 859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("outputMapping? %d\n", outputMapping ? 1 : 0); 860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping) { 861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("attr -> slot\n"); 862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < 16; i++) { 863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %3d\n", i, outputMapping[i]); 864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 866da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("slot sem_name sem_index\n"); 867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < gs_num_outputs; i++) { 868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %d %d\n", 869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin i, 870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i], 871da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i]); 872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* free old shader state, if any */ 877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->tgsi.tokens) { 878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin st_free_tokens(stgp->tgsi.tokens); 879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = NULL; 880da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 881da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 882da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_input_prim(ureg, stgp->Base.InputType); 883da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_output_prim(ureg, stgp->Base.OutputType); 884da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut); 885da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 8863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul error = st_translate_mesa_program(st->ctx, 8873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul TGSI_PROCESSOR_GEOMETRY, 8883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg, 8893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul &stgp->Base.Base, 8903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* inputs */ 8913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_num_inputs, 8923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul inputMapping, 8933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul stgp->input_semantic_name, 8943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul stgp->input_semantic_index, 8953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul NULL, 8963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* outputs */ 8973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_num_outputs, 8983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul outputMapping, 8993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_output_semantic_name, 9003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gs_output_semantic_index, 9013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FALSE); 902da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 903da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->num_inputs = gs_num_inputs; 904da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 905da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_destroy( ureg ); 9063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 907aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in new variant */ 9083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi); 9093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->key = *key; 910da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 911da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { 912da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin _mesa_print_program(&stgp->Base.Base); 913da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 914da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 915da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 916da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ST_DEBUG & DEBUG_TGSI) { 917da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin tgsi_dump(stgp->tgsi.tokens, 0); 918da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 919da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 9203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 9223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 9233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 9263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant. 9273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 928aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant * 929aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st, 9303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 931aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 9323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 933aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 9343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 935aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 936aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; gpv = gpv->next) { 9373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&gpv->key, key, sizeof(*key)) == 0) { 9383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 9393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) { 9433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 9443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv = st_translate_geometry_program(st, stgp, key); 9453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (gpv) { 9463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 947aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv->next = stgp->variants; 948aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stgp->variants = gpv; 9493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 953da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin} 954678f80b347801d925c07a774faee1ed3f716de15Brian Paul 9553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 9573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 958678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 959678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 960678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 961678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 962f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx) 963678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 96484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader_program *shProg[3] = { 96584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentVertexProgram, 96684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentGeometryProgram, 96784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentFragmentProgram, 96884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick }; 96984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned j; 97084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 97184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (j = 0; j < 3; j++) { 97284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned i; 97384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 97484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (shProg[j] == NULL) 97584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick continue; 97684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 97784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (i = 0; i < shProg[j]->NumShaders; i++) { 97884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader *sh; 97984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 98084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick switch (shProg[j]->Shaders[i]->Type) { 98184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_VERTEX_SHADER: 98284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 0) ? NULL : shProg[j]->Shaders[i]; 98384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 98484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_GEOMETRY_SHADER_ARB: 98584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 1) ? NULL : shProg[j]->Shaders[i]; 98684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 98784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_FRAGMENT_SHADER: 98884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 2) ? NULL : shProg[j]->Shaders[i]; 98984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 990a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee default: 991a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee assert(0); 992a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee sh = NULL; 993a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee break; 99484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 99584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 99684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (sh != NULL) { 99784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders); 99884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("%s\n", sh->Source); 99984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 1000678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 1001678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 1002678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 10033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 10063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants. Free all the 10073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context. 10083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 10093d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 10103d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program) 10113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 10123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!program) 10133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return; 10143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (program->Target) { 10163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_PROGRAM_ARB: 10173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 10183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp = (struct st_vertex_program *) program; 1019aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv, **prevPtr = &stvp->variants; 10203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1021aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; ) { 1022aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *next = vpv->next; 10233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->key.st == st) { 10243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1025a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 10263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1027aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_vp_variant(st, vpv); 10283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1030a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &vpv->next; 10313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = next; 10333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 10363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_PROGRAM_ARB: 10373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 10383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp = 10393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul (struct st_fragment_program *) program; 1040aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv, **prevPtr = &stfp->variants; 10413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1042aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; ) { 1043aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *next = fpv->next; 10443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv->key.st == st) { 10453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1046a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 10473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1048aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_fp_variant(st, fpv); 10493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1051a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &fpv->next; 10523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = next; 10543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 1057c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul case MESA_GEOMETRY_PROGRAM: 1058c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul { 1059c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul struct st_geometry_program *stgp = 1060c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul (struct st_geometry_program *) program; 1061aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv, **prevPtr = &stgp->variants; 1062c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul 1063aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; ) { 1064aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *next = gpv->next; 1065c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul if (gpv->key.st == st) { 1066c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* unlink from list */ 1067a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 1068c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* destroy this variant */ 1069aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_gp_variant(st, gpv); 1070c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1071c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul else { 1072a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &gpv->next; 1073c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1074c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul gpv = next; 1075c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1076c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1077c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul break; 10783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 10793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_problem(NULL, "Unexpected program target in " 10803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul "destroy_program_variants_cb()"); 10813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 10833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 10863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the shader's program variants 10873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context. 10883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 10893d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 10903d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData) 10913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 10923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 10933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader *shader = (struct gl_shader *) data; 10943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (shader->Type) { 10963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_SHADER_PROGRAM_MESA: 10973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 10983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader_program *shProg = (struct gl_shader_program *) data; 10993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint i; 11003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (i = 0; i < shProg->NumShaders; i++) { 11023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shProg->Shaders[i]->Program); 11033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, (struct gl_program *) 11063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul shProg->VertexProgram); 11073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, (struct gl_program *) 11083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul shProg->FragmentProgram); 11093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, (struct gl_program *) 11103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul shProg->GeometryProgram); 11113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 11133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_SHADER: 11143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_SHADER: 11153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_GEOMETRY_SHADER: 11163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shader->Program); 11183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 11203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 11213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(0); 11223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 11243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 11273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the program variants which match 11283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context. 11293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 11303d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 11313d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData) 11323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 11343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_program *program = (struct gl_program *) data; 11353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, program); 11363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 11373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 11403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which 11413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context. 11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down. 11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st) 11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* ARB vert/frag program */ 11483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->Programs, 11493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants_cb, st); 11503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* GLSL vert/frag/geom shaders */ 11523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->ShaderObjects, 11533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_shader_program_variants_cb, st); 11543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1155