st_program.c revision 72cb103cf518c86d8d094380d9f8e16650a0060b
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 */ 177f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainvoid 178f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainst_prepare_vertex_program(struct gl_context *ctx, 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) 187f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain _mesa_insert_mvp_code(ctx, &stvp->Base); 188f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs 18944867da3543ca54ef245695cef72a6e305451d93Bryan Cain if (!stvp->glsl_to_tgsi) 19044867da3543ca54ef245695cef72a6e305451d93Bryan Cain assert(stvp->Base.Base.NumInstructions > 1); 191325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell 192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of inputs, the mappings between VERT_ATTRIB_x 194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * and TGSI generic input indexes, plus input attrib semantic info. 195f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 196f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 197dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich if ((stvp->Base.Base.InputsRead & BITFIELD64_BIT(attr)) != 0) { 19807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->input_to_index[attr] = stvp->num_inputs; 19907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->index_to_input[stvp->num_inputs] = attr; 20007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs++; 201f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 202f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 20350caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger /* bit of a hack, presetup potentially unused edgeflag input */ 20450caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs; 20550caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG; 206f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 20707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Compute mapping of vertex program outputs to slots. 208f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 209f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 210b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) { 21107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = ~0; 21207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 21307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell else { 21407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell unsigned slot = stvp->num_outputs++; 21507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 21607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = slot; 217f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 218f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 22007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 22107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 222f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 22407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 22507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 226f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 22807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 22907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 230f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 23207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 23307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 234f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 23607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 23707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 238f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 24007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 24107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 242f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 24407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 24507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 246f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 25007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX0: 252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX1: 253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX2: 254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX3: 255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX4: 256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX5: 257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX6: 258f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX7: 25907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 26007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0; 26107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 26207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 263f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 264f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 26507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr < VERT_RESULT_MAX); 26607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 26707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 - 26807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FRAG_ATTRIB_TEX0 + 26907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell attr - 27007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell VERT_RESULT_VAR0); 27107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 272f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 273f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 274f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 275890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger /* similar hack to above, presetup potentially unused edgeflag output */ 276890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs; 277890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG; 278890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_index[stvp->num_outputs] = 0; 27907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 280f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 281509d9eb686411254b24139012b7594e10a760b6cBrian Paul 2823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 283aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a vertex program to create a new variant. 2843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 285aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_vp_variant * 28607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st, 28707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp, 288aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 28907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 290aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant); 29107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct pipe_context *pipe = st->pipe; 292a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 293a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger enum pipe_error error; 294890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger unsigned num_outputs; 295a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 296f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain st_prepare_vertex_program(st->ctx, stvp); 2973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 29844867da3543ca54ef245695cef72a6e305451d93Bryan Cain if (!stvp->glsl_to_tgsi) 29944867da3543ca54ef245695cef72a6e305451d93Bryan Cain { 30044867da3543ca54ef245695cef72a6e305451d93Bryan Cain _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT); 30144867da3543ca54ef245695cef72a6e305451d93Bryan Cain _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING); 30244867da3543ca54ef245695cef72a6e305451d93Bryan Cain } 30383baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 304a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_VERTEX ); 305b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee if (ureg == NULL) { 306b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee FREE(vpv); 307a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 308b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee } 309a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 310c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák vpv->key = *key; 311c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák 31250caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger vpv->num_inputs = stvp->num_inputs; 313890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs = stvp->num_outputs; 314890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger if (key->passthrough_edgeflags) { 315890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger vpv->num_inputs++; 316890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs++; 317890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger } 318a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 319ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul if (ST_DEBUG & DEBUG_MESA) { 320ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program(&stvp->Base.Base); 321ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program_parameters(st->ctx, &stvp->Base.Base); 322ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul debug_printf("\n"); 323ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul } 324ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul 325f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain if (stvp->glsl_to_tgsi) 326f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain error = st_translate_program(st->ctx, 327f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain TGSI_PROCESSOR_VERTEX, 328f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain ureg, 329f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->glsl_to_tgsi, 330f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain &stvp->Base.Base, 331f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* inputs */ 332f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->num_inputs, 333f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->input_to_index, 334f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* input semantic name */ 335f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* input semantic index */ 336f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* interp mode */ 337f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* outputs */ 338f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->num_outputs, 339f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->result_to_output, 340f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_name, 341f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_index, 342f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain key->passthrough_edgeflags ); 343f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain else 344f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain error = st_translate_mesa_program(st->ctx, 345f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain TGSI_PROCESSOR_VERTEX, 346f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain ureg, 347f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain &stvp->Base.Base, 348f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* inputs */ 349f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain vpv->num_inputs, 350f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->input_to_index, 351f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* input semantic name */ 352f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* input semantic index */ 353f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, 354f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* outputs */ 355f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain num_outputs, 356f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->result_to_output, 357f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_name, 358f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_index, 359f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain key->passthrough_edgeflags ); 36025b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 361a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger if (error) 362a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell goto fail; 363a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 364b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 365b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul if (!vpv->tgsi.tokens) 3669d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger goto fail; 3679d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 368a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 36925b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 370b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi); 371f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 372b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 373b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( vpv->tgsi.tokens, 0 ); 374b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 375b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 37607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 37707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell return vpv; 378a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 379a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail: 3809d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__); 3819d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger _mesa_print_program(&stvp->Base.Base); 3829d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_assert(0); 3839d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 384a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 385a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 386f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 387f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 388f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 3893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 390aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant. 3913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 392aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant * 393aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st, 3943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp, 395aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 3963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 397aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv; 3983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 399aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 400aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; vpv = vpv->next) { 4013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&vpv->key, key, sizeof(*key)) == 0) { 4023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!vpv) { 4073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create now */ 4083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = st_translate_vertex_program(st, stvp, key); 4093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv) { 4103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 411aa5ba96d294698809186cc4b59034abbd3076812Brian Paul vpv->next = stvp->variants; 412aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stvp->variants = vpv; 4133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return vpv; 4173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 4183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 419af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul 420af734468fee1e1fc0714557ddd199e2f91940afcBrian Paulstatic unsigned 421af734468fee1e1fc0714557ddd199e2f91940afcBrian Paulst_translate_interp(enum glsl_interp_qualifier glsl_qual) 4224dfee0011acb31f88889f298e4a355489889a542Dave Airlie{ 4234dfee0011acb31f88889f298e4a355489889a542Dave Airlie switch (glsl_qual) { 4244dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_NONE: 4254dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_SMOOTH: 4264dfee0011acb31f88889f298e4a355489889a542Dave Airlie return TGSI_INTERPOLATE_PERSPECTIVE; 4274dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_FLAT: 4284dfee0011acb31f88889f298e4a355489889a542Dave Airlie return TGSI_INTERPOLATE_CONSTANT; 4294dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_NOPERSPECTIVE: 4304dfee0011acb31f88889f298e4a355489889a542Dave Airlie return TGSI_INTERPOLATE_LINEAR; 431af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul default: 432af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul assert(0 && "unexpected interp mode in st_translate_interp()"); 433af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul return TGSI_INTERPOLATE_PERSPECTIVE; 4344dfee0011acb31f88889f298e4a355489889a542Dave Airlie } 4354dfee0011acb31f88889f298e4a355489889a542Dave Airlie} 436f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 437af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul 438f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 4393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in 4403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key. 4413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return new fragment program variant 442f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 443aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant * 444f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 4453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 446aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 447f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 448339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 449aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant); 4507230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul GLboolean deleteFP = GL_FALSE; 451f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 452aa5ba96d294698809186cc4b59034abbd3076812Brian Paul if (!variant) 4533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 454fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 4553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(!(key->bitmap && key->drawpixels)); 456fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 457c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#if FEATURE_drawpix 4583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->bitmap) { 4593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glBitmap drawing */ 4605cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp; /* we free this temp program below */ 46183baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 4623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_bitmap_fragment_program(st, &stfp->Base, 463aa5ba96d294698809186cc4b59034abbd3076812Brian Paul &fp, &variant->bitmap_sampler); 464f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 465aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 46643125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 4677230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul deleteFP = GL_TRUE; 4683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else if (key->drawpixels) { 4703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glDrawPixels drawing */ 4715cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp; /* we free this temp program below */ 472e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 4733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->drawpixels_z || key->drawpixels_stencil) { 4743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z, 4753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul key->drawpixels_stencil); 476f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 477e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell else { 4783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* RGBA */ 4793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_drawpix_fragment_program(st, &stfp->Base, &fp); 480aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 4817230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul deleteFP = GL_TRUE; 482e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell } 48343125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 484f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 485c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#endif 486f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 4873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!stfp->tgsi.tokens) { 4883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* need to translate Mesa instructions to TGSI now */ 489ffb7d02154186402f64e0b628998485309774bb8Bryan Cain GLuint outputMapping[FRAG_RESULT_MAX]; 490ffb7d02154186402f64e0b628998485309774bb8Bryan Cain GLuint inputMapping[FRAG_ATTRIB_MAX]; 491ffb7d02154186402f64e0b628998485309774bb8Bryan Cain GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ 492ffb7d02154186402f64e0b628998485309774bb8Bryan Cain GLuint attr; 493dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich const GLbitfield64 inputsRead = stfp->Base.Base.InputsRead; 4943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct ureg_program *ureg; 495ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 496ffb7d02154186402f64e0b628998485309774bb8Bryan Cain GLboolean write_all = GL_FALSE; 497ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 498ffb7d02154186402f64e0b628998485309774bb8Bryan Cain ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 499ffb7d02154186402f64e0b628998485309774bb8Bryan Cain ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 500ffb7d02154186402f64e0b628998485309774bb8Bryan Cain uint fs_num_inputs = 0; 501ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 502ffb7d02154186402f64e0b628998485309774bb8Bryan Cain ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 503ffb7d02154186402f64e0b628998485309774bb8Bryan Cain ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 504ffb7d02154186402f64e0b628998485309774bb8Bryan Cain uint fs_num_outputs = 0; 505f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain 50644867da3543ca54ef245695cef72a6e305451d93Bryan Cain if (!stfp->glsl_to_tgsi) 50744867da3543ca54ef245695cef72a6e305451d93Bryan Cain _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT); 508f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 509ffb7d02154186402f64e0b628998485309774bb8Bryan Cain /* 510ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * Convert Mesa program inputs to TGSI input register semantics. 511ffb7d02154186402f64e0b628998485309774bb8Bryan Cain */ 512ffb7d02154186402f64e0b628998485309774bb8Bryan Cain for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 513dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich if ((inputsRead & BITFIELD64_BIT(attr)) != 0) { 514ffb7d02154186402f64e0b628998485309774bb8Bryan Cain const GLuint slot = fs_num_inputs++; 515ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 516ffb7d02154186402f64e0b628998485309774bb8Bryan Cain inputMapping[attr] = slot; 517ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 518ffb7d02154186402f64e0b628998485309774bb8Bryan Cain switch (attr) { 519ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_WPOS: 520ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 521ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_index[slot] = 0; 522ffb7d02154186402f64e0b628998485309774bb8Bryan Cain interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 523ffb7d02154186402f64e0b628998485309774bb8Bryan Cain break; 524ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_COL0: 525ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 526ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_index[slot] = 0; 527ffb7d02154186402f64e0b628998485309774bb8Bryan Cain interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 528ffb7d02154186402f64e0b628998485309774bb8Bryan Cain break; 529ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_COL1: 530ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 531ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_index[slot] = 1; 532ffb7d02154186402f64e0b628998485309774bb8Bryan Cain interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 533ffb7d02154186402f64e0b628998485309774bb8Bryan Cain break; 534ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_FOGC: 535ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 536ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_index[slot] = 0; 537ffb7d02154186402f64e0b628998485309774bb8Bryan Cain interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 538ffb7d02154186402f64e0b628998485309774bb8Bryan Cain break; 539ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_FACE: 540ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_name[slot] = TGSI_SEMANTIC_FACE; 541ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_index[slot] = 0; 542ffb7d02154186402f64e0b628998485309774bb8Bryan Cain interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 543ffb7d02154186402f64e0b628998485309774bb8Bryan Cain break; 544ffb7d02154186402f64e0b628998485309774bb8Bryan Cain /* In most cases, there is nothing special about these 545ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * inputs, so adopt a convention to use the generic 546ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * semantic name and the mesa FRAG_ATTRIB_ number as the 547ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * index. 548ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * 549ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * All that is required is that the vertex shader labels 550ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * its own outputs similarly, and that the vertex shader 551ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * generates at least every output required by the 552ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * fragment shader plus fixed-function hardware (such as 553ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * BFC). 554ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * 555ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * There is no requirement that semantic indexes start at 556ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * zero or be restricted to a particular range -- nobody 557ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * should be building tables based on semantic index. 558ffb7d02154186402f64e0b628998485309774bb8Bryan Cain */ 559ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_PNTC: 560ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_TEX0: 561ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_TEX1: 562ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_TEX2: 563ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_TEX3: 564ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_TEX4: 565ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_TEX5: 566ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_TEX6: 567ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_TEX7: 568ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_ATTRIB_VAR0: 569ffb7d02154186402f64e0b628998485309774bb8Bryan Cain default: 570ffb7d02154186402f64e0b628998485309774bb8Bryan Cain /* Actually, let's try and zero-base this just for 571ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * readability of the generated TGSI. 572ffb7d02154186402f64e0b628998485309774bb8Bryan Cain */ 573ffb7d02154186402f64e0b628998485309774bb8Bryan Cain assert(attr >= FRAG_ATTRIB_TEX0); 574ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0); 575ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 576ffb7d02154186402f64e0b628998485309774bb8Bryan Cain if (attr == FRAG_ATTRIB_PNTC) 577ffb7d02154186402f64e0b628998485309774bb8Bryan Cain interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 578ffb7d02154186402f64e0b628998485309774bb8Bryan Cain else 5794dfee0011acb31f88889f298e4a355489889a542Dave Airlie interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr]); 580ffb7d02154186402f64e0b628998485309774bb8Bryan Cain break; 581ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 582ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 583ffb7d02154186402f64e0b628998485309774bb8Bryan Cain else { 584ffb7d02154186402f64e0b628998485309774bb8Bryan Cain inputMapping[attr] = -1; 585ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 586ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 587ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 588ffb7d02154186402f64e0b628998485309774bb8Bryan Cain /* 589ffb7d02154186402f64e0b628998485309774bb8Bryan Cain * Semantics and mapping for outputs 590ffb7d02154186402f64e0b628998485309774bb8Bryan Cain */ 591ffb7d02154186402f64e0b628998485309774bb8Bryan Cain { 592ffb7d02154186402f64e0b628998485309774bb8Bryan Cain uint numColors = 0; 593ffb7d02154186402f64e0b628998485309774bb8Bryan Cain GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten; 594ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 595ffb7d02154186402f64e0b628998485309774bb8Bryan Cain /* if z is written, emit that first */ 596ffb7d02154186402f64e0b628998485309774bb8Bryan Cain if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { 597ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 598ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_output_semantic_index[fs_num_outputs] = 0; 599ffb7d02154186402f64e0b628998485309774bb8Bryan Cain outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 600ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_num_outputs++; 601ffb7d02154186402f64e0b628998485309774bb8Bryan Cain outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 602ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 603ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 604ffb7d02154186402f64e0b628998485309774bb8Bryan Cain if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) { 605ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL; 606ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_output_semantic_index[fs_num_outputs] = 0; 607ffb7d02154186402f64e0b628998485309774bb8Bryan Cain outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs; 608ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_num_outputs++; 609ffb7d02154186402f64e0b628998485309774bb8Bryan Cain outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); 610ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 611ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 612ffb7d02154186402f64e0b628998485309774bb8Bryan Cain /* handle remaning outputs (color) */ 613ffb7d02154186402f64e0b628998485309774bb8Bryan Cain for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 614ffb7d02154186402f64e0b628998485309774bb8Bryan Cain if (outputsWritten & BITFIELD64_BIT(attr)) { 615ffb7d02154186402f64e0b628998485309774bb8Bryan Cain switch (attr) { 616ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_RESULT_DEPTH: 617ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_RESULT_STENCIL: 618ffb7d02154186402f64e0b628998485309774bb8Bryan Cain /* handled above */ 619ffb7d02154186402f64e0b628998485309774bb8Bryan Cain assert(0); 620ffb7d02154186402f64e0b628998485309774bb8Bryan Cain break; 621ffb7d02154186402f64e0b628998485309774bb8Bryan Cain case FRAG_RESULT_COLOR: 622ffb7d02154186402f64e0b628998485309774bb8Bryan Cain write_all = GL_TRUE; /* fallthrough */ 623ffb7d02154186402f64e0b628998485309774bb8Bryan Cain default: 624ffb7d02154186402f64e0b628998485309774bb8Bryan Cain assert(attr == FRAG_RESULT_COLOR || 625ffb7d02154186402f64e0b628998485309774bb8Bryan Cain (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX)); 626ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 627ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_output_semantic_index[fs_num_outputs] = numColors; 628ffb7d02154186402f64e0b628998485309774bb8Bryan Cain outputMapping[attr] = fs_num_outputs; 629ffb7d02154186402f64e0b628998485309774bb8Bryan Cain numColors++; 630ffb7d02154186402f64e0b628998485309774bb8Bryan Cain break; 631ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 632ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 633ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_num_outputs++; 634ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 635ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 636ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 637ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 6383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); 6393210cad3f26a7e8a73f2dc2f7f3740e594b068bdVinson Lee if (ureg == NULL) { 6403210cad3f26a7e8a73f2dc2f7f3740e594b068bdVinson Lee FREE(variant); 6413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 6423210cad3f26a7e8a73f2dc2f7f3740e594b068bdVinson Lee } 643a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 6443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (ST_DEBUG & DEBUG_MESA) { 6453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_print_program(&stfp->Base.Base); 6463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_print_program_parameters(st->ctx, &stfp->Base.Base); 6473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul debug_printf("\n"); 6483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 64907498075b5de14955958da44a90eb7ee203218a1Dave Airlie if (write_all == GL_TRUE) 65007498075b5de14955958da44a90eb7ee203218a1Dave Airlie ureg_property_fs_color0_writes_all_cbufs(ureg, 1); 651a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 65272cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) { 65372cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie switch (stfp->Base.FragDepthLayout) { 65472cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie case FRAG_DEPTH_LAYOUT_ANY: 65572cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY); 65672cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie break; 65772cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie case FRAG_DEPTH_LAYOUT_GREATER: 65872cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER); 65972cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie break; 66072cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie case FRAG_DEPTH_LAYOUT_LESS: 66172cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS); 66272cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie break; 66372cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie case FRAG_DEPTH_LAYOUT_UNCHANGED: 66472cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED); 66572cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie break; 66672cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie default: 66772cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie assert(0); 66872cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie } 66972cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie } 67072cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie 671f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain if (stfp->glsl_to_tgsi) 6724683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain st_translate_program(st->ctx, 6734683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain TGSI_PROCESSOR_FRAGMENT, 6744683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain ureg, 6754683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain stfp->glsl_to_tgsi, 6764683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain &stfp->Base.Base, 6774683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain /* inputs */ 678ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_num_inputs, 679ffb7d02154186402f64e0b628998485309774bb8Bryan Cain inputMapping, 680ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_name, 681ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_index, 682ffb7d02154186402f64e0b628998485309774bb8Bryan Cain interpMode, 6834683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain /* outputs */ 684ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_num_outputs, 685ffb7d02154186402f64e0b628998485309774bb8Bryan Cain outputMapping, 686ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_output_semantic_name, 687ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_output_semantic_index, FALSE ); 688f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain else 6894683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain st_translate_mesa_program(st->ctx, 6904683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain TGSI_PROCESSOR_FRAGMENT, 6914683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain ureg, 6924683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain &stfp->Base.Base, 6934683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain /* inputs */ 694ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_num_inputs, 695ffb7d02154186402f64e0b628998485309774bb8Bryan Cain inputMapping, 696ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_name, 697ffb7d02154186402f64e0b628998485309774bb8Bryan Cain input_semantic_index, 698ffb7d02154186402f64e0b628998485309774bb8Bryan Cain interpMode, 6994683529048ee133481b2d8f1cae1685aa1736f9aBryan Cain /* outputs */ 700ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_num_outputs, 701ffb7d02154186402f64e0b628998485309774bb8Bryan Cain outputMapping, 702ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_output_semantic_name, 703ffb7d02154186402f64e0b628998485309774bb8Bryan Cain fs_output_semantic_index, FALSE ); 7043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 7063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul ureg_destroy( ureg ); 7073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 709aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in variant */ 710aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi); 711aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->key = *key; 712f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 713b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 714b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 715b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 716b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 7173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7187230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul if (deleteFP) { 7195cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul /* Free the temporary program made above */ 7205cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp = &stfp->Base; 7215cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul _mesa_reference_fragprog(st->ctx, &fp, NULL); 7225cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul } 7235cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul 724aa5ba96d294698809186cc4b59034abbd3076812Brian Paul return variant; 725f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 726f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 7273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 7293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed. 7303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 731aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant * 732aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st, 7333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 734aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 7353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 736aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv; 7373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 738aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 739aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; fpv = fpv->next) { 7403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&fpv->key, key, sizeof(*key)) == 0) { 7413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 7423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!fpv) { 7463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 7473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = st_translate_fragment_program(st, stfp, key); 7483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv) { 7493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 750aa5ba96d294698809186cc4b59034abbd3076812Brian Paul fpv->next = stfp->variants; 751aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stfp->variants = fpv; 7523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return fpv; 7563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 7573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 760aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant. 7613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 762aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant * 763da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st, 7643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 765aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 766da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{ 767da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint inputMapping[GEOM_ATTRIB_MAX]; 768da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint outputMapping[GEOM_RESULT_MAX]; 769da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct pipe_context *pipe = st->pipe; 770da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint attr; 771dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich const GLbitfield64 inputsRead = stgp->Base.Base.InputsRead; 772da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint vslot = 0; 773da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint num_generic = 0; 774da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 775da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_inputs = 0; 776da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_builtin_inputs = 0; 777da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_array_offset = 0; 778da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 779da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 780da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 781da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_outputs = 0; 782da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 783da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLint i; 784da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint maxSlot = 0; 785da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct ureg_program *ureg; 786da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 787aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 7883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 789aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv = CALLOC_STRUCT(st_gp_variant); 7903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) 7913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 7923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 79383baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT); 79483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING); 79583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 796da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY ); 797da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ureg == NULL) { 7983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(gpv); 7993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 800da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 801da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 802da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* which vertex output goes to the first geometry input */ 8037c42390453e611367cf1ba11446692ec04e0abfbZack Rusin vslot = 0; 804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 805425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(inputMapping, 0, sizeof(inputMapping)); 806425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(outputMapping, 0, sizeof(outputMapping)); 807425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin 808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Convert Mesa program inputs to TGSI input register semantics. 810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) { 812dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich if ((inputsRead & BITFIELD64_BIT(attr)) != 0) { 813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLuint slot = gs_num_inputs; 814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_inputs++; 816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputMapping[attr] = slot; 818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs; 820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_to_index[attr] = vslot; 821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->index_to_input[vslot] = attr; 822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++vslot; 823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 8247c42390453e611367cf1ba11446692ec04e0abfbZack Rusin if (attr != GEOM_ATTRIB_PRIMITIVE_ID) { 825da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_array_offset += 2; 826da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } else 827da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++gs_builtin_inputs; 828da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 8293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0 830da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("input map at %d = %d\n", 831da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]); 832da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 833da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 834da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 835da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_PRIMITIVE_ID: 836da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID; 837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 839da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_POSITION: 840da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 842da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 843da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR0: 844da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 846da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 847da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR1: 848da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 1; 850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_FOG_FRAG_COORD: 852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 854da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_TEX_COORD: 856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_VAR0: 860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 866da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* initialize output semantics to defaults */ 869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 871da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i] = 0; 872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin num_generic = 0; 875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Determine number of outputs, the (default) output register 877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * mapping and the semantic information for each output. 878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 880aa878f94ab77fe3be352d820aaa950b32836c814Brian Paul if (stgp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) { 881da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint slot; 882da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 883da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot = gs_num_outputs; 884da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs++; 885da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputMapping[attr] = slot; 886da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 887da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 888da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_POS: 889da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot == 0); 890da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 891da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 892da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 893da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL0: 894da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 895da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 896da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 897da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL1: 898da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 899da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 900da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 901da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL0: 902da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 903da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 904da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 905da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL1: 906da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 907da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 908da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 909da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_FOGC: 910da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 911da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 912da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 913da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_PSIZ: 914da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 915da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 916da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 917da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX0: 918da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX1: 919da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX2: 920da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX3: 921da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX4: 922da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX5: 923da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX6: 924da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX7: 925da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 926da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_VAR0: 927da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 928da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 929da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot < Elements(gs_output_semantic_name)); 930da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* use default semantic info */ 931da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 932da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = num_generic++; 933da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 934da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 935da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 936da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 937da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION); 938da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 939da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* find max output slot referenced to compute gs_num_outputs */ 940da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 941da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot) 942da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin maxSlot = outputMapping[attr]; 943da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 944da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs = maxSlot + 1; 945da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 946da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */ 947da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin { 948da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint i; 949da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("outputMapping? %d\n", outputMapping ? 1 : 0); 950da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping) { 951da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("attr -> slot\n"); 952da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < 16; i++) { 953da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %3d\n", i, outputMapping[i]); 954da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 955da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 956da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("slot sem_name sem_index\n"); 957da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < gs_num_outputs; i++) { 958da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %d %d\n", 959da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin i, 960da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i], 961da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i]); 962da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 963da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 964da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 965da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 966da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* free old shader state, if any */ 967da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->tgsi.tokens) { 968da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin st_free_tokens(stgp->tgsi.tokens); 969da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = NULL; 970da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 971da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 972da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_input_prim(ureg, stgp->Base.InputType); 973da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_output_prim(ureg, stgp->Base.OutputType); 974da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut); 975da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 9762f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák st_translate_mesa_program(st->ctx, 9772f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák TGSI_PROCESSOR_GEOMETRY, 9782f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák ureg, 9792f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák &stgp->Base.Base, 9802f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák /* inputs */ 9812f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_num_inputs, 9822f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák inputMapping, 9832f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák stgp->input_semantic_name, 9842f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák stgp->input_semantic_index, 9852f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák NULL, 9862f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák /* outputs */ 9872f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_num_outputs, 9882f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák outputMapping, 9892f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_output_semantic_name, 9902f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_output_semantic_index, 9912f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák FALSE); 992da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 993da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->num_inputs = gs_num_inputs; 994da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 995da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_destroy( ureg ); 9963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 997aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in new variant */ 9983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi); 9993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->key = *key; 1000da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1001da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { 1002da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin _mesa_print_program(&stgp->Base.Base); 1003da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 1004da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1005da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1006da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ST_DEBUG & DEBUG_TGSI) { 1007da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin tgsi_dump(stgp->tgsi.tokens, 0); 1008da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 1009da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 10103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 10123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 10133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 10163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant. 10173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1018aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant * 1019aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st, 10203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 1021aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 10223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 1023aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 10243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1025aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 1026aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; gpv = gpv->next) { 10273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&gpv->key, key, sizeof(*key)) == 0) { 10283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 10293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) { 10333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 10343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv = st_translate_geometry_program(st, stgp, key); 10353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (gpv) { 10363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 1037aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv->next = stgp->variants; 1038aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stgp->variants = gpv; 10393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 1043da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin} 1044678f80b347801d925c07a774faee1ed3f716de15Brian Paul 10453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1048678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 1049678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 1050678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 1051678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 1052f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx) 1053678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 105484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader_program *shProg[3] = { 105584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentVertexProgram, 105684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentGeometryProgram, 105784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentFragmentProgram, 105884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick }; 105984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned j; 106084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 106184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (j = 0; j < 3; j++) { 106284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned i; 106384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 106484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (shProg[j] == NULL) 106584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick continue; 106684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 106784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (i = 0; i < shProg[j]->NumShaders; i++) { 106884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader *sh; 106984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 107084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick switch (shProg[j]->Shaders[i]->Type) { 107184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_VERTEX_SHADER: 107284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 0) ? NULL : shProg[j]->Shaders[i]; 107384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 107484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_GEOMETRY_SHADER_ARB: 107584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 1) ? NULL : shProg[j]->Shaders[i]; 107684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 107784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_FRAGMENT_SHADER: 107884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 2) ? NULL : shProg[j]->Shaders[i]; 107984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 1080a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee default: 1081a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee assert(0); 1082a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee sh = NULL; 1083a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee break; 108484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 108584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 108684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (sh != NULL) { 108784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders); 108884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("%s\n", sh->Source); 108984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 1090678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 1091678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 1092678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 10933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 10963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants. Free all the 10973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context. 10983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 10993d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 11003d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program) 11013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!program) 11033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return; 11043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (program->Target) { 11063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_PROGRAM_ARB: 11073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp = (struct st_vertex_program *) program; 1109aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv, **prevPtr = &stvp->variants; 11103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1111aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; ) { 1112aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *next = vpv->next; 11133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->key.st == st) { 11143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1115a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 11163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1117aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_vp_variant(st, vpv); 11183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1120a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &vpv->next; 11213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = next; 11233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 11263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_PROGRAM_ARB: 11273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp = 11293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul (struct st_fragment_program *) program; 1130aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv, **prevPtr = &stfp->variants; 11313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1132aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; ) { 1133aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *next = fpv->next; 11343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv->key.st == st) { 11353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1136a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 11373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1138aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_fp_variant(st, fpv); 11393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1141a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &fpv->next; 11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = next; 11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 1147c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul case MESA_GEOMETRY_PROGRAM: 1148c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul { 1149c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul struct st_geometry_program *stgp = 1150c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul (struct st_geometry_program *) program; 1151aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv, **prevPtr = &stgp->variants; 1152c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul 1153aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; ) { 1154aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *next = gpv->next; 1155c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul if (gpv->key.st == st) { 1156c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* unlink from list */ 1157a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 1158c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* destroy this variant */ 1159aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_gp_variant(st, gpv); 1160c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1161c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul else { 1162a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &gpv->next; 1163c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1164c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul gpv = next; 1165c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1166c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1167c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul break; 11683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 1169e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul _mesa_problem(NULL, "Unexpected program target 0x%x in " 1170e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul "destroy_program_variants_cb()", program->Target); 11713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 11733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 11763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the shader's program variants 11773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context. 11783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 11793d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 11803d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData) 11813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 11833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader *shader = (struct gl_shader *) data; 11843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (shader->Type) { 11863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_SHADER_PROGRAM_MESA: 11873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader_program *shProg = (struct gl_shader_program *) data; 11893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint i; 11903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (i = 0; i < shProg->NumShaders; i++) { 11923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shProg->Shaders[i]->Program); 11933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 119577d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick for (i = 0; i < Elements(shProg->_LinkedShaders); i++) { 1196ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin if (shProg->_LinkedShaders[i]) 1197ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin destroy_program_variants(st, shProg->_LinkedShaders[i]->Program); 119877d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick } 11993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 12013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_SHADER: 12023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_SHADER: 12033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_GEOMETRY_SHADER: 12043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 12053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shader->Program); 12063d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12073d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 12083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 12093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(0); 12103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 12123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 12153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the program variants which match 12163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context. 12173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 12183d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 12193d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData) 12203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 12213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 12223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_program *program = (struct gl_program *) data; 12233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, program); 12243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 12253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 12283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which 12293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context. 12303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down. 12313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 12323d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 12333d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st) 12343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 12353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* ARB vert/frag program */ 12363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->Programs, 12373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants_cb, st); 12383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* GLSL vert/frag/geom shaders */ 12403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->ShaderObjects, 12413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_shader_program_variants_cb, st); 12423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1243