st_program.c revision a08e348a84f57ed5e8bf5888f1ce13934d2ce8fa
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" 35b5051bf6bbe54269c78f4dd545791e51bc7ce9e0Brian#include "main/mtypes.h" 36633e1133aeed04df650b97c8d25a041014fd6f5eBrian#include "shader/prog_print.h" 37f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs#include "shader/programopt.h" 38f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 39f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h" 40f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h" 41abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h" 426acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "draw/draw_context.h" 43c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_dump.h" 44f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 45b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "st_debug.h" 46f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h" 47f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_atom.h" 48f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h" 49ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h" 50339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 51f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 528468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 538468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 548468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/** 558468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations: 568468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */ 5707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid 5807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_vp_release_varients( struct st_context *st, 5907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp ) 6007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 6107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vp_varient *vpv; 6207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 6307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell for (vpv = stvp->varients; vpv; ) { 6407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vp_varient *next = vpv->next; 6507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 6607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell if (vpv->driver_shader) 6707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell cso_delete_vertex_shader(st->cso_context, vpv->driver_shader); 6807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 6907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell if (vpv->draw_shader) 7007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell draw_delete_vertex_shader( st->draw, vpv->draw_shader ); 7107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 7207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell if (vpv->state.tokens) 7307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell st_free_tokens(vpv->state.tokens); 7407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 7507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FREE( vpv ); 7607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 7707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell vpv = next; 7807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 7907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 8007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->varients = NULL; 8107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 8207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 8307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 8407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 85f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 86f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 87f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader. 88e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping to map vertex program output registers (VERT_RESULT_x) 89e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * to TGSI output slots 90f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 91f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 92f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 93ac95fee4fffee77bb7bd798d094ed2e3a7c4019bBrianvoid 9407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st, 9507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp) 96f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 9707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell GLuint attr; 98c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 9907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs = 0; 10007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_outputs = 0; 101f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 102f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs if (stvp->Base.IsPositionInvariant) 103f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs _mesa_insert_mvp_code(st->ctx, &stvp->Base); 104f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs 105f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 106f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of inputs, the mappings between VERT_ATTRIB_x 107f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * and TGSI generic input indexes, plus input attrib semantic info. 108f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 109f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 110f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.InputsRead & (1 << attr)) { 11107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->input_to_index[attr] = stvp->num_inputs; 11207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->index_to_input[stvp->num_inputs] = attr; 11307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs++; 114f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 115f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 116f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 11707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Compute mapping of vertex program outputs to slots. 118f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 119f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 12007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell if ((stvp->Base.Base.OutputsWritten & (1 << attr)) == 0) { 12107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = ~0; 12207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 12307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell else { 12407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell unsigned slot = stvp->num_outputs++; 12507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 12607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = slot; 127f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 128f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 129f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 13007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 13107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 132f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 133f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 13407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 13507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 136f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 137f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 13807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 13907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 140f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 141f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 14207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 14307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 144f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 145f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 14607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 14707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 148f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 149f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 15007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 15107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 152f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 153f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 15407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 15507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 156f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 157f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 158f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 159f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 16007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 161f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX0: 162f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX1: 163f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX2: 164f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX3: 165f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX4: 166f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX5: 167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX6: 168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX7: 16907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 17007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0; 17107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 17207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 17507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr < VERT_RESULT_MAX); 17607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 17707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 - 17807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FRAG_ATTRIB_TEX0 + 17907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell attr - 18007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell VERT_RESULT_VAR0); 18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 182f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 183f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 184f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 18507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 186f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 187509d9eb686411254b24139012b7594e10a760b6cBrian Paul 18807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellstruct st_vp_varient * 18907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st, 19007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp, 19107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell const struct st_vp_varient_key *key) 19207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 19307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vp_varient *vpv = CALLOC_STRUCT(st_vp_varient); 19407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct pipe_context *pipe = st->pipe; 195a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 196a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 197a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_VERTEX ); 198a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell if (ureg == NULL) 199a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 200a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 201a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell error = 2024295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell st_translate_mesa_program(st->ctx, 2034295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_PROCESSOR_VERTEX, 204a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg, 2054295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &stvp->Base.Base, 2064295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* inputs */ 20707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs, 2084295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell stvp->input_to_index, 209b44b70dc114ddcfb4d359759928df4d7b9efaafbKeith Whitwell NULL, /* input semantic name */ 210b44b70dc114ddcfb4d359759928df4d7b9efaafbKeith Whitwell NULL, /* input semantic index */ 2114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell NULL, 2124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* outputs */ 21307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_outputs, 21407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output, 21507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name, 21607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index ); 21725b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 218a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell if (ret) 219a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell goto fail; 220a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 221a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell /* Edgeflags will be the last input: 222a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell */ 223a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell if (key.passthrough_edgeflags) { 224a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_MOV( ureg, 225a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_DECL_output( ureg, TGSI_SEMANTIC_EDGEFLAG, 0 ), 226a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_DECL_next_vs_input(ureg)); 227a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell } 228a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 229a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell tokens = ureg_get_tokens( ureg, NULL ); 230a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 231a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 23207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->state); 233f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 234b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { 235633e1133aeed04df650b97c8d25a041014fd6f5eBrian _mesa_print_program(&stvp->Base.Base); 236b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 237b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 238633e1133aeed04df650b97c8d25a041014fd6f5eBrian 239b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 24007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell tgsi_dump( vpv->state.tokens, 0 ); 241b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 242b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 24307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 24407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell return vpv; 245a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 246a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail: 247a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 248a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 250f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa fragment shader into a TGSI shader. 255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param inputMapping to map fragment program input registers to TGSI 256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * input slots 257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 258f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 259b456f1374fc958e53efc80ee38ef343f580c1d6bBrian Paulvoid 260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 261f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct st_fragment_program *stfp, 262339e7ec6805e6de8794514c0a935081b5d36d38fBrian const GLuint inputMapping[]) 263f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 264339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 265f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint outputMapping[FRAG_RESULT_MAX]; 266f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint defaultInputMapping[FRAG_ATTRIB_MAX]; 267f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint interpMode[16]; /* XXX size? */ 268f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint attr; 269e785f190f0d49f0367f7468c22b77962d0f14ea0Brian const GLbitfield inputsRead = stfp->Base.Base.InputsRead; 270a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 271e785f190f0d49f0367f7468c22b77962d0f14ea0Brian GLuint vslot = 0; 272f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 273fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint fs_num_inputs = 0; 274fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 275fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 276fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 277fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint fs_num_outputs = 0; 278fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 279e785f190f0d49f0367f7468c22b77962d0f14ea0Brian /* which vertex output goes to the first fragment input: */ 280e785f190f0d49f0367f7468c22b77962d0f14ea0Brian if (inputsRead & FRAG_BIT_WPOS) 281e785f190f0d49f0367f7468c22b77962d0f14ea0Brian vslot = 0; 282e785f190f0d49f0367f7468c22b77962d0f14ea0Brian else 283e785f190f0d49f0367f7468c22b77962d0f14ea0Brian vslot = 1; 284e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 285f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 286f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Convert Mesa program inputs to TGSI input register semantics. 287f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 288f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 289f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (inputsRead & (1 << attr)) { 290fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul const GLuint slot = fs_num_inputs; 291f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 292f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian defaultInputMapping[attr] = slot; 293f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 294ecd50ef58b034e604ff6b2fedbb0815953e510eaBrian stfp->input_map[slot] = vslot++; 295e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 296fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_inputs++; 297e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 298f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 299f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_WPOS: 300e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 301e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = 0; 302e785f190f0d49f0367f7468c22b77962d0f14ea0Brian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 303f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 304f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL0: 305e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 306e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = 0; 307f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 308f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 309f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL1: 310e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 311e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = 1; 312f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 313f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 3149d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul case FRAG_ATTRIB_FOGC: 3159d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 3169d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul stfp->input_semantic_index[slot] = 0; 3179d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 3189d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul break; 3199d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul case FRAG_ATTRIB_FACE: 3209d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FACE; 32107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stfp->input_semantic_index[slot] = 0; 3229d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 3239d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul break; 32407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 32507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* In most cases, there is nothing special about these 32607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * inputs, so adopt a convention to use the generic 32707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * semantic name and the mesa FRAG_ATTRIB_ number as the 32807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * index. 32907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * 33007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * All that is required is that the vertex shader labels 33107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * its own outputs similarly, and that the vertex shader 33207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * generates at least every output required by the 33307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * fragment shader plus fixed-function hardware (such as 33407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * BFC). 33507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * 33607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * There is no requirement that semantic indexes start at 33707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * zero or be restricted to a particular range -- nobody 33807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * should be building tables based on semantic index. 33907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell */ 340f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX0: 341f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX1: 342f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX2: 343f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX3: 344f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX4: 345f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX5: 346f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX6: 347f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX7: 34807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell case FRAG_ATTRIB_PNTC: 349f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_VAR0: 350f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 35107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Actually, let's try and zero-base this just for 35207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * readability of the generated TGSI. 35307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell */ 35407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr >= FRAG_ATTRIB_TEX0); 35507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stfp->input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0); 356e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 357f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 35807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 359f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 360f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 361f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 362f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 363f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 364bc139a19b00f8686caa8db7c56af2087f26e369aBrian * Semantics and mapping for outputs 365f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 366635c4c41bdf111462939da292d65328595d314e8Brian { 367635c4c41bdf111462939da292d65328595d314e8Brian uint numColors = 0; 3685606dfb572bf4b89b4882265924705bacc8c182bIan Romanick GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten; 369635c4c41bdf111462939da292d65328595d314e8Brian 370bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* if z is written, emit that first */ 3718d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul if (outputsWritten & (1 << FRAG_RESULT_DEPTH)) { 372fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 373fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index[fs_num_outputs] = 0; 3748d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 375fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 3768d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 377635c4c41bdf111462939da292d65328595d314e8Brian } 378635c4c41bdf111462939da292d65328595d314e8Brian 379bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handle remaning outputs (color) */ 380635c4c41bdf111462939da292d65328595d314e8Brian for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 381635c4c41bdf111462939da292d65328595d314e8Brian if (outputsWritten & (1 << attr)) { 382635c4c41bdf111462939da292d65328595d314e8Brian switch (attr) { 3838d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul case FRAG_RESULT_DEPTH: 384bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handled above */ 385635c4c41bdf111462939da292d65328595d314e8Brian assert(0); 386635c4c41bdf111462939da292d65328595d314e8Brian break; 387af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca default: 388af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca assert(attr == FRAG_RESULT_COLOR || 389af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX)); 390fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 391fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index[fs_num_outputs] = numColors; 392fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul outputMapping[attr] = fs_num_outputs; 393635c4c41bdf111462939da292d65328595d314e8Brian numColors++; 394635c4c41bdf111462939da292d65328595d314e8Brian break; 395635c4c41bdf111462939da292d65328595d314e8Brian } 396c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 397fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 398f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 399f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 400f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 401f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 402f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (!inputMapping) 403f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian inputMapping = defaultInputMapping; 404f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 405a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); 406a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell if (ureg == NULL) 407a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 408a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 409a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 4104295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell stfp->state.tokens = 4114295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell st_translate_mesa_program(st->ctx, 4124295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_PROCESSOR_FRAGMENT, 4134295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &stfp->Base.Base, 4144295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* inputs */ 4154295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell fs_num_inputs, 4164295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inputMapping, 4174295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell stfp->input_semantic_name, 4184295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell stfp->input_semantic_index, 4194295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell interpMode, 4204295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* outputs */ 4214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell fs_num_outputs, 4224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputMapping, 4234295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell fs_output_semantic_name, 4249953fe4cb48b02a0d75735b88173f0ed170a77f2Keith Whitwell fs_output_semantic_index ); 4254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 4264295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell stfp->driver_shader = pipe->create_fs_state(pipe, &stfp->state); 427f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 428b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) { 429633e1133aeed04df650b97c8d25a041014fd6f5eBrian _mesa_print_program(&stfp->Base.Base); 430b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 431b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 432633e1133aeed04df650b97c8d25a041014fd6f5eBrian 433b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 4344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell tgsi_dump( stfp->state.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 435b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 436b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 437f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 438f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 439678f80b347801d925c07a774faee1ed3f716de15Brian Paul 440678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 441678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 442678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 443678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 444678f80b347801d925c07a774faee1ed3f716de15Brian Paulst_print_shaders(GLcontext *ctx) 445678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 446678f80b347801d925c07a774faee1ed3f716de15Brian Paul struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; 447678f80b347801d925c07a774faee1ed3f716de15Brian Paul if (shProg) { 448678f80b347801d925c07a774faee1ed3f716de15Brian Paul GLuint i; 449678f80b347801d925c07a774faee1ed3f716de15Brian Paul for (i = 0; i < shProg->NumShaders; i++) { 450678f80b347801d925c07a774faee1ed3f716de15Brian Paul printf("GLSL shader %u of %u:\n", i, shProg->NumShaders); 451678f80b347801d925c07a774faee1ed3f716de15Brian Paul printf("%s\n", shProg->Shaders[i]->Source); 452678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 453678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 454678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 455