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 */ 350f40b5723f017bfb9e3819a5463184627ee727cc1Marek Olšák NULL, /* is centroid */ 351f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* outputs */ 352f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->num_outputs, 353f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->result_to_output, 354f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_name, 355f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_index, 356bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák key->passthrough_edgeflags, 357bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák key->clamp_color); 358f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain else 359f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain error = st_translate_mesa_program(st->ctx, 360f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain TGSI_PROCESSOR_VERTEX, 361f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain ureg, 362f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain &stvp->Base.Base, 363f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* inputs */ 364f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain vpv->num_inputs, 365f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->input_to_index, 366f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* input semantic name */ 367f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, /* input semantic index */ 368f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain NULL, 369f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain /* outputs */ 370f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain num_outputs, 371f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->result_to_output, 372f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_name, 373f379d8f73063a4c4d6cf379318c6b37118d46bfaBryan Cain stvp->output_semantic_index, 374bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák key->passthrough_edgeflags, 375bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák key->clamp_color); 37625b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 377a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger if (error) 378a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell goto fail; 379a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 380b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 381b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul if (!vpv->tgsi.tokens) 3829d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger goto fail; 3839d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 384a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 38525b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 386c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák if (stvp->glsl_to_tgsi) { 387c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák st_translate_stream_output_info(stvp->glsl_to_tgsi, 388c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák stvp->result_to_output, 389c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák &vpv->tgsi.stream_output); 390c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák } 391c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák 392b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi); 393f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 394b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 395b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( vpv->tgsi.tokens, 0 ); 396b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 397b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 39807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 39907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell return vpv; 400a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 401a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail: 4029d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__); 4039d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger _mesa_print_program(&stvp->Base.Base); 4049d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_assert(0); 4059d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 406a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 407a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 408f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 409f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 410f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 4113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 412aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Find/create a vertex program variant. 4133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 414aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_vp_variant * 415aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_vp_variant(struct st_context *st, 4163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp, 417aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_vp_variant_key *key) 4183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 419aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv; 4203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 421aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 422aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; vpv = vpv->next) { 4233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&vpv->key, key, sizeof(*key)) == 0) { 4243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 4253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4283d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!vpv) { 4293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create now */ 4303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = st_translate_vertex_program(st, stvp, key); 4313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv) { 4323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 433aa5ba96d294698809186cc4b59034abbd3076812Brian Paul vpv->next = stvp->variants; 434aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stvp->variants = vpv; 4353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 4373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 4383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return vpv; 4393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 4403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 441af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul 442af734468fee1e1fc0714557ddd199e2f91940afcBrian Paulstatic unsigned 443e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airliest_translate_interp(enum glsl_interp_qualifier glsl_qual, bool is_color) 4444dfee0011acb31f88889f298e4a355489889a542Dave Airlie{ 4454dfee0011acb31f88889f298e4a355489889a542Dave Airlie switch (glsl_qual) { 4464dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_NONE: 447e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie if (is_color) 44867e3cbf1632e361220234013147331e4618b70cbDave Airlie return TGSI_INTERPOLATE_COLOR; 449e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie return TGSI_INTERPOLATE_PERSPECTIVE; 4504dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_SMOOTH: 4514dfee0011acb31f88889f298e4a355489889a542Dave Airlie return TGSI_INTERPOLATE_PERSPECTIVE; 4524dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_FLAT: 4534dfee0011acb31f88889f298e4a355489889a542Dave Airlie return TGSI_INTERPOLATE_CONSTANT; 4544dfee0011acb31f88889f298e4a355489889a542Dave Airlie case INTERP_QUALIFIER_NOPERSPECTIVE: 4554dfee0011acb31f88889f298e4a355489889a542Dave Airlie return TGSI_INTERPOLATE_LINEAR; 456af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul default: 457af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul assert(0 && "unexpected interp mode in st_translate_interp()"); 458af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul return TGSI_INTERPOLATE_PERSPECTIVE; 4594dfee0011acb31f88889f298e4a355489889a542Dave Airlie } 4604dfee0011acb31f88889f298e4a355489889a542Dave Airlie} 461f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 462af734468fee1e1fc0714557ddd199e2f91940afcBrian Paul 463f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 4643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate a Mesa fragment shader into a TGSI shader using extra info in 4653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the key. 4663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * \return new fragment program variant 467f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 468aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_fp_variant * 469f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 4703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 471aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 472f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 473339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 474aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant); 4757230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul GLboolean deleteFP = GL_FALSE; 476f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 477697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLuint outputMapping[FRAG_RESULT_MAX]; 478697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLuint inputMapping[FRAG_ATTRIB_MAX]; 479697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ 480697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLuint attr; 4814ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca GLbitfield64 inputsRead; 482697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák struct ureg_program *ureg; 483697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 484697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLboolean write_all = GL_FALSE; 485697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 486697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 487697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 488f40b5723f017bfb9e3819a5463184627ee727cc1Marek Olšák GLboolean is_centroid[PIPE_MAX_SHADER_INPUTS]; 489697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák uint fs_num_inputs = 0; 490697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 491697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 492697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 493697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák uint fs_num_outputs = 0; 494697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 495aa5ba96d294698809186cc4b59034abbd3076812Brian Paul if (!variant) 4963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 497fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 4983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(!(key->bitmap && key->drawpixels)); 499fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 500c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#if FEATURE_drawpix 5013d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->bitmap) { 5023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glBitmap drawing */ 5035cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp; /* we free this temp program below */ 50483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 5053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_bitmap_fragment_program(st, &stfp->Base, 506aa5ba96d294698809186cc4b59034abbd3076812Brian Paul &fp, &variant->bitmap_sampler); 507f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 508aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 50943125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 5107230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul deleteFP = GL_TRUE; 5113d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 5123d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else if (key->drawpixels) { 5133d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* glDrawPixels drawing */ 5145cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp; /* we free this temp program below */ 515e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 5163d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (key->drawpixels_z || key->drawpixels_stencil) { 5173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fp = st_make_drawpix_z_stencil_program(st, key->drawpixels_z, 5183d203b610045980853d26370ee21fb2ef4aed17eBrian Paul key->drawpixels_stencil); 519f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 520e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell else { 5213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* RGBA */ 5223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul st_make_drawpix_fragment_program(st, &stfp->Base, &fp); 523aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->parameters = _mesa_clone_parameter_list(fp->Base.Parameters); 5247230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul deleteFP = GL_TRUE; 525e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell } 52643125694109b01b9d99ed73ca340fcf19b831cd5Brian Paul stfp = st_fragment_program(fp); 527f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 528c94996f0570c729b9cb2b55329ababb9877fbbeaBrian Paul#endif 529f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 530697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (!stfp->glsl_to_tgsi) 531697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT); 532f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 533697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* 534697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * Convert Mesa program inputs to TGSI input register semantics. 535697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák */ 5364ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca inputsRead = stfp->Base.Base.InputsRead; 537697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 538697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if ((inputsRead & BITFIELD64_BIT(attr)) != 0) { 539697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák const GLuint slot = fs_num_inputs++; 540ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 541697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák inputMapping[attr] = slot; 542f40b5723f017bfb9e3819a5463184627ee727cc1Marek Olšák is_centroid[slot] = (stfp->Base.IsCentroid & BITFIELD64_BIT(attr)) != 0; 543ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 544697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák switch (attr) { 545697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_WPOS: 546697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 547697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 0; 548697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 549697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 550697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_COL0: 551697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 552697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 0; 553697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr], 554697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák TRUE); 555697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 556697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_COL1: 557697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 558697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 1; 559697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr], 560697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák TRUE); 561697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 562697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_FOGC: 563697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 564697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 0; 565697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 566697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 567697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_FACE: 568697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_FACE; 569697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 0; 570697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 571697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 572697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_CLIP_DIST0: 573697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 574697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 0; 575e620f3e763f69245531d605ff383f160bd0c0e8cOlivier Galibert interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 576697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 577697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_CLIP_DIST1: 578697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST; 579697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = 1; 580e620f3e763f69245531d605ff383f160bd0c0e8cOlivier Galibert interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 581697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 582697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* In most cases, there is nothing special about these 583697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * inputs, so adopt a convention to use the generic 584697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * semantic name and the mesa FRAG_ATTRIB_ number as the 585697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * index. 586697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * 587697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * All that is required is that the vertex shader labels 588697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * its own outputs similarly, and that the vertex shader 589697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * generates at least every output required by the 590697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * fragment shader plus fixed-function hardware (such as 591697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * BFC). 592697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * 593697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * There is no requirement that semantic indexes start at 594697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * zero or be restricted to a particular range -- nobody 595697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * should be building tables based on semantic index. 596697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák */ 597697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_PNTC: 598697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX0: 599697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX1: 600697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX2: 601697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX3: 602697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX4: 603697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX5: 604697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX6: 605697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_TEX7: 606697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_ATTRIB_VAR0: 607697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák default: 608697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* Actually, let's try and zero-base this just for 609697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * readability of the generated TGSI. 610697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák */ 611697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák assert(attr >= FRAG_ATTRIB_TEX0); 612697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0); 613697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 614697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (attr == FRAG_ATTRIB_PNTC) 615ffb7d02154186402f64e0b628998485309774bb8Bryan Cain interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 616697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák else 617e1ff84371c0e8c58297611f95ec1e2cb5d5acaa4Dave Airlie interpMode[slot] = st_translate_interp(stfp->Base.InterpQualifier[attr], 618697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák FALSE); 619697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 620ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 621ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 622697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák else { 623697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák inputMapping[attr] = -1; 624ffb7d02154186402f64e0b628998485309774bb8Bryan Cain } 625697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 626ffb7d02154186402f64e0b628998485309774bb8Bryan Cain 627697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* 628697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák * Semantics and mapping for outputs 629697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák */ 630697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák { 631697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák uint numColors = 0; 632697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten; 633697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 634697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* if z is written, emit that first */ 635697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { 636697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 637697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_index[fs_num_outputs] = 0; 638697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 639697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_outputs++; 640697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 6413210cad3f26a7e8a73f2dc2f7f3740e594b068bdVinson Lee } 642a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 643697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) { 644697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_STENCIL; 645697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_index[fs_num_outputs] = 0; 646697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs; 647697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_outputs++; 648697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputsWritten &= ~(1 << FRAG_RESULT_STENCIL); 6493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 650a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 651697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* handle remaining outputs (color) */ 652697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 653697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (outputsWritten & BITFIELD64_BIT(attr)) { 654697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák switch (attr) { 655697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_RESULT_DEPTH: 656697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_RESULT_STENCIL: 657697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* handled above */ 658697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák assert(0); 659697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 660697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_RESULT_COLOR: 661697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák write_all = GL_TRUE; /* fallthrough */ 662697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák default: 663697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák assert(attr == FRAG_RESULT_COLOR || 664697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX)); 665697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 666697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_index[fs_num_outputs] = numColors; 667697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputMapping[attr] = fs_num_outputs; 668697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák numColors++; 669697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 670697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 671697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 672697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_outputs++; 67372cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie } 67472cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie } 675697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 67672cb103cf518c86d8d094380d9f8e16650a0060bDave Airlie 677697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); 678697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (ureg == NULL) { 679697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák FREE(variant); 680697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák return NULL; 681697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 682697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 683697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (ST_DEBUG & DEBUG_MESA) { 684697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák _mesa_print_program(&stfp->Base.Base); 685697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák _mesa_print_program_parameters(st->ctx, &stfp->Base.Base); 686697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák debug_printf("\n"); 687697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 688697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (write_all == GL_TRUE) 689697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_property_fs_color0_writes_all_cbufs(ureg, 1); 6903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 691697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) { 692697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák switch (stfp->Base.FragDepthLayout) { 693697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_DEPTH_LAYOUT_ANY: 694697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY); 695697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 696697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_DEPTH_LAYOUT_GREATER: 697697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER); 698697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 699697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_DEPTH_LAYOUT_LESS: 700697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS); 701697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 702697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák case FRAG_DEPTH_LAYOUT_UNCHANGED: 703697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED); 704697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák break; 705697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák default: 706697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák assert(0); 707697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák } 7083d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7094295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 710697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák if (stfp->glsl_to_tgsi) 711697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák st_translate_program(st->ctx, 712697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák TGSI_PROCESSOR_FRAGMENT, 713697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg, 714697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák stfp->glsl_to_tgsi, 715697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák &stfp->Base.Base, 716697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* inputs */ 717697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_inputs, 718697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák inputMapping, 719697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name, 720697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index, 721697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode, 722f40b5723f017bfb9e3819a5463184627ee727cc1Marek Olšák is_centroid, 723697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* outputs */ 724697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_outputs, 725697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputMapping, 726697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_name, 727697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_index, FALSE, 728697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák key->clamp_color ); 729697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák else 730697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák st_translate_mesa_program(st->ctx, 731697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák TGSI_PROCESSOR_FRAGMENT, 732697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg, 733697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák &stfp->Base.Base, 734697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* inputs */ 735697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_inputs, 736697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák inputMapping, 737697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_name, 738697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák input_semantic_index, 739697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák interpMode, 740697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák /* outputs */ 741697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_num_outputs, 742697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák outputMapping, 743697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_name, 744697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák fs_output_semantic_index, FALSE, 745697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák key->clamp_color); 746697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 747697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák variant->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 748697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák ureg_destroy( ureg ); 749697b9945fb0f55428b06821f98fd8621372f81adMarek Olšák 750aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in variant */ 751732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák variant->driver_shader = pipe->create_fs_state(pipe, &variant->tgsi); 752aa5ba96d294698809186cc4b59034abbd3076812Brian Paul variant->key = *key; 753f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 754b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 755732f69c94e17aae8dae98cdc84fdb232fdda2484Marek Olšák tgsi_dump( variant->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 756b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 757b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 7583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7597230e1a22822ce91f2d2555da53404f195fa9aafBrian Paul if (deleteFP) { 7605cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul /* Free the temporary program made above */ 7615cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul struct gl_fragment_program *fp = &stfp->Base; 7625cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul _mesa_reference_fragprog(st->ctx, &fp, NULL); 7635cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul } 7645cbff0932e498f49b57cbb71037b93416bfe30e0Brian Paul 765aa5ba96d294698809186cc4b59034abbd3076812Brian Paul return variant; 766f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 767f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 7683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 7703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Translate fragment program if needed. 7713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 772aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_fp_variant * 773aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_fp_variant(struct st_context *st, 7743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp, 775aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_fp_variant_key *key) 7763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 777aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv; 7783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 779aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 780aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; fpv = fpv->next) { 7813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&fpv->key, key, sizeof(*key)) == 0) { 7823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 7833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!fpv) { 7873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 7883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = st_translate_fragment_program(st, stfp, key); 7893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv) { 7903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 791aa5ba96d294698809186cc4b59034abbd3076812Brian Paul fpv->next = stfp->variants; 792aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stfp->variants = fpv; 7933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 7953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return fpv; 7973d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 7983d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 7993d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 8003d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 801aa5ba96d294698809186cc4b59034abbd3076812Brian Paul * Translate a geometry program to create a new variant. 8023d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 803aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstatic struct st_gp_variant * 804da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusinst_translate_geometry_program(struct st_context *st, 8053d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 806aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 807da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin{ 808da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint inputMapping[GEOM_ATTRIB_MAX]; 809da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint outputMapping[GEOM_RESULT_MAX]; 810da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct pipe_context *pipe = st->pipe; 811da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint attr; 8124ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca GLbitfield64 inputsRead; 813da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint vslot = 0; 814da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint num_generic = 0; 815da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 816da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_inputs = 0; 817da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_builtin_inputs = 0; 818da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_array_offset = 0; 819da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 820da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 821da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ubyte gs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 822da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin uint gs_num_outputs = 0; 823da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 824da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLint i; 825da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint maxSlot = 0; 826da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin struct ureg_program *ureg; 827da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 828aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 8293d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 830aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv = CALLOC_STRUCT(st_gp_variant); 8313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) 8323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 8333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 83483baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_OUTPUT); 83583baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák _mesa_remove_output_reads(&stgp->Base.Base, PROGRAM_VARYING); 83683baa8a6c5541829003bbffe1d2b8cee5a0263fdMarek Olšák 837da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg = ureg_create( TGSI_PROCESSOR_GEOMETRY ); 838da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ureg == NULL) { 8393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul FREE(gpv); 8403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return NULL; 841da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 842da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 843da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* which vertex output goes to the first geometry input */ 8447c42390453e611367cf1ba11446692ec04e0abfbZack Rusin vslot = 0; 845da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 846425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(inputMapping, 0, sizeof(inputMapping)); 847425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin memset(outputMapping, 0, sizeof(outputMapping)); 848425870c5fdb40f7daf2e25323fa28c90c4367baeZack Rusin 849da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 850da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Convert Mesa program inputs to TGSI input register semantics. 851da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 8524ac37b0b81699442893c2894aa1f5293a5cda3a9José Fonseca inputsRead = stgp->Base.Base.InputsRead; 853da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_ATTRIB_MAX; attr++) { 854dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich if ((inputsRead & BITFIELD64_BIT(attr)) != 0) { 855da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin const GLuint slot = gs_num_inputs; 856da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 857da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_inputs++; 858da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 859da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin inputMapping[attr] = slot; 860da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 861da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_map[slot + gs_array_offset] = vslot - gs_builtin_inputs; 862da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_to_index[attr] = vslot; 863da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->index_to_input[vslot] = attr; 864da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++vslot; 865da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 8667c42390453e611367cf1ba11446692ec04e0abfbZack Rusin if (attr != GEOM_ATTRIB_PRIMITIVE_ID) { 867da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_array_offset += 2; 868da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } else 869da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ++gs_builtin_inputs; 870da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 8713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul#if 0 872da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("input map at %d = %d\n", 873da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot + gs_array_offset, stgp->input_map[slot + gs_array_offset]); 874da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 875da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 876da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 877da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_PRIMITIVE_ID: 878da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_PRIMID; 879da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 880da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 881da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_POSITION: 882da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 883da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 884da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 885da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR0: 886da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 887da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 888da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 889da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_COLOR1: 890da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 891da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 1; 892da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 893da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_FOG_FRAG_COORD: 894da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 895da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = 0; 896da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 897da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_TEX_COORD: 898da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 899da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 900da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 901da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_ATTRIB_VAR0: 902da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 903da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 904da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 905da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->input_semantic_index[slot] = num_generic++; 906da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 907da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 908da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 909da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 910da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* initialize output semantics to defaults */ 911da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 912da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 913da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i] = 0; 914da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 915da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 916da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin num_generic = 0; 917da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* 918da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * Determine number of outputs, the (default) output register 919da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin * mapping and the semantic information for each output. 920da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin */ 921da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 922aa878f94ab77fe3be352d820aaa950b32836c814Brian Paul if (stgp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) { 923da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint slot; 924da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 925da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin slot = gs_num_outputs; 926da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs++; 927da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin outputMapping[attr] = slot; 928da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 929da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin switch (attr) { 930da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_POS: 931da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot == 0); 932da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 933da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 934da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 935da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL0: 936da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 937da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 938da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 939da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_COL1: 940da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 941da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 942da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 943da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL0: 944da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 945da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 946da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 947da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_SCOL1: 948da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 949da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 1; 950da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 951da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_FOGC: 952da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 953da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 954da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 955da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_PSIZ: 956da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 957da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = 0; 958da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin break; 959da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX0: 960da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX1: 961da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX2: 962da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX3: 963da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX4: 964da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX5: 965da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX6: 966da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_TEX7: 967da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 968da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin case GEOM_RESULT_VAR0: 969da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* fall-through */ 970da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin default: 971da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(slot < Elements(gs_output_semantic_name)); 972da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* use default semantic info */ 973da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 974da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[slot] = num_generic++; 975da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 976da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 977da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 978da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 979da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin assert(gs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION); 980da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 981da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* find max output slot referenced to compute gs_num_outputs */ 982da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (attr = 0; attr < GEOM_RESULT_MAX; attr++) { 983da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot) 984da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin maxSlot = outputMapping[attr]; 985da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 986da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_num_outputs = maxSlot + 1; 987da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 988da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#if 0 /* debug */ 989da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin { 990da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin GLuint i; 991da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("outputMapping? %d\n", outputMapping ? 1 : 0); 992da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (outputMapping) { 993da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("attr -> slot\n"); 994da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < 16; i++) { 995da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %3d\n", i, outputMapping[i]); 996da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 997da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 998da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf("slot sem_name sem_index\n"); 999da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin for (i = 0; i < gs_num_outputs; i++) { 1000da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin printf(" %2d %d %d\n", 1001da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin i, 1002da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_name[i], 1003da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin gs_output_semantic_index[i]); 1004da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1005da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1006da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin#endif 1007da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1008da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin /* free old shader state, if any */ 1009da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (stgp->tgsi.tokens) { 1010da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin st_free_tokens(stgp->tgsi.tokens); 1011da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = NULL; 1012da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1013da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1014da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_input_prim(ureg, stgp->Base.InputType); 1015da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_output_prim(ureg, stgp->Base.OutputType); 1016da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut); 1017da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 10182f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák st_translate_mesa_program(st->ctx, 10192f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák TGSI_PROCESSOR_GEOMETRY, 10202f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák ureg, 10212f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák &stgp->Base.Base, 10222f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák /* inputs */ 10232f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_num_inputs, 10242f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák inputMapping, 10252f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák stgp->input_semantic_name, 10262f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák stgp->input_semantic_index, 10272f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák NULL, 10282f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák /* outputs */ 10292f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_num_outputs, 10302f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák outputMapping, 10312f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_output_semantic_name, 10322f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák gs_output_semantic_index, 1033bc1c8369384b5e16547c5bf9728aa78f8dfd66ccMarek Olšák FALSE, 10342f02c2fe56bf69956912833d0a439f9693114bf5Marek Olšák FALSE); 1035da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1036da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->num_inputs = gs_num_inputs; 1037da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin stgp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 1038da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin ureg_destroy( ureg ); 10393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1040c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák if (stgp->glsl_to_tgsi) { 1041c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák st_translate_stream_output_info(stgp->glsl_to_tgsi, 1042c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák outputMapping, 1043c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák &stgp->tgsi.stream_output); 1044c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák } 1045c05fafa4a0fd93d4264c46578e23a83ecf2b481eMarek Olšák 1046aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* fill in new variant */ 10473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi); 10483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv->key = *key; 1049da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1050da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { 1051da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin _mesa_print_program(&stgp->Base.Base); 1052da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 1053da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 1054da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin 1055da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin if (ST_DEBUG & DEBUG_TGSI) { 1056da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin tgsi_dump(stgp->tgsi.tokens, 0); 1057da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin debug_printf("\n"); 1058da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin } 10593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 10613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 10623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 10653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Get/create geometry program variant. 10663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 1067aa5ba96d294698809186cc4b59034abbd3076812Brian Paulstruct st_gp_variant * 1068aa5ba96d294698809186cc4b59034abbd3076812Brian Paulst_get_gp_variant(struct st_context *st, 10693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_geometry_program *stgp, 1070aa5ba96d294698809186cc4b59034abbd3076812Brian Paul const struct st_gp_variant_key *key) 10713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 1072aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv; 10733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1074aa5ba96d294698809186cc4b59034abbd3076812Brian Paul /* Search for existing variant */ 1075aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; gpv = gpv->next) { 10763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (memcmp(&gpv->key, key, sizeof(*key)) == 0) { 10773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 10783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10813d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!gpv) { 10823d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* create new */ 10833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul gpv = st_translate_geometry_program(st, stgp, key); 10843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (gpv) { 10853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* insert into list */ 1086aa5ba96d294698809186cc4b59034abbd3076812Brian Paul gpv->next = stgp->variants; 1087aa5ba96d294698809186cc4b59034abbd3076812Brian Paul stgp->variants = gpv; 10883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 10903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return gpv; 1092da7bd6a90e1fee5c16327338fd251c0f6be34e36Zack Rusin} 1093678f80b347801d925c07a774faee1ed3f716de15Brian Paul 10943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 10963d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1097678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 1098678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 1099678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 1100678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 1101f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_print_shaders(struct gl_context *ctx) 1102678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 110384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader_program *shProg[3] = { 110484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentVertexProgram, 110584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentGeometryProgram, 110684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick ctx->Shader.CurrentFragmentProgram, 110784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick }; 110884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned j; 110984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 111084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (j = 0; j < 3; j++) { 111184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick unsigned i; 111284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 111384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (shProg[j] == NULL) 111484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick continue; 111584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 111684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick for (i = 0; i < shProg[j]->NumShaders; i++) { 111784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick struct gl_shader *sh; 111884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 111984eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick switch (shProg[j]->Shaders[i]->Type) { 112084eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_VERTEX_SHADER: 112184eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 0) ? NULL : shProg[j]->Shaders[i]; 112284eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 112384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_GEOMETRY_SHADER_ARB: 112484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 1) ? NULL : shProg[j]->Shaders[i]; 112584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 112684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick case GL_FRAGMENT_SHADER: 112784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick sh = (i != 2) ? NULL : shProg[j]->Shaders[i]; 112884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick break; 1129a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee default: 1130a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee assert(0); 1131a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee sh = NULL; 1132a54ab4960b86839f73e7c16fdde00670a67ee80eVinson Lee break; 113384eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 113484eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick 113584eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick if (sh != NULL) { 113684eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("GLSL shader %u of %u:\n", i, shProg[j]->NumShaders); 113784eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick printf("%s\n", sh->Source); 113884eba3ef71dfa822e5ff0463032cdd2e3515b888Ian Romanick } 1139678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 1140678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 1141678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 11423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11443d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 11453d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Vert/Geom/Frag programs have per-context variants. Free all the 11463d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * variants attached to the given program which match the given context. 11473d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 11483d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 11493d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants(struct st_context *st, struct gl_program *program) 11503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 11513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (!program) 11523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul return; 11533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 11543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (program->Target) { 11553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_PROGRAM_ARB: 11563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_vertex_program *stvp = (struct st_vertex_program *) program; 1158aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *vpv, **prevPtr = &stvp->variants; 11593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1160aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (vpv = stvp->variants; vpv; ) { 1161aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_vp_variant *next = vpv->next; 11623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (vpv->key.st == st) { 11633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1164a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 11653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1166aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_vp_variant(st, vpv); 11673d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11683d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1169a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &vpv->next; 11703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul vpv = next; 11723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 11753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_PROGRAM_ARB: 11763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 11773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_fragment_program *stfp = 11783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul (struct st_fragment_program *) program; 1179aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *fpv, **prevPtr = &stfp->variants; 11803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 1181aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (fpv = stfp->variants; fpv; ) { 1182aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_fp_variant *next = fpv->next; 11833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul if (fpv->key.st == st) { 11843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* unlink from list */ 1185a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 11863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* destroy this variant */ 1187aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_fp_variant(st, fpv); 11883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul else { 1190a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &fpv->next; 11913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11923d203b610045980853d26370ee21fb2ef4aed17eBrian Paul fpv = next; 11933d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11943d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 11953d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 1196c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul case MESA_GEOMETRY_PROGRAM: 1197c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul { 1198c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul struct st_geometry_program *stgp = 1199c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul (struct st_geometry_program *) program; 1200aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *gpv, **prevPtr = &stgp->variants; 1201c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul 1202aa5ba96d294698809186cc4b59034abbd3076812Brian Paul for (gpv = stgp->variants; gpv; ) { 1203aa5ba96d294698809186cc4b59034abbd3076812Brian Paul struct st_gp_variant *next = gpv->next; 1204c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul if (gpv->key.st == st) { 1205c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* unlink from list */ 1206a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul *prevPtr = next; 1207c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul /* destroy this variant */ 1208aa5ba96d294698809186cc4b59034abbd3076812Brian Paul delete_gp_variant(st, gpv); 1209c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1210c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul else { 1211a8ca30bc58b73203a83799149ca9d21bcdce74b5Brian Paul prevPtr = &gpv->next; 1212c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1213c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul gpv = next; 1214c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1215c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul } 1216c21807d2f7329a363f2c68cd8ef4dfc46575d52fBrian Paul break; 12173d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 1218e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul _mesa_problem(NULL, "Unexpected program target 0x%x in " 1219e37e196151bd8c10a8475680ed91a82de8f7aad3Brian Paul "destroy_program_variants_cb()", program->Target); 12203d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12213d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 12223d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12233d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12243d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 12253d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the shader's program variants 12263d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * which match the given context. 12273d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 12283d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 12293d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_shader_program_variants_cb(GLuint key, void *data, void *userData) 12303d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 12313d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 12323d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader *shader = (struct gl_shader *) data; 12333d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12343d203b610045980853d26370ee21fb2ef4aed17eBrian Paul switch (shader->Type) { 12353d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_SHADER_PROGRAM_MESA: 12363d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 12373d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_shader_program *shProg = (struct gl_shader_program *) data; 12383d203b610045980853d26370ee21fb2ef4aed17eBrian Paul GLuint i; 12393d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12403d203b610045980853d26370ee21fb2ef4aed17eBrian Paul for (i = 0; i < shProg->NumShaders; i++) { 12413d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shProg->Shaders[i]->Program); 12423d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12433d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 124477d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick for (i = 0; i < Elements(shProg->_LinkedShaders); i++) { 1245ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin if (shProg->_LinkedShaders[i]) 1246ddba509c16c4cb0630a4f4841b31953f02be6b3fStéphane Marchesin destroy_program_variants(st, shProg->_LinkedShaders[i]->Program); 124777d67a44cc9788072090e3f1000cfe1cec0a6807Ian Romanick } 12483d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12493d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 12503d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_VERTEX_SHADER: 12513d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_FRAGMENT_SHADER: 12523d203b610045980853d26370ee21fb2ef4aed17eBrian Paul case GL_GEOMETRY_SHADER: 12533d203b610045980853d26370ee21fb2ef4aed17eBrian Paul { 12543d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, shader->Program); 12553d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12563d203b610045980853d26370ee21fb2ef4aed17eBrian Paul break; 12573d203b610045980853d26370ee21fb2ef4aed17eBrian Paul default: 12583d203b610045980853d26370ee21fb2ef4aed17eBrian Paul assert(0); 12593d203b610045980853d26370ee21fb2ef4aed17eBrian Paul } 12603d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 12613d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12623d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12633d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 12643d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Callback for _mesa_HashWalk. Free all the program variants which match 12653d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * the given context. 12663d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 12673d203b610045980853d26370ee21fb2ef4aed17eBrian Paulstatic void 12683d203b610045980853d26370ee21fb2ef4aed17eBrian Pauldestroy_program_variants_cb(GLuint key, void *data, void *userData) 12693d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 12703d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct st_context *st = (struct st_context *) userData; 12713d203b610045980853d26370ee21fb2ef4aed17eBrian Paul struct gl_program *program = (struct gl_program *) data; 12723d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants(st, program); 12733d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 12743d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12753d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12763d203b610045980853d26370ee21fb2ef4aed17eBrian Paul/** 12773d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * Walk over all shaders and programs to delete any variants which 12783d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * belong to the given context. 12793d203b610045980853d26370ee21fb2ef4aed17eBrian Paul * This is called during context tear-down. 12803d203b610045980853d26370ee21fb2ef4aed17eBrian Paul */ 12813d203b610045980853d26370ee21fb2ef4aed17eBrian Paulvoid 12823d203b610045980853d26370ee21fb2ef4aed17eBrian Paulst_destroy_program_variants(struct st_context *st) 12833d203b610045980853d26370ee21fb2ef4aed17eBrian Paul{ 12843d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* ARB vert/frag program */ 12853d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->Programs, 12863d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_program_variants_cb, st); 12873d203b610045980853d26370ee21fb2ef4aed17eBrian Paul 12883d203b610045980853d26370ee21fb2ef4aed17eBrian Paul /* GLSL vert/frag/geom shaders */ 12893d203b610045980853d26370ee21fb2ef4aed17eBrian Paul _mesa_HashWalk(st->ctx->Shared->ShaderObjects, 12903d203b610045980853d26370ee21fb2ef4aed17eBrian Paul destroy_shader_program_variants_cb, st); 12913d203b610045980853d26370ee21fb2ef4aed17eBrian Paul} 12926792969cbc0d233942b15285e0fa84e6602733c2Brian Paul 12936792969cbc0d233942b15285e0fa84e6602733c2Brian Paul 12946792969cbc0d233942b15285e0fa84e6602733c2Brian Paul/** 12956792969cbc0d233942b15285e0fa84e6602733c2Brian Paul * For debugging, print/dump the current vertex program. 12966792969cbc0d233942b15285e0fa84e6602733c2Brian Paul */ 12976792969cbc0d233942b15285e0fa84e6602733c2Brian Paulvoid 12986792969cbc0d233942b15285e0fa84e6602733c2Brian Paulst_print_current_vertex_program(void) 12996792969cbc0d233942b15285e0fa84e6602733c2Brian Paul{ 13006792969cbc0d233942b15285e0fa84e6602733c2Brian Paul GET_CURRENT_CONTEXT(ctx); 13016792969cbc0d233942b15285e0fa84e6602733c2Brian Paul 13026792969cbc0d233942b15285e0fa84e6602733c2Brian Paul if (ctx->VertexProgram._Current) { 13036792969cbc0d233942b15285e0fa84e6602733c2Brian Paul struct st_vertex_program *stvp = 13046792969cbc0d233942b15285e0fa84e6602733c2Brian Paul (struct st_vertex_program *) ctx->VertexProgram._Current; 13056792969cbc0d233942b15285e0fa84e6602733c2Brian Paul struct st_vp_variant *stv; 13066792969cbc0d233942b15285e0fa84e6602733c2Brian Paul 13076792969cbc0d233942b15285e0fa84e6602733c2Brian Paul debug_printf("Vertex program %u\n", stvp->Base.Base.Id); 13086792969cbc0d233942b15285e0fa84e6602733c2Brian Paul 13096792969cbc0d233942b15285e0fa84e6602733c2Brian Paul for (stv = stvp->variants; stv; stv = stv->next) { 13106792969cbc0d233942b15285e0fa84e6602733c2Brian Paul debug_printf("variant %p\n", stv); 13116792969cbc0d233942b15285e0fa84e6602733c2Brian Paul tgsi_dump(stv->tgsi.tokens, 0); 13126792969cbc0d233942b15285e0fa84e6602733c2Brian Paul } 13136792969cbc0d233942b15285e0fa84e6602733c2Brian Paul } 13146792969cbc0d233942b15285e0fa84e6602733c2Brian Paul} 1315