st_program.c revision 697b9945fb0f55428b06821f98fd8621372f81ad
1f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/************************************************************************** 2f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 3f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * All Rights Reserved. 5f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 6f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Permission is hereby granted, free of charge, to any person obtaining a 7f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * copy of this software and associated documentation files (the 8f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * "Software"), to deal in the Software without restriction, including 9f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * without limitation the rights to use, copy, modify, merge, publish, 10f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * distribute, sub license, and/or sell copies of the Software, and to 11f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * permit persons to whom the Software is furnished to do so, subject to 12f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * the following conditions: 13f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 14f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * The above copyright notice and this permission notice (including the 15f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * next paragraph) shall be included in all copies or substantial portions 16f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * of the Software. 17f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 18f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * 26f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian **************************************************************************/ 27f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 28f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Authors: 29f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Keith Whitwell <keith@tungstengraphics.com> 30f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Brian Paul 31f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 32f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 33f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 34b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/imports.h" 353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "main/hash.h" 36edc09358f72cd48cb2315daf23c82e7646aeaea3Vinson Lee#include "main/mfeatures.h" 37b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/mtypes.h" 383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "program/prog_parameter.h" 39ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_print.h" 40ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/programopt.h" 41f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 42f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h" 43f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h" 44abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h" 456acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h" 46c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h" 471b8aa2176c4fc580cc31c57c7e50e7f39ef2cc04Vinson Lee#include "tgsi/tgsi_ureg.h" 48f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 49b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "st_debug.h" 503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_bitmap.h" 513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#include "st_cb_drawpixels.h" 52f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h" 53f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h" 54ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h" 55339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 56f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 578468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 588468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 598468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/** 60aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a vertex program variant. Note the caller must unlink 61aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list. 623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 633d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 64aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_vp_variant(struct st_context *st, struct st_vp_variant *vpv) 653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->driver_shader) 673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_delete_vertex_shader(st->cso_context, vpv->driver_shader); 683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if FEATURE_feedback || FEATURE_rastpos 703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->draw_shader) 713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul draw_delete_vertex_shader( st->draw, vpv->draw_shader ); 723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#endif 733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->tgsi.tokens) 753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_free_tokens(vpv->tgsi.tokens); 763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE( vpv ); 783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 838468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations: 848468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */ 8507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid 86aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_vp_variants( struct st_context *st, 8707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp ) 8807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 89aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv; 9007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 91aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; ) { 92aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *next = vpv->next; 93aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_vp_variant(st, vpv); 943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = next; 953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 9607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 97aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stvp->variants = NULL; 983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 103aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a fragment program variant. Note the caller must unlink 104aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list. 1053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1063d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 107aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_fp_variant(struct st_context *st, struct st_fp_variant *fpv) 1083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 1093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv->driver_shader) 1103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_delete_fragment_shader(st->cso_context, fpv->driver_shader); 11180424700574e128070f457d79e1920d512a1efdaThomas Hellstrom if (fpv->parameters) 11280424700574e128070f457d79e1920d512a1efdaThomas Hellstrom _mesa_free_parameter_list(fpv->parameters); 113732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák if (fpv->tgsi.tokens) 114732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák st_free_tokens(fpv->tgsi.tokens); 1153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(fpv); 1163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 120aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a fragment program. 1213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1223d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 123aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_fp_variants(struct st_context *st, struct st_fragment_program *stfp) 1243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 125aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv; 1263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 127aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; ) { 128aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *next = fpv->next; 129aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_fp_variant(st, fpv); 1303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = next; 1313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 1323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 133aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stfp->variants = NULL; 1343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 138aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Delete a geometry program variant. Note the caller must unlink 139aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * the variant from the linked list. 1403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1413d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 142aa5ba96d294698809186cc4b59034abbd3076812Brian Pauldelete_gp_variant(struct st_context *st, struct st_gp_variant *gpv) 1433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 1443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (gpv->driver_shader) 1453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul cso_delete_geometry_shader(st->cso_context, gpv->driver_shader); 14607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(gpv); 1483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 14907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 1503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 152aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Free all variants of a geometry program. 1533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1543d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 155aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp) 1563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 157aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 1583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 159aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; ) { 160aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *next = gpv->next; 161aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_gp_variant(st, gpv); 1623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv = next; 16307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 16407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 165aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stgp->variants = NULL; 16607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 16707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 16807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 16907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader. 173e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping to map vertex program output registers (VERT_RESULT_x) 174e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * to TGSI output slots 175f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 176f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 177f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 178f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainvoid 179f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cainst_prepare_vertex_program(struct gl_context *ctx, 18007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp) 181f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 18207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell GLuint attr; 183c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 18407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs = 0; 18507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_outputs = 0; 186f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 187f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs if (stvp->Base.IsPositionInvariant) 188f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain _mesa_insert_mvp_code(ctx, &stvp->Base); 189f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs 19044867da3543ca54ef245695cef72a6e305451d93Bryan Cain if (!stvp->glsl_to_tgsi) 19144867da3543ca54ef245695cef72a6e305451d93Bryan Cain assert(stvp->Base.Base.NumInstructions > 1); 192325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell 193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of inputs, the mappings between VERT_ATTRIB_x 195f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * and TGSI generic input indexes, plus input attrib semantic info. 196f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 197f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 198dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich if ((stvp->Base.Base.InputsRead & BITFIELD64_BIT(attr)) != 0) { 19907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->input_to_index[attr] = stvp->num_inputs; 20007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->index_to_input[stvp->num_inputs] = attr; 20107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs++; 202f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 203f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 20450caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger /* bit of a hack, presetup potentially unused edgeflag input */ 20550caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs; 20650caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG; 207f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 20807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Compute mapping of vertex program outputs to slots. 209f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 210f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 211b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) { 21207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = ~0; 21307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 21407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell else { 21507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell unsigned slot = stvp->num_outputs++; 21607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 21707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = slot; 218f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 220f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 22107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 22207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 224f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 22507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 22607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 228f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 22907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 23007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 232f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 23307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 23407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 236f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 23707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 23807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 240f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 24107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 24207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 244f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 24507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 24607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 24859be691638200797583bce39a83f641d30d97492Bryan Cain case VERT_RESULT_CLIP_DIST0: 24959be691638200797583bce39a83f641d30d97492Bryan Cain stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 25059be691638200797583bce39a83f641d30d97492Bryan Cain stvp->output_semantic_index[slot] = 0; 25159be691638200797583bce39a83f641d30d97492Bryan Cain break; 25259be691638200797583bce39a83f641d30d97492Bryan Cain case VERT_RESULT_CLIP_DIST1: 25359be691638200797583bce39a83f641d30d97492Bryan Cain stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 25459be691638200797583bce39a83f641d30d97492Bryan Cain stvp->output_semantic_index[slot] = 1; 25559be691638200797583bce39a83f641d30d97492Bryan Cain break; 256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 258f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 259a103c61d278b7f56208818c4b949c408c00286faDave Airlie case VERT_RESULT_CLIP_VERTEX: 260a103c61d278b7f56208818c4b949c408c00286faDave Airlie stvp->output_semantic_name[slot] = TGSI_SEMANTIC_CLIPVERTEX; 261a103c61d278b7f56208818c4b949c408c00286faDave Airlie stvp->output_semantic_index[slot] = 0; 262a103c61d278b7f56208818c4b949c408c00286faDave Airlie break; 26307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 264f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX0: 265f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX1: 266f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX2: 267f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX3: 268f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX4: 269f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX5: 270f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX6: 271f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX7: 27207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 27307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0; 27407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 27507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 276f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 277f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 27807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr < VERT_RESULT_MAX); 27907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 28007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 - 28107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FRAG_ATTRIB_TEX0 + 28207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell attr - 28307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell VERT_RESULT_VAR0); 28407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 285f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 286f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 287f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 288890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger /* similar hack to above, presetup potentially unused edgeflag output */ 289890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs; 290890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG; 291890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_index[stvp->num_outputs] = 0; 29207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 293f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 294509d9eb686411254b24139012b7594e10a760b6cBrian Paul 2953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 296aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a vertex program to create a new variant. 2973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 298aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_vp_variant * 29907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st, 30007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp, 301aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 30207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 303aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv = CALLOC_STRUCT(st_vp_variant); 30407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct pipe_context *pipe = st->pipe; 305a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 306a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger enum pipe_error error; 307890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger unsigned num_outputs; 308a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 309f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain st_prepare_vertex_program(st->ctx, stvp); 3103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 31144867da3543ca54ef245695cef72a6e305451d93Bryan Cain if (!stvp->glsl_to_tgsi) 31244867da3543ca54ef245695cef72a6e305451d93Bryan Cain { 31344867da3543ca54ef245695cef72a6e305451d93Bryan Cain _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_OUTPUT); 31444867da3543ca54ef245695cef72a6e305451d93Bryan Cain _mesa_remove_output_reads(&stvp->Base.Base, PROGRAM_VARYING); 31544867da3543ca54ef245695cef72a6e305451d93Bryan Cain } 31683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 317a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_VERTEX ); 318b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee if (ureg == NULL) { 319b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee FREE(vpv); 320a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 321b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee } 322a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 323c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák vpv->key = *key; 324c0c929cdac75a9a0077d74c87b525b65f0a3b6c8Marek Olšák 32550caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger vpv->num_inputs = stvp->num_inputs; 326890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs = stvp->num_outputs; 327890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger if (key->passthrough_edgeflags) { 328890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger vpv->num_inputs++; 329890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs++; 330890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger } 331a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 332ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul if (ST_DEBUG & DEBUG_MESA) { 333ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program(&stvp->Base.Base); 334ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program_parameters(st->ctx, &stvp->Base.Base); 335ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul debug_printf("\n"); 336ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul } 337ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul 338f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain if (stvp->glsl_to_tgsi) 339f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain error = st_translate_program(st->ctx, 340f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain TGSI_PROCESSOR_VERTEX, 341f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain ureg, 342f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->glsl_to_tgsi, 343f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain &stvp->Base.Base, 344f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* inputs */ 345f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->num_inputs, 346f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->input_to_index, 347f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* input semantic name */ 348f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* input semantic index */ 349f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* interp mode */ 350f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* outputs */ 351f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->num_outputs, 352f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->result_to_output, 353f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_name, 354f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_index, 355bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák key->passthrough_edgeflags, 356bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák key->clamp_color); 357f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain else 358f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain error = st_translate_mesa_program(st->ctx, 359f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain TGSI_PROCESSOR_VERTEX, 360f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain ureg, 361f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain &stvp->Base.Base, 362f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* inputs */ 363f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain vpv->num_inputs, 364f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->input_to_index, 365f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* input semantic name */ 366f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* input semantic index */ 367f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, 368f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* outputs */ 369f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain num_outputs, 370f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->result_to_output, 371f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_name, 372f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_index, 373bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák key->passthrough_edgeflags, 374bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák key->clamp_color); 37525b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 376a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger if (error) 377a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell goto fail; 378a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 379b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 380b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul if (!vpv->tgsi.tokens) 3819d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger goto fail; 3829d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 383a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 38425b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 385c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák if (stvp->glsl_to_tgsi) { 386c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák st_translate_stream_output_info(stvp->glsl_to_tgsi, 387c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák stvp->result_to_output, 388c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák &vpv->tgsi.stream_output); 389c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák } 390c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák 391b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi); 392f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 393b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 394b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( vpv->tgsi.tokens, 0 ); 395b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 396b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 39707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 39807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell return vpv; 399a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 400a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail: 4019d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__); 4029d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger _mesa_print_program(&stvp->Base.Base); 4039d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_assert(0); 4049d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 405a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 406a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 407f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 408f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 409f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 4103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 411aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant. 4123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 413aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant * 414aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st, 4153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp, 416aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 4173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 418aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv; 4193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 420aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 421aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; vpv = vpv->next) { 4223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&vpv->key, key, sizeof(*key)) == 0) { 4233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!vpv) { 4283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create now */ 4293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = st_translate_vertex_program(st, stvp, key); 4303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv) { 4313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 432aa5ba96d294698809186cc4b59034abbd3076812Brian Paul vpv->next = stvp->variants; 433aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stvp->variants = vpv; 4343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return vpv; 4383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 4393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 440af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul 441af734468fee1e1fc0714557ddd199e2f91940afcBrian Paulstatic unsigned 442e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airliest_translate_interp(enum glsl_interp_qualifier glsl_qual, bool is_color) 4434dfee0011acb31f88889f298e4a355489889a542Dave Airlie{ 4444dfee0011acb31f88889f298e4a355489889a542Dave Airlie switch (glsl_qual) { 4454dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_NONE: 446e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie if (is_color) 44767e3cbf1632e361220234013147331e4618b70cbDave Airlie return TGSI_INTERPOLATE_COLOR; 448e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie return TGSI_INTERPOLATE_PERSPECTIVE; 4494dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_SMOOTH: 4504dfee0011acb31f88889f298e4a355489889a542Dave Airlie return TGSI_INTERPOLATE_PERSPECTIVE; 4514dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_FLAT: 4524dfee0011acb31f88889f298e4a355489889a542Dave Airlie return TGSI_INTERPOLATE_CONSTANT; 4534dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_NOPERSPECTIVE: 4544dfee0011acb31f88889f298e4a355489889a542Dave Airlie return TGSI_INTERPOLATE_LINEAR; 455af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul default: 456af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul assert(0 && "unexpected interp mode in st_translate_interp()"); 457af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul return TGSI_INTERPOLATE_PERSPECTIVE; 4584dfee0011acb31f88889f298e4a355489889a542Dave Airlie } 4594dfee0011acb31f88889f298e4a355489889a542Dave Airlie} 460f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 461af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul 462f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 4633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in 4643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key. 4653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return new fragment program variant 466f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 467aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant * 468f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 4693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 470aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 471f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 472339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 473aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant); 4747230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul GLboolean deleteFP = GL_FALSE; 475f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 476697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLuint outputMapping[FRAG_RESULT_MAX]; 477697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLuint inputMapping[FRAG_ATTRIB_MAX]; 478697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ 479697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLuint attr; 480697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák const GLbitfield64 inputsRead = stfp->Base.Base.InputsRead; 481697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák struct ureg_program *ureg; 482697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 483697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLboolean write_all = GL_FALSE; 484697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 485697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 486697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 487697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák uint fs_num_inputs = 0; 488697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 489697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 490697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 491697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák uint fs_num_outputs = 0; 492697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 493aa5ba96d294698809186cc4b59034abbd3076812Brian Paul if (!variant) 4943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 495fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 4963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(!(key->bitmap && key->drawpixels)); 497fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 498c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#if FEATURE_drawpix 4993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->bitmap) { 5003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glBitmap drawing */ 5015cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp; /* we free this temp program below */ 50283baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 5033d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_bitmap_fragment_program(st, &stfp->Base, 504aa5ba96d294698809186cc4b59034abbd3076812Brian Paul &fp, &variant->bitmap_sampler); 505f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 506aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 50743125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 5087230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul deleteFP = GL_TRUE; 5093d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5103d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else if (key->drawpixels) { 5113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glDrawPixels drawing */ 5125cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp; /* we free this temp program below */ 513e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 5143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->drawpixels_z || key->drawpixels_stencil) { 5153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z, 5163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul key->drawpixels_stencil); 517f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 518e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell else { 5193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* RGBA */ 5203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_drawpix_fragment_program(st, &stfp->Base, &fp); 521aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 5227230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul deleteFP = GL_TRUE; 523e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell } 52443125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 525f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 526c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#endif 527f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 528697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (!stfp->glsl_to_tgsi) 529697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT); 530f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 531697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* 532697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * Convert Mesa program inputs to TGSI input register semantics. 533697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák */ 534697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 535697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if ((inputsRead & BITFIELD64_BIT(attr)) != 0) { 536697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák const GLuint slot = fs_num_inputs++; 537ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 538697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák inputMapping[attr] = slot; 539ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 540697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák switch (attr) { 541697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_WPOS: 542697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 543697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 0; 544697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 545697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 546697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_COL0: 547697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 548697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 0; 549697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr], 550697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák TRUE); 551697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 552697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_COL1: 553697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 554697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 1; 555697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr], 556697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák TRUE); 557697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 558697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_FOGC: 559697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 560697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 0; 561697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 562697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 563697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_FACE: 564697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_FACE; 565697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 0; 566697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 567697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 568697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_CLIP_DIST0: 569697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 570697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 0; 571697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 572697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 573697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_CLIP_DIST1: 574697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 575697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 1; 576697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 577697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 578697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* In most cases, there is nothing special about these 579697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * inputs, so adopt a convention to use the generic 580697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * semantic name and the mesa FRAG_ATTRIB_ number as the 581697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * index. 582697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * 583697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * All that is required is that the vertex shader labels 584697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * its own outputs similarly, and that the vertex shader 585697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * generates at least every output required by the 586697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * fragment shader plus fixed-function hardware (such as 587697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * BFC). 588697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * 589697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * There is no requirement that semantic indexes start at 590697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * zero or be restricted to a particular range -- nobody 591697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * should be building tables based on semantic index. 592697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák */ 593697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_PNTC: 594697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX0: 595697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX1: 596697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX2: 597697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX3: 598697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX4: 599697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX5: 600697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX6: 601697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX7: 602697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_VAR0: 603697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák default: 604697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* Actually, let's try and zero-base this just for 605697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * readability of the generated TGSI. 606697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák */ 607697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák assert(attr >= FRAG_ATTRIB_TEX0); 608697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0); 609697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 610697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (attr == FRAG_ATTRIB_PNTC) 611ffb7d02154186402f64e0b628998485309774bb8Bryan Cain interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 612697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák else 613e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr], 614697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák FALSE); 615697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 616ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 617ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 618697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák else { 619697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák inputMapping[attr] = -1; 620ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 621697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 622ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 623697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* 624697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * Semantics and mapping for outputs 625697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák */ 626697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák { 627697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák uint numColors = 0; 628697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten; 629697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 630697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* if z is written, emit that first */ 631697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { 632697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 633697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_index[fs_num_outputs] = 0; 634697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 635697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_outputs++; 636697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 6373210cad3f26a7e8a73f2dc2f7f3740e594b068bdVinson Lee } 638a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 639697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) { 640697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL; 641697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_index[fs_num_outputs] = 0; 642697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs; 643697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_outputs++; 644697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); 6453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 646a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 647697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* handle remaining outputs (color) */ 648697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 649697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (outputsWritten & BITFIELD64_BIT(attr)) { 650697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák switch (attr) { 651697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_RESULT_DEPTH: 652697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_RESULT_STENCIL: 653697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* handled above */ 654697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák assert(0); 655697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 656697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_RESULT_COLOR: 657697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák write_all = GL_TRUE; /* fallthrough */ 658697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák default: 659697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák assert(attr == FRAG_RESULT_COLOR || 660697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX)); 661697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 662697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_index[fs_num_outputs] = numColors; 663697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputMapping[attr] = fs_num_outputs; 664697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák numColors++; 665697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 666697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 667697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 668697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_outputs++; 66972cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie } 67072cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie } 671697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 67272cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie 673697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); 674697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (ureg == NULL) { 675697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák FREE(variant); 676697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák return NULL; 677697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 678697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 679697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (ST_DEBUG & DEBUG_MESA) { 680697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák _mesa_print_program(&stfp->Base.Base); 681697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák _mesa_print_program_parameters(st->ctx, &stfp->Base.Base); 682697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák debug_printf("\n"); 683697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 684697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (write_all == GL_TRUE) 685697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_property_fs_color0_writes_all_cbufs(ureg, 1); 6863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 687697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) { 688697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák switch (stfp->Base.FragDepthLayout) { 689697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_DEPTH_LAYOUT_ANY: 690697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY); 691697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 692697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_DEPTH_LAYOUT_GREATER: 693697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER); 694697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 695697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_DEPTH_LAYOUT_LESS: 696697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS); 697697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 698697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_DEPTH_LAYOUT_UNCHANGED: 699697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED); 700697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 701697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák default: 702697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák assert(0); 703697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 7043d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 706697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (stfp->glsl_to_tgsi) 707697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák st_translate_program(st->ctx, 708697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák TGSI_PROCESSOR_FRAGMENT, 709697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg, 710697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák stfp->glsl_to_tgsi, 711697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák &stfp->Base.Base, 712697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* inputs */ 713697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_inputs, 714697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák inputMapping, 715697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name, 716697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index, 717697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode, 718697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* outputs */ 719697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_outputs, 720697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputMapping, 721697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_name, 722697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_index, FALSE, 723697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák key->clamp_color ); 724697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák else 725697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák st_translate_mesa_program(st->ctx, 726697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák TGSI_PROCESSOR_FRAGMENT, 727697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg, 728697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák &stfp->Base.Base, 729697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* inputs */ 730697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_inputs, 731697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák inputMapping, 732697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name, 733697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index, 734697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode, 735697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* outputs */ 736697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_outputs, 737697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputMapping, 738697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_name, 739697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_index, FALSE, 740697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák key->clamp_color); 741697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 742697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák variant->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 743697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_destroy( ureg ); 744697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 745aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in variant */ 746732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák variant->driver_shader = pipe->create_fs_state(pipe, &variant->tgsi); 747aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->key = *key; 748f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 749b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 750732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák tgsi_dump( variant->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 751b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 752b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 7533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7547230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul if (deleteFP) { 7555cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul /* Free the temporary program made above */ 7565cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp = &stfp->Base; 7575cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul _mesa_reference_fragprog(st->ctx, &fp, NULL); 7585cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul } 7595cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul 760aa5ba96d294698809186cc4b59034abbd3076812Brian Paul return variant; 761f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 762f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 7633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 7653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed. 7663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 767aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant * 768aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st, 7693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 770aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 7713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 772aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv; 7733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 774aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 775aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; fpv = fpv->next) { 7763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&fpv->key, key, sizeof(*key)) == 0) { 7773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 7783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!fpv) { 7823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 7833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = st_translate_fragment_program(st, stfp, key); 7843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv) { 7853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 786aa5ba96d294698809186cc4b59034abbd3076812Brian Paul fpv->next = stfp->variants; 787aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stfp->variants = fpv; 7883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return fpv; 7923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 7933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 796aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant. 7973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 798aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant * 799da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st, 8003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 801aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 802da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{ 803da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint inputMapping[GEOM_ATTRIB_MAX]; 804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint outputMapping[GEOM_RESULT_MAX]; 805da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct pipe_context *pipe = st->pipe; 806da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint attr; 807dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich const GLbitfield64 inputsRead = stgp->Base.Base.InputsRead; 808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint vslot = 0; 809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint num_generic = 0; 810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_inputs = 0; 812da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_builtin_inputs = 0; 813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_array_offset = 0; 814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_outputs = 0; 818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLint i; 820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint maxSlot = 0; 821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct ureg_program *ureg; 822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 823aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 8243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 825aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv = CALLOC_STRUCT(st_gp_variant); 8263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) 8273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 8283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 82983baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT); 83083baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING); 83183baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 832da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY ); 833da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ureg == NULL) { 8343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(gpv); 8353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 836da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* which vertex output goes to the first geometry input */ 8397c42390453e611367cf1ba11446692ec04e0abfbZack Rusin vslot = 0; 840da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 841425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(inputMapping, 0, sizeof(inputMapping)); 842425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(outputMapping, 0, sizeof(outputMapping)); 843425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin 844da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Convert Mesa program inputs to TGSI input register semantics. 846da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 847da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) { 848dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich if ((inputsRead & BITFIELD64_BIT(attr)) != 0) { 849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLuint slot = gs_num_inputs; 850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_inputs++; 852da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputMapping[attr] = slot; 854da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs; 856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_to_index[attr] = vslot; 857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->index_to_input[vslot] = attr; 858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++vslot; 859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 8607c42390453e611367cf1ba11446692ec04e0abfbZack Rusin if (attr != GEOM_ATTRIB_PRIMITIVE_ID) { 861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_array_offset += 2; 862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } else 863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++gs_builtin_inputs; 864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 8653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0 866da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("input map at %d = %d\n", 867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]); 868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 871da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_PRIMITIVE_ID: 872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID; 873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_POSITION: 876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR0: 880da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 881da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 882da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 883da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR1: 884da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 885da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 1; 886da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 887da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_FOG_FRAG_COORD: 888da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 889da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 890da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 891da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_TEX_COORD: 892da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 893da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 894da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 895da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_VAR0: 896da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 897da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 898da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 899da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 900da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 901da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 902da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 903da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 904da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* initialize output semantics to defaults */ 905da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 906da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 907da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i] = 0; 908da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 909da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 910da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin num_generic = 0; 911da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 912da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Determine number of outputs, the (default) output register 913da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * mapping and the semantic information for each output. 914da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 915da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 916aa878f94ab77fe3be352d820aaa950b32836c814Brian Paul if (stgp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) { 917da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint slot; 918da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 919da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot = gs_num_outputs; 920da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs++; 921da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputMapping[attr] = slot; 922da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 923da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 924da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_POS: 925da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot == 0); 926da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 927da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 928da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 929da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL0: 930da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 931da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 932da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 933da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL1: 934da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 935da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 936da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 937da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL0: 938da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 939da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 940da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 941da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL1: 942da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 943da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 944da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 945da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_FOGC: 946da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 947da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 948da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 949da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_PSIZ: 950da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 951da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 952da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 953da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX0: 954da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX1: 955da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX2: 956da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX3: 957da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX4: 958da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX5: 959da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX6: 960da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX7: 961da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 962da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_VAR0: 963da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 964da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 965da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot < Elements(gs_output_semantic_name)); 966da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* use default semantic info */ 967da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 968da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = num_generic++; 969da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 970da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 971da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 972da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 973da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION); 974da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 975da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* find max output slot referenced to compute gs_num_outputs */ 976da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 977da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot) 978da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin maxSlot = outputMapping[attr]; 979da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 980da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs = maxSlot + 1; 981da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 982da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */ 983da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin { 984da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint i; 985da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("outputMapping? %d\n", outputMapping ? 1 : 0); 986da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping) { 987da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("attr -> slot\n"); 988da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < 16; i++) { 989da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %3d\n", i, outputMapping[i]); 990da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 991da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 992da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("slot sem_name sem_index\n"); 993da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < gs_num_outputs; i++) { 994da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %d %d\n", 995da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin i, 996da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i], 997da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i]); 998da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 999da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1000da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 1001da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1002da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* free old shader state, if any */ 1003da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->tgsi.tokens) { 1004da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin st_free_tokens(stgp->tgsi.tokens); 1005da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = NULL; 1006da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1007da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1008da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_input_prim(ureg, stgp->Base.InputType); 1009da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_output_prim(ureg, stgp->Base.OutputType); 1010da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut); 1011da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 10122f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák st_translate_mesa_program(st->ctx, 10132f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák TGSI_PROCESSOR_GEOMETRY, 10142f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák ureg, 10152f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák &stgp->Base.Base, 10162f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák /* inputs */ 10172f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_num_inputs, 10182f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák inputMapping, 10192f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák stgp->input_semantic_name, 10202f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák stgp->input_semantic_index, 10212f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák NULL, 10222f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák /* outputs */ 10232f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_num_outputs, 10242f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák outputMapping, 10252f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_output_semantic_name, 10262f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_output_semantic_index, 1027bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák FALSE, 10282f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák FALSE); 1029da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1030da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->num_inputs = gs_num_inputs; 1031da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 1032da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_destroy( ureg ); 10333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1034c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák if (stgp->glsl_to_tgsi) { 1035c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák st_translate_stream_output_info(stgp->glsl_to_tgsi, 1036c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák outputMapping, 1037c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák &stgp->tgsi.stream_output); 1038c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák } 1039c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák 1040aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in new variant */ 10413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi); 10423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->key = *key; 1043da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1044da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { 1045da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin _mesa_print_program(&stgp->Base.Base); 1046da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 1047da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1048da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1049da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ST_DEBUG & DEBUG_TGSI) { 1050da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin tgsi_dump(stgp->tgsi.tokens, 0); 1051da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 1052da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 10533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 10553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 10563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 10593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant. 10603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1061aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant * 1062aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st, 10633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 1064aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 10653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 1066aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 10673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1068aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 1069aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; gpv = gpv->next) { 10703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&gpv->key, key, sizeof(*key)) == 0) { 10713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 10723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) { 10763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 10773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv = st_translate_geometry_program(st, stgp, key); 10783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (gpv) { 10793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 1080aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv->next = stgp->variants; 1081aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stgp->variants = gpv; 10823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 1086da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin} 1087678f80b347801d925c07a774faee1ed3f716de15Brian Paul 10883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1091678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 1092678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 1093678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 1094678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 1095f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx) 1096678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 109784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader_program *shProg[3] = { 109884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentVertexProgram, 109984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentGeometryProgram, 110084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentFragmentProgram, 110184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick }; 110284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned j; 110384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 110484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (j = 0; j < 3; j++) { 110584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned i; 110684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 110784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (shProg[j] == NULL) 110884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick continue; 110984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 111084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (i = 0; i < shProg[j]->NumShaders; i++) { 111184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader *sh; 111284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 111384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick switch (shProg[j]->Shaders[i]->Type) { 111484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_VERTEX_SHADER: 111584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 0) ? NULL : shProg[j]->Shaders[i]; 111684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 111784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_GEOMETRY_SHADER_ARB: 111884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 1) ? NULL : shProg[j]->Shaders[i]; 111984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 112084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_FRAGMENT_SHADER: 112184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 2) ? NULL : shProg[j]->Shaders[i]; 112284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 1123a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee default: 1124a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee assert(0); 1125a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee sh = NULL; 1126a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee break; 112784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 112884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 112984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (sh != NULL) { 113084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders); 113184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("%s\n", sh->Source); 113284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 1133678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 1134678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 1135678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 11363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 11393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants. Free all the 11403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context. 11413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 11433d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program) 11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!program) 11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return; 11473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (program->Target) { 11493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_PROGRAM_ARB: 11503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp = (struct st_vertex_program *) program; 1152aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv, **prevPtr = &stvp->variants; 11533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1154aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; ) { 1155aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *next = vpv->next; 11563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->key.st == st) { 11573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1158a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 11593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1160aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_vp_variant(st, vpv); 11613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1163a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &vpv->next; 11643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = next; 11663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 11693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_PROGRAM_ARB: 11703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp = 11723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul (struct st_fragment_program *) program; 1173aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv, **prevPtr = &stfp->variants; 11743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1175aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; ) { 1176aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *next = fpv->next; 11773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv->key.st == st) { 11783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1179a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 11803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1181aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_fp_variant(st, fpv); 11823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1184a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &fpv->next; 11853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = next; 11873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 1190c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul case MESA_GEOMETRY_PROGRAM: 1191c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul { 1192c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul struct st_geometry_program *stgp = 1193c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul (struct st_geometry_program *) program; 1194aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv, **prevPtr = &stgp->variants; 1195c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul 1196aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; ) { 1197aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *next = gpv->next; 1198c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul if (gpv->key.st == st) { 1199c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* unlink from list */ 1200a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 1201c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* destroy this variant */ 1202aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_gp_variant(st, gpv); 1203c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1204c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul else { 1205a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &gpv->next; 1206c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1207c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul gpv = next; 1208c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1209c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1210c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul break; 12113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 1212e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul _mesa_problem(NULL, "Unexpected program target 0x%x in " 1213e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul "destroy_program_variants_cb()", program->Target); 12143d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12153d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 12163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 12193d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the shader's program variants 12203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context. 12213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 12223d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 12233d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData) 12243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 12253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 12263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader *shader = (struct gl_shader *) data; 12273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (shader->Type) { 12293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_SHADER_PROGRAM_MESA: 12303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 12313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader_program *shProg = (struct gl_shader_program *) data; 12323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint i; 12333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (i = 0; i < shProg->NumShaders; i++) { 12353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shProg->Shaders[i]->Program); 12363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 123877d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick for (i = 0; i < Elements(shProg->_LinkedShaders); i++) { 1239ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin if (shProg->_LinkedShaders[i]) 1240ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin destroy_program_variants(st, shProg->_LinkedShaders[i]->Program); 124177d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick } 12423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 12443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_SHADER: 12453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_SHADER: 12463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_GEOMETRY_SHADER: 12473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 12483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shader->Program); 12493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 12513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 12523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(0); 12533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 12553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 12583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the program variants which match 12593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context. 12603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 12613d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 12623d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData) 12633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 12643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 12653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_program *program = (struct gl_program *) data; 12663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, program); 12673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 12683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 12713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which 12723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context. 12733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down. 12743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 12753d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 12763d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st) 12773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 12783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* ARB vert/frag program */ 12793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->Programs, 12803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants_cb, st); 12813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* GLSL vert/frag/geom shaders */ 12833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->ShaderObjects, 12843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_shader_program_variants_cb, st); 12853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 1286