st_program.c revision 509d9eb686411254b24139012b7594e10a760b6c
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 45f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h" 46f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_atom.h" 47f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h" 48ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h" 49339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h" 50f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 51f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 52d37795c45334010c70b2e1c23fca0e49ff607a6eBrian Paul#define ST_MAX_SHADER_TOKENS (8 * 1024) 5300eb309c31692d29b01568b0b45f5066928b9107Brian Paul 5400eb309c31692d29b01568b0b45f5066928b9107Brian Paul 55d0a63de37888966591735a190d69b0333d31bef5Brian#define TGSI_DEBUG 0 56f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 57f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 58f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 59f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader. 60e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping to map vertex program output registers (VERT_RESULT_x) 61e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * to TGSI output slots 62f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 63f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 64f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 65ac95fee4fffee77bb7bd798d094ed2e3a7c4019bBrianvoid 66f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_vertex_program(struct st_context *st, 67f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct st_vertex_program *stvp, 68e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul const GLuint outputMapping[], 69e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul const ubyte *outputSemanticName, 70e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul const ubyte *outputSemanticIndex) 71f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 72339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 7342678dba941b5a734e6aa03b530653d9c5341a70José Fonseca struct tgsi_token *tokens; 74f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint defaultOutputMapping[VERT_RESULT_MAX]; 75f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct pipe_shader_state vs; 76f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint attr, i; 77633e1133aeed04df650b97c8d25a041014fd6f5eBrian GLuint num_generic = 0; 78339e7ec6805e6de8794514c0a935081b5d36d38fBrian GLuint num_tokens; 79f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 80fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte vs_input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 81fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte vs_input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 82fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint vs_num_inputs = 0; 83fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 84fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte vs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 85fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte vs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 86fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint vs_num_outputs = 0; 87fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 88c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul GLbitfield input_flags[MAX_PROGRAM_INPUTS]; 89c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul GLbitfield output_flags[MAX_PROGRAM_OUTPUTS]; 90c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 9142678dba941b5a734e6aa03b530653d9c5341a70José Fonseca tokens = (struct tgsi_token *)MALLOC(ST_MAX_SHADER_TOKENS * sizeof *tokens); 9242678dba941b5a734e6aa03b530653d9c5341a70José Fonseca if(!tokens) { 9342678dba941b5a734e6aa03b530653d9c5341a70José Fonseca /* FIXME: propagate error to the caller */ 9442678dba941b5a734e6aa03b530653d9c5341a70José Fonseca assert(0); 9542678dba941b5a734e6aa03b530653d9c5341a70José Fonseca return; 9642678dba941b5a734e6aa03b530653d9c5341a70José Fonseca } 9742678dba941b5a734e6aa03b530653d9c5341a70José Fonseca 98f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian memset(&vs, 0, sizeof(vs)); 99c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul memset(input_flags, 0, sizeof(input_flags)); 100c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul memset(output_flags, 0, sizeof(output_flags)); 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)) { 111fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul const GLuint slot = vs_num_inputs; 112f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 113fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_num_inputs++; 114f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 115f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian stvp->input_to_index[attr] = slot; 116f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian stvp->index_to_input[slot] = attr; 117f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 118f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 119f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_POS: 120fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 121fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = 0; 122f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 123f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_WEIGHT: 124f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* fall-through */ 125f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_NORMAL: 126f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* just label as a generic */ 127fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 128fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = 0; 129f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 130f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_COLOR0: 131fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 132fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = 0; 133f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 134f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_COLOR1: 135fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 136fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = 1; 137f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 138f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_FOG: 139fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 140fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = 0; 141f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 142d378f7b3dfda3b549e4b02380e492671cc34bb59Brian Paul case VERT_ATTRIB_POINT_SIZE: 143d378f7b3dfda3b549e4b02380e492671cc34bb59Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 144d378f7b3dfda3b549e4b02380e492671cc34bb59Brian Paul vs_input_semantic_index[slot] = 0; 145d378f7b3dfda3b549e4b02380e492671cc34bb59Brian Paul break; 146f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX0: 147f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX1: 148f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX2: 149f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX3: 150f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX4: 151f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX5: 152f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX6: 153f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX7: 154fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 155fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = num_generic++; 156f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 157f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC0: 158f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC1: 159f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC2: 160f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC3: 161f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC4: 162f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC5: 163f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC6: 164f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC7: 165afc0c59dbd7f89d914763fd78701461f22c00450Keith Whitwell case VERT_ATTRIB_GENERIC8: 166afc0c59dbd7f89d914763fd78701461f22c00450Keith Whitwell case VERT_ATTRIB_GENERIC9: 167afc0c59dbd7f89d914763fd78701461f22c00450Keith Whitwell case VERT_ATTRIB_GENERIC10: 168afc0c59dbd7f89d914763fd78701461f22c00450Keith Whitwell case VERT_ATTRIB_GENERIC11: 169afc0c59dbd7f89d914763fd78701461f22c00450Keith Whitwell case VERT_ATTRIB_GENERIC12: 170afc0c59dbd7f89d914763fd78701461f22c00450Keith Whitwell case VERT_ATTRIB_GENERIC13: 171afc0c59dbd7f89d914763fd78701461f22c00450Keith Whitwell case VERT_ATTRIB_GENERIC14: 172afc0c59dbd7f89d914763fd78701461f22c00450Keith Whitwell case VERT_ATTRIB_GENERIC15: 173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(attr < VERT_ATTRIB_MAX); 174fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 175fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = num_generic++; 176f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 177f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 178f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 179f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 180c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 181c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul input_flags[slot] = stvp->Base.Base.InputFlags[attr]; 182f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 183f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 184f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 185e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul#if 0 186e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul if (outputMapping && outputSemanticName) { 187e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul printf("VERT_RESULT written out_slot semantic_name semantic_index\n"); 188e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 189e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul printf(" %-2d %c %3d %2d %2d\n", 190e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul attr, 191e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul ((stvp->Base.Base.OutputsWritten & (1 << attr)) ? 'Y' : ' '), 192e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul outputMapping[attr], 193e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul outputSemanticName[attr], 194e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul outputSemanticIndex[attr]); 195e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul } 196e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul } 197e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul#endif 198e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul 199f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* initialize output semantics to defaults */ 200f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 201fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 202fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[i] = 0; 203c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul output_flags[i] = 0x0; 204f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 205f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 206633e1133aeed04df650b97c8d25a041014fd6f5eBrian num_generic = 0; 207f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 208f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of outputs, the (default) output register 209f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * mapping and the semantic information for each output. 210f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 211f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 212f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.OutputsWritten & (1 << attr)) { 213f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint slot; 214f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 215a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul /* XXX 216a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul * Pass in the fragment program's input's semantic info. 217a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul * Use the generic semantic indexes from there, instead of 218a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul * guessing below. 219a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul */ 220a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul 221f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (outputMapping) { 222f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian slot = outputMapping[attr]; 223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(slot != ~0); 224f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 225f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian else { 226fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul slot = vs_num_outputs; 227fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_num_outputs++; 228f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian defaultOutputMapping[attr] = slot; 229f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 230f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 232f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 233c61b32777b5b3b138c8bf5fac7e7e70ec084c8c1Brian assert(slot == 0); 234fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 235fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 0; 236f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 237f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 238fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 239fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 0; 240f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 241f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 242fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 243fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 1; 244f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 245f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 246fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 247fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 0; 248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 250fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 251fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 1; 252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 254fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 255fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 0; 256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 258fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 259fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 0; 260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 261f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 262f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 263f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 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: 272e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul /* fall-through */ 273f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 274f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* fall-through */ 275f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 276e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul if (outputSemanticName) { 277e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul /* use provided semantic into */ 278e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul assert(outputSemanticName[attr] != TGSI_SEMANTIC_COUNT); 279e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul vs_output_semantic_name[slot] = outputSemanticName[attr]; 280e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul vs_output_semantic_index[slot] = outputSemanticIndex[attr]; 281e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul } 282e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul else { 283e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul /* use default semantic info */ 284e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 285e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul vs_output_semantic_index[slot] = num_generic++; 286e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul } 287f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 288c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 289c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul output_flags[slot] = stvp->Base.Base.OutputFlags[attr]; 290f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 291f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 292f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 293f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (outputMapping) { 294fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul /* find max output slot referenced to compute vs_num_outputs */ 295f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint maxSlot = 0; 296f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 297f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot) 298f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian maxSlot = outputMapping[attr]; 299f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 300fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_num_outputs = maxSlot + 1; 301f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 302f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian else { 303f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian outputMapping = defaultOutputMapping; 304f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 305f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 306509d9eb686411254b24139012b7594e10a760b6cBrian Paul#if 0 /* debug */ 307509d9eb686411254b24139012b7594e10a760b6cBrian Paul { 308509d9eb686411254b24139012b7594e10a760b6cBrian Paul GLuint i; 309509d9eb686411254b24139012b7594e10a760b6cBrian Paul printf("outputMapping? %d\n", outputMapping ? 1 : 0); 310509d9eb686411254b24139012b7594e10a760b6cBrian Paul if (outputMapping) { 311509d9eb686411254b24139012b7594e10a760b6cBrian Paul printf("attr -> slot\n"); 312509d9eb686411254b24139012b7594e10a760b6cBrian Paul for (i = 0; i < 16; i++) { 313509d9eb686411254b24139012b7594e10a760b6cBrian Paul printf(" %2d %3d\n", i, outputMapping[i]); 314509d9eb686411254b24139012b7594e10a760b6cBrian Paul } 315509d9eb686411254b24139012b7594e10a760b6cBrian Paul } 316509d9eb686411254b24139012b7594e10a760b6cBrian Paul printf("slot sem_name sem_index\n"); 317509d9eb686411254b24139012b7594e10a760b6cBrian Paul for (i = 0; i < vs_num_outputs; i++) { 318509d9eb686411254b24139012b7594e10a760b6cBrian Paul printf(" %2d %d %d\n", 319509d9eb686411254b24139012b7594e10a760b6cBrian Paul i, 320509d9eb686411254b24139012b7594e10a760b6cBrian Paul vs_output_semantic_name[i], 321509d9eb686411254b24139012b7594e10a760b6cBrian Paul vs_output_semantic_index[i]); 322509d9eb686411254b24139012b7594e10a760b6cBrian Paul } 323509d9eb686411254b24139012b7594e10a760b6cBrian Paul } 324509d9eb686411254b24139012b7594e10a760b6cBrian Paul#endif 325509d9eb686411254b24139012b7594e10a760b6cBrian Paul 326a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian /* free old shader state, if any */ 327a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian if (stvp->state.tokens) { 3281a2f4dd8768703fbc1b2a0d5be342345644805b4Brian Paul _mesa_free((void *) stvp->state.tokens); 329a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian stvp->state.tokens = NULL; 330a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian } 331a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian if (stvp->driver_shader) { 332a770d40c3d4977e2c134661b5d8facaea446b6eaBrian Paul cso_delete_vertex_shader(st->cso_context, stvp->driver_shader); 333a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian stvp->driver_shader = NULL; 334a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian } 335a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 336f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* XXX: fix static allocation of tokens: 337f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 338d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul num_tokens = st_translate_mesa_program(st->ctx, 339d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul TGSI_PROCESSOR_VERTEX, 340c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul &stvp->Base.Base, 341c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul /* inputs */ 342c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul vs_num_inputs, 343c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul stvp->input_to_index, 344c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul vs_input_semantic_name, 345c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul vs_input_semantic_index, 346c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul NULL, 347c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul input_flags, 348c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul /* outputs */ 349c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul vs_num_outputs, 350c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul outputMapping, 351c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul vs_output_semantic_name, 352c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul vs_output_semantic_index, 353c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul output_flags, 354c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul /* tokenized result */ 355c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul tokens, ST_MAX_SHADER_TOKENS); 356f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 35700eb309c31692d29b01568b0b45f5066928b9107Brian Paul assert(num_tokens < ST_MAX_SHADER_TOKENS); 35800eb309c31692d29b01568b0b45f5066928b9107Brian Paul 359339e7ec6805e6de8794514c0a935081b5d36d38fBrian vs.tokens = (struct tgsi_token *) 36042678dba941b5a734e6aa03b530653d9c5341a70José Fonseca _mesa_realloc(tokens, 36142678dba941b5a734e6aa03b530653d9c5341a70José Fonseca ST_MAX_SHADER_TOKENS * sizeof *tokens, 36242678dba941b5a734e6aa03b530653d9c5341a70José Fonseca num_tokens * sizeof *tokens); 36325b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 364fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul stvp->num_inputs = vs_num_inputs; 365339e7ec6805e6de8794514c0a935081b5d36d38fBrian stvp->state = vs; /* struct copy */ 366339e7ec6805e6de8794514c0a935081b5d36d38fBrian stvp->driver_shader = pipe->create_vs_state(pipe, &vs); 367f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 368633e1133aeed04df650b97c8d25a041014fd6f5eBrian if (0) 369633e1133aeed04df650b97c8d25a041014fd6f5eBrian _mesa_print_program(&stvp->Base.Base); 370633e1133aeed04df650b97c8d25a041014fd6f5eBrian 371f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (TGSI_DEBUG) 372339e7ec6805e6de8794514c0a935081b5d36d38fBrian tgsi_dump( vs.tokens, 0 ); 373f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 374f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 375f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 376f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 377f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 378f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa fragment shader into a TGSI shader. 379f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param inputMapping to map fragment program input registers to TGSI 380f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * input slots 381f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 382f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 383f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 384b456f1374fc958e53efc80ee38ef343f580c1d6bBrian Paulvoid 385f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 386f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct st_fragment_program *stfp, 387339e7ec6805e6de8794514c0a935081b5d36d38fBrian const GLuint inputMapping[]) 388f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 389339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 39042678dba941b5a734e6aa03b530653d9c5341a70José Fonseca struct tgsi_token *tokens; 391f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint outputMapping[FRAG_RESULT_MAX]; 392f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint defaultInputMapping[FRAG_ATTRIB_MAX]; 393f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct pipe_shader_state fs; 394f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint interpMode[16]; /* XXX size? */ 395f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint attr; 396e785f190f0d49f0367f7468c22b77962d0f14ea0Brian const GLbitfield inputsRead = stfp->Base.Base.InputsRead; 397e785f190f0d49f0367f7468c22b77962d0f14ea0Brian GLuint vslot = 0; 398633e1133aeed04df650b97c8d25a041014fd6f5eBrian GLuint num_generic = 0; 399339e7ec6805e6de8794514c0a935081b5d36d38fBrian GLuint num_tokens; 400f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 401fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint fs_num_inputs = 0; 402fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 403fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 404fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 405fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint fs_num_outputs = 0; 406fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 407c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul GLbitfield input_flags[MAX_PROGRAM_INPUTS]; 408c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul GLbitfield output_flags[MAX_PROGRAM_OUTPUTS]; 409c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 41042678dba941b5a734e6aa03b530653d9c5341a70José Fonseca tokens = (struct tgsi_token *)MALLOC(ST_MAX_SHADER_TOKENS * sizeof *tokens); 41142678dba941b5a734e6aa03b530653d9c5341a70José Fonseca if(!tokens) { 41242678dba941b5a734e6aa03b530653d9c5341a70José Fonseca /* FIXME: propagate error to the caller */ 41342678dba941b5a734e6aa03b530653d9c5341a70José Fonseca assert(0); 41442678dba941b5a734e6aa03b530653d9c5341a70José Fonseca return; 41542678dba941b5a734e6aa03b530653d9c5341a70José Fonseca } 41642678dba941b5a734e6aa03b530653d9c5341a70José Fonseca 417f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian memset(&fs, 0, sizeof(fs)); 418c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul memset(input_flags, 0, sizeof(input_flags)); 419c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul memset(output_flags, 0, sizeof(output_flags)); 420f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 421e785f190f0d49f0367f7468c22b77962d0f14ea0Brian /* which vertex output goes to the first fragment input: */ 422e785f190f0d49f0367f7468c22b77962d0f14ea0Brian if (inputsRead & FRAG_BIT_WPOS) 423e785f190f0d49f0367f7468c22b77962d0f14ea0Brian vslot = 0; 424e785f190f0d49f0367f7468c22b77962d0f14ea0Brian else 425e785f190f0d49f0367f7468c22b77962d0f14ea0Brian vslot = 1; 426e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 427f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 428f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Convert Mesa program inputs to TGSI input register semantics. 429f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 430f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 431f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (inputsRead & (1 << attr)) { 432fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul const GLuint slot = fs_num_inputs; 433f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 434f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian defaultInputMapping[attr] = slot; 435f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 436ecd50ef58b034e604ff6b2fedbb0815953e510eaBrian stfp->input_map[slot] = vslot++; 437e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 438fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_inputs++; 439e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 440f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 441f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_WPOS: 442e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 443e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = 0; 444e785f190f0d49f0367f7468c22b77962d0f14ea0Brian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 445f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 446f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL0: 447e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 448e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = 0; 449f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 450f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 451f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL1: 452e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 453e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = 1; 454f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 455f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 456f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_FOGC: 457a97c846d613c3d7ec962ee095fd8282fa3b84eeaAlan Hourihane if (stfp->Base.UsesPointCoord) { 4584ee8d1ad679ea8540e91616933a880cdb3836a19Brian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 459a97c846d613c3d7ec962ee095fd8282fa3b84eeaAlan Hourihane stfp->input_semantic_index[slot] = num_generic++; 460a97c846d613c3d7ec962ee095fd8282fa3b84eeaAlan Hourihane } else { 4614ee8d1ad679ea8540e91616933a880cdb3836a19Brian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 462a97c846d613c3d7ec962ee095fd8282fa3b84eeaAlan Hourihane stfp->input_semantic_index[slot] = 0; 463a97c846d613c3d7ec962ee095fd8282fa3b84eeaAlan Hourihane } 464f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 465f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 466f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX0: 467f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX1: 468f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX2: 469f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX3: 470f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX4: 471f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX5: 472f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX6: 473f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX7: 474e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 475e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = num_generic++; 476f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 477f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 478f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_VAR0: 479f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* fall-through */ 480f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 481e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 482e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = num_generic++; 483f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 484f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 485c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 486c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul input_flags[slot] = stfp->Base.Base.InputFlags[attr]; 487f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 488f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 489f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 490f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 491bc139a19b00f8686caa8db7c56af2087f26e369aBrian * Semantics and mapping for outputs 492f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 493635c4c41bdf111462939da292d65328595d314e8Brian { 494635c4c41bdf111462939da292d65328595d314e8Brian uint numColors = 0; 495635c4c41bdf111462939da292d65328595d314e8Brian GLbitfield outputsWritten = stfp->Base.Base.OutputsWritten; 496635c4c41bdf111462939da292d65328595d314e8Brian 497bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* if z is written, emit that first */ 4988d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul if (outputsWritten & (1 << FRAG_RESULT_DEPTH)) { 499fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 500fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index[fs_num_outputs] = 0; 5018d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs; 502fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 5038d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul outputsWritten &= ~(1 << FRAG_RESULT_DEPTH); 504635c4c41bdf111462939da292d65328595d314e8Brian } 505635c4c41bdf111462939da292d65328595d314e8Brian 506bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handle remaning outputs (color) */ 507635c4c41bdf111462939da292d65328595d314e8Brian for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 508635c4c41bdf111462939da292d65328595d314e8Brian if (outputsWritten & (1 << attr)) { 509635c4c41bdf111462939da292d65328595d314e8Brian switch (attr) { 5108d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul case FRAG_RESULT_DEPTH: 511bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handled above */ 512635c4c41bdf111462939da292d65328595d314e8Brian assert(0); 513635c4c41bdf111462939da292d65328595d314e8Brian break; 514af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca default: 515af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca assert(attr == FRAG_RESULT_COLOR || 516af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX)); 517fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 518fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index[fs_num_outputs] = numColors; 519fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul outputMapping[attr] = fs_num_outputs; 520635c4c41bdf111462939da292d65328595d314e8Brian numColors++; 521635c4c41bdf111462939da292d65328595d314e8Brian break; 522635c4c41bdf111462939da292d65328595d314e8Brian } 523c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 524c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul output_flags[fs_num_outputs] = stfp->Base.Base.OutputFlags[attr]; 525c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul 526fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 527f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 528f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 529f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 530f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 531f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (!inputMapping) 532f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian inputMapping = defaultInputMapping; 533f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 534f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* XXX: fix static allocation of tokens: 535f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 536d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul num_tokens = st_translate_mesa_program(st->ctx, 537d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul TGSI_PROCESSOR_FRAGMENT, 538c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul &stfp->Base.Base, 539c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul /* inputs */ 540c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul fs_num_inputs, 541c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul inputMapping, 542c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul stfp->input_semantic_name, 543c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul stfp->input_semantic_index, 544c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul interpMode, 545c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul input_flags, 546c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul /* outputs */ 547c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul fs_num_outputs, 548c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul outputMapping, 549c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul fs_output_semantic_name, 550c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul fs_output_semantic_index, 551c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul output_flags, 552c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul /* tokenized result */ 553c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul tokens, ST_MAX_SHADER_TOKENS); 554f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 55500eb309c31692d29b01568b0b45f5066928b9107Brian Paul assert(num_tokens < ST_MAX_SHADER_TOKENS); 55600eb309c31692d29b01568b0b45f5066928b9107Brian Paul 557339e7ec6805e6de8794514c0a935081b5d36d38fBrian fs.tokens = (struct tgsi_token *) 55842678dba941b5a734e6aa03b530653d9c5341a70José Fonseca _mesa_realloc(tokens, 55942678dba941b5a734e6aa03b530653d9c5341a70José Fonseca ST_MAX_SHADER_TOKENS * sizeof *tokens, 56042678dba941b5a734e6aa03b530653d9c5341a70José Fonseca num_tokens * sizeof *tokens); 5617ff0df6c2bf11a36bc6101e361484bde57595a79Zack Rusin 562339e7ec6805e6de8794514c0a935081b5d36d38fBrian stfp->state = fs; /* struct copy */ 563339e7ec6805e6de8794514c0a935081b5d36d38fBrian stfp->driver_shader = pipe->create_fs_state(pipe, &fs); 564f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 565633e1133aeed04df650b97c8d25a041014fd6f5eBrian if (0) 566633e1133aeed04df650b97c8d25a041014fd6f5eBrian _mesa_print_program(&stfp->Base.Base); 567633e1133aeed04df650b97c8d25a041014fd6f5eBrian 568f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (TGSI_DEBUG) 569339e7ec6805e6de8794514c0a935081b5d36d38fBrian tgsi_dump( fs.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 570f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 571f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 572678f80b347801d925c07a774faee1ed3f716de15Brian Paul 573678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 574678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 575678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 576678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 577678f80b347801d925c07a774faee1ed3f716de15Brian Paulst_print_shaders(GLcontext *ctx) 578678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 579678f80b347801d925c07a774faee1ed3f716de15Brian Paul struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; 580678f80b347801d925c07a774faee1ed3f716de15Brian Paul if (shProg) { 581678f80b347801d925c07a774faee1ed3f716de15Brian Paul GLuint i; 582678f80b347801d925c07a774faee1ed3f716de15Brian Paul for (i = 0; i < shProg->NumShaders; i++) { 583678f80b347801d925c07a774faee1ed3f716de15Brian Paul printf("GLSL shader %u of %u:\n", i, shProg->NumShaders); 584678f80b347801d925c07a774faee1ed3f716de15Brian Paul printf("%s\n", shProg->Shaders[i]->Source); 585678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 586678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 587678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 588