st_program.c revision ec2b92f98c2e7f161521b447cc1d9a36bce3707c
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" 36ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_print.h" 37ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/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_program.h" 48ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h" 49339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 50f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 518468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 528468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul 538468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/** 548468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations: 558468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */ 5607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid 5707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_vp_release_varients( struct st_context *st, 5807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp ) 5907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 6007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vp_varient *vpv; 6107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 6207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell for (vpv = stvp->varients; vpv; ) { 6307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vp_varient *next = vpv->next; 6407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 6507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell if (vpv->driver_shader) 6607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell cso_delete_vertex_shader(st->cso_context, vpv->driver_shader); 6707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 68d9f38e1a71f94b112b4ab288a7043dd2fc4a701dChia-I Wu#if FEATURE_feedback || FEATURE_rastpos 6907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell if (vpv->draw_shader) 7007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell draw_delete_vertex_shader( st->draw, vpv->draw_shader ); 71d9f38e1a71f94b112b4ab288a7043dd2fc4a701dChia-I Wu#endif 7207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 73b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul if (vpv->tgsi.tokens) 74b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul st_free_tokens(vpv->tgsi.tokens); 7507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 7607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FREE( vpv ); 7707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 7807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell vpv = next; 7907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 8007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 8107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->varients = NULL; 8207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 8307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 8407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 8507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 86f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 87f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 88f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader. 89e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping to map vertex program output registers (VERT_RESULT_x) 90e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * to TGSI output slots 91f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 92f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 93f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 94ac95fee4fffee77bb7bd798d094ed2e3a7c4019bBrianvoid 9507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st, 9607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp) 97f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 9807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell GLuint attr; 99c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 10007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs = 0; 10107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_outputs = 0; 102f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 103f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs if (stvp->Base.IsPositionInvariant) 104f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs _mesa_insert_mvp_code(st->ctx, &stvp->Base); 105f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs 106325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell assert(stvp->Base.Base.NumInstructions > 1); 107325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell 108f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 109f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of inputs, the mappings between VERT_ATTRIB_x 110f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * and TGSI generic input indexes, plus input attrib semantic info. 111f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 112f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 113f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.InputsRead & (1 << attr)) { 11407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->input_to_index[attr] = stvp->num_inputs; 11507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->index_to_input[stvp->num_inputs] = attr; 11607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->num_inputs++; 117f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 118f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 11950caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger /* bit of a hack, presetup potentially unused edgeflag input */ 12050caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs; 12150caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG; 122f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 12307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Compute mapping of vertex program outputs to slots. 124f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 125f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 126b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if ((stvp->Base.Base.OutputsWritten & BITFIELD64_BIT(attr)) == 0) { 12707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = ~0; 12807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell } 12907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell else { 13007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell unsigned slot = stvp->num_outputs++; 13107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 13207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output[attr] = slot; 133f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 134f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 135f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 13607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 13707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 138f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 139f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 14007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 14107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 142f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 143f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 14407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 14507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 146f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 147f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 14807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 14907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 150f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 151f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 15207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 15307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 1; 154f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 155f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 15607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 15707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 158f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 159f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 16007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 16107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = 0; 162f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 163f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 164f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 165f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 16607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX0: 168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX1: 169f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX2: 170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX3: 171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX4: 172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX5: 173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX6: 174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX7: 17507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 17607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0; 17707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 17807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 179f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 180f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr < VERT_RESULT_MAX); 18207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 18307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 - 18407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell FRAG_ATTRIB_TEX0 + 18507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell attr - 18607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell VERT_RESULT_VAR0); 18707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 188f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 189f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 190f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 191890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger /* similar hack to above, presetup potentially unused edgeflag output */ 192890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs; 193890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG; 194890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_index[stvp->num_outputs] = 0; 19507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell} 196f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 197509d9eb686411254b24139012b7594e10a760b6cBrian Paul 19807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellstruct st_vp_varient * 19907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st, 20007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vertex_program *stvp, 20107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell const struct st_vp_varient_key *key) 20207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{ 20307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct st_vp_varient *vpv = CALLOC_STRUCT(st_vp_varient); 20407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell struct pipe_context *pipe = st->pipe; 205a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 206a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger enum pipe_error error; 207890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger unsigned num_outputs; 208a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 209a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_VERTEX ); 210b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee if (ureg == NULL) { 211b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee FREE(vpv); 212a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 213b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee } 214a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 21550caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger vpv->num_inputs = stvp->num_inputs; 216890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs = stvp->num_outputs; 217890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger if (key->passthrough_edgeflags) { 218890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger vpv->num_inputs++; 219890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs++; 220890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger } 221a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 222ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul if (ST_DEBUG & DEBUG_MESA) { 223ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program(&stvp->Base.Base); 224ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program_parameters(st->ctx, &stvp->Base.Base); 225ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul debug_printf("\n"); 226ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul } 227ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul 228a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell error = 2294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell st_translate_mesa_program(st->ctx, 2304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_PROCESSOR_VERTEX, 231a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg, 2324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &stvp->Base.Base, 2334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* inputs */ 234890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger vpv->num_inputs, 2354295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell stvp->input_to_index, 236b44b70dc114ddcfb4d359759928df4d7b9efaafbKeith Whitwell NULL, /* input semantic name */ 237b44b70dc114ddcfb4d359759928df4d7b9efaafbKeith Whitwell NULL, /* input semantic index */ 2384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell NULL, 2394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* outputs */ 240890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger num_outputs, 24107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->result_to_output, 24207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell stvp->output_semantic_name, 243890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger stvp->output_semantic_index, 244890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger key->passthrough_edgeflags ); 24525b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 246a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger if (error) 247a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell goto fail; 248a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 249b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 250b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul if (!vpv->tgsi.tokens) 2519d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger goto fail; 2529d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 253a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 25425b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 255b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi); 256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 257b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 258b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( vpv->tgsi.tokens, 0 ); 259b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 260b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 26107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 26207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell return vpv; 263a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 264a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail: 2659d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__); 2669d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger _mesa_print_program(&stvp->Base.Base); 2679d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger debug_assert(0); 2689d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger 269a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg_destroy( ureg ); 270a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell return NULL; 271f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 272f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 273f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 274f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 275f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 276f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa fragment shader into a TGSI shader. 277f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 278f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 279b456f1374fc958e53efc80ee38ef343f580c1d6bBrian Paulvoid 280f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 281e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell struct st_fragment_program *stfp ) 282f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 283339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 284f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint outputMapping[FRAG_RESULT_MAX]; 285e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell GLuint inputMapping[FRAG_ATTRIB_MAX]; 286e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */ 287f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint attr; 288a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger enum pipe_error error; 289e785f190f0d49f0367f7468c22b77962d0f14ea0Brian const GLbitfield inputsRead = stfp->Base.Base.InputsRead; 290a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell struct ureg_program *ureg; 291f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 292e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 293e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 294fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint fs_num_inputs = 0; 295fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 296fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 297fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 298fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint fs_num_outputs = 0; 299fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 300f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 301f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Convert Mesa program inputs to TGSI input register semantics. 302f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 303f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 304f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (inputsRead & (1 << attr)) { 305e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell const GLuint slot = fs_num_inputs++; 306f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 307e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell inputMapping[attr] = slot; 308e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 309f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 310f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_WPOS: 311e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 312e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 0; 313e785f190f0d49f0367f7468c22b77962d0f14ea0Brian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 314f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 315f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL0: 316e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 317e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 0; 318f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 319f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 320f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL1: 321e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 322e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 1; 323f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 324f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 3259d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul case FRAG_ATTRIB_FOGC: 326e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 327e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 0; 3289d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 3299d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul break; 3309d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul case FRAG_ATTRIB_FACE: 331e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_FACE; 332e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 0; 3339d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul interpMode[slot] = TGSI_INTERPOLATE_CONSTANT; 3349d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul break; 335f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul case FRAG_ATTRIB_PNTC: 336f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul /* This is a hack. We really need a new semantic label for 337f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul * point coord. The draw module needs to know which fragment 338f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul * shader input is the point coord attribute so that it can set 339f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul * up the right vertex attribute values. 340f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul */ 341e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 342e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = 0; 343f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 344f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul break; 34507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell 34607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* In most cases, there is nothing special about these 34707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * inputs, so adopt a convention to use the generic 34807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * semantic name and the mesa FRAG_ATTRIB_ number as the 34907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * index. 35007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * 35107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * All that is required is that the vertex shader labels 35207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * its own outputs similarly, and that the vertex shader 35307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * generates at least every output required by the 35407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * fragment shader plus fixed-function hardware (such as 35507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * BFC). 35607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * 35707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * There is no requirement that semantic indexes start at 35807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * zero or be restricted to a particular range -- nobody 35907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * should be building tables based on semantic index. 36007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell */ 361f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX0: 362f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX1: 363f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX2: 364f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX3: 365f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX4: 366f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX5: 367f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX6: 368f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX7: 369f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_VAR0: 370f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 37107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell /* Actually, let's try and zero-base this just for 37207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell * readability of the generated TGSI. 37307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell */ 37407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell assert(attr >= FRAG_ATTRIB_TEX0); 375e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0); 376e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 377dd98a979b6f565f0b0060403fbfad36005278802Brian Paul interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 37807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell break; 379f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 380f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 381e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell else { 382e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell inputMapping[attr] = -1; 383e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell } 384f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 385f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 386f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 387bc139a19b00f8686caa8db7c56af2087f26e369aBrian * Semantics and mapping for outputs 388f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 389635c4c41bdf111462939da292d65328595d314e8Brian { 390635c4c41bdf111462939da292d65328595d314e8Brian uint numColors = 0; 3915606dfb572bf4b89b4882265924705bacc8c182bIan Romanick GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten; 392635c4c41bdf111462939da292d65328595d314e8Brian 393bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* if z is written, emit that first */ 394b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) { 395fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 396fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index[fs_num_outputs] = 0; 3978d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 398fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 3998d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 400635c4c41bdf111462939da292d65328595d314e8Brian } 401635c4c41bdf111462939da292d65328595d314e8Brian 402bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handle remaning outputs (color) */ 403635c4c41bdf111462939da292d65328595d314e8Brian for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 404b46750d601655c39ccb967ae525d4edcbb9fb9d2Ben Skeggs if (outputsWritten & BITFIELD64_BIT(attr)) { 405635c4c41bdf111462939da292d65328595d314e8Brian switch (attr) { 4068d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul case FRAG_RESULT_DEPTH: 407bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handled above */ 408635c4c41bdf111462939da292d65328595d314e8Brian assert(0); 409635c4c41bdf111462939da292d65328595d314e8Brian break; 410af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca default: 411af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca assert(attr == FRAG_RESULT_COLOR || 412af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX)); 413fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 414fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index[fs_num_outputs] = numColors; 415fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul outputMapping[attr] = fs_num_outputs; 416635c4c41bdf111462939da292d65328595d314e8Brian numColors++; 417635c4c41bdf111462939da292d65328595d314e8Brian break; 418635c4c41bdf111462939da292d65328595d314e8Brian } 419c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 420fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 421f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 422f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 423f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 424f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 425a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT ); 426a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell if (ureg == NULL) 427a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger return; 428a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 429ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul if (ST_DEBUG & DEBUG_MESA) { 430ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program(&stfp->Base.Base); 431ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul _mesa_print_program_parameters(st->ctx, &stfp->Base.Base); 432ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul debug_printf("\n"); 433ce0844b44cb3924323ed1fd2b75cda4dbd0013c7Brian Paul } 434a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell 435a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger error = 4364295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell st_translate_mesa_program(st->ctx, 4374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell TGSI_PROCESSOR_FRAGMENT, 438a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger ureg, 4394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell &stfp->Base.Base, 4404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* inputs */ 4414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell fs_num_inputs, 4424295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell inputMapping, 443e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_name, 444e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul input_semantic_index, 4454295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell interpMode, 4464295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell /* outputs */ 4474295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell fs_num_outputs, 4484295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell outputMapping, 4494295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell fs_output_semantic_name, 450890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger fs_output_semantic_index, FALSE ); 4514295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell 452b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL ); 453a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger ureg_destroy( ureg ); 454b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul stfp->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi); 455f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 456b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell if (ST_DEBUG & DEBUG_TGSI) { 457b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 458b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell debug_printf("\n"); 459b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell } 460f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 461f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 462678f80b347801d925c07a774faee1ed3f716de15Brian Paul 463678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 464678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 465678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 466678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 467678f80b347801d925c07a774faee1ed3f716de15Brian Paulst_print_shaders(GLcontext *ctx) 468678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 469678f80b347801d925c07a774faee1ed3f716de15Brian Paul struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; 470678f80b347801d925c07a774faee1ed3f716de15Brian Paul if (shProg) { 471678f80b347801d925c07a774faee1ed3f716de15Brian Paul GLuint i; 472678f80b347801d925c07a774faee1ed3f716de15Brian Paul for (i = 0; i < shProg->NumShaders; i++) { 473678f80b347801d925c07a774faee1ed3f716de15Brian Paul printf("GLSL shader %u of %u:\n", i, shProg->NumShaders); 474678f80b347801d925c07a774faee1ed3f716de15Brian Paul printf("%s\n", shProg->Shaders[i]->Source); 475678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 476678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 477678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 478