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