st_program.c revision 678f80b347801d925c07a774faee1ed3f716de15
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 5200eb309c31692d29b01568b0b45f5066928b9107Brian Paul#define ST_MAX_SHADER_TOKENS 4096 5300eb309c31692d29b01568b0b45f5066928b9107Brian Paul 5400eb309c31692d29b01568b0b45f5066928b9107Brian Paul 55d0a63de37888966591735a190d69b0333d31bef5Brian#define TGSI_DEBUG 0 56f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 57f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 584f25420bdd834e81a3e22733304efc5261c2998aBrian Paul/** XXX we should use the version of this from u_memory.h but including 59339e7ec6805e6de8794514c0a935081b5d36d38fBrian * that header causes symbol collisions. 60339e7ec6805e6de8794514c0a935081b5d36d38fBrian */ 61339e7ec6805e6de8794514c0a935081b5d36d38fBrianstatic INLINE void * 62339e7ec6805e6de8794514c0a935081b5d36d38fBrianmem_dup(const void *src, uint size) 63339e7ec6805e6de8794514c0a935081b5d36d38fBrian{ 64339e7ec6805e6de8794514c0a935081b5d36d38fBrian void *dup = MALLOC(size); 65339e7ec6805e6de8794514c0a935081b5d36d38fBrian if (dup) 66339e7ec6805e6de8794514c0a935081b5d36d38fBrian memcpy(dup, src, size); 67339e7ec6805e6de8794514c0a935081b5d36d38fBrian return dup; 68339e7ec6805e6de8794514c0a935081b5d36d38fBrian} 69339e7ec6805e6de8794514c0a935081b5d36d38fBrian 70339e7ec6805e6de8794514c0a935081b5d36d38fBrian 71339e7ec6805e6de8794514c0a935081b5d36d38fBrian 72f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 73f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader. 74e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping to map vertex program output registers (VERT_RESULT_x) 75e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * to TGSI output slots 76f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 77f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 78f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 79ac95fee4fffee77bb7bd798d094ed2e3a7c4019bBrianvoid 80f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_vertex_program(struct st_context *st, 81f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct st_vertex_program *stvp, 82e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul const GLuint outputMapping[], 83e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul const ubyte *outputSemanticName, 84e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul const ubyte *outputSemanticIndex) 85f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 86339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 87339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct tgsi_token tokens[ST_MAX_SHADER_TOKENS]; 88f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint defaultOutputMapping[VERT_RESULT_MAX]; 89f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct pipe_shader_state vs; 90f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint attr, i; 91633e1133aeed04df650b97c8d25a041014fd6f5eBrian GLuint num_generic = 0; 92339e7ec6805e6de8794514c0a935081b5d36d38fBrian GLuint num_tokens; 93f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 94fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte vs_input_semantic_name[PIPE_MAX_SHADER_INPUTS]; 95fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte vs_input_semantic_index[PIPE_MAX_SHADER_INPUTS]; 96fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint vs_num_inputs = 0; 97fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 98fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte vs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 99fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte vs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 100fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint vs_num_outputs = 0; 101fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 102f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian memset(&vs, 0, sizeof(vs)); 103f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 104f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs if (stvp->Base.IsPositionInvariant) 105f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs _mesa_insert_mvp_code(st->ctx, &stvp->Base); 106f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs 107f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 108f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of inputs, the mappings between VERT_ATTRIB_x 109f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * and TGSI generic input indexes, plus input attrib semantic info. 110f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 111f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) { 112f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.InputsRead & (1 << attr)) { 113fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul const GLuint slot = vs_num_inputs; 114f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 115fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_num_inputs++; 116f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 117f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian stvp->input_to_index[attr] = slot; 118f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian stvp->index_to_input[slot] = attr; 119f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 120f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 121f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_POS: 122fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 123fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = 0; 124f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 125f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_WEIGHT: 126f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* fall-through */ 127f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_NORMAL: 128f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* just label as a generic */ 129fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 130fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = 0; 131f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 132f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_COLOR0: 133fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 134fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = 0; 135f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 136f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_COLOR1: 137fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 138fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = 1; 139f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 140f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_FOG: 141fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 142fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = 0; 143f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 144d378f7b3dfda3b549e4b02380e492671cc34bb59Brian Paul case VERT_ATTRIB_POINT_SIZE: 145d378f7b3dfda3b549e4b02380e492671cc34bb59Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 146d378f7b3dfda3b549e4b02380e492671cc34bb59Brian Paul vs_input_semantic_index[slot] = 0; 147d378f7b3dfda3b549e4b02380e492671cc34bb59Brian Paul break; 148f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX0: 149f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX1: 150f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX2: 151f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX3: 152f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX4: 153f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX5: 154f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX6: 155f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_TEX7: 156fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 157fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = num_generic++; 158f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 159f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC0: 160f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC1: 161f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC2: 162f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC3: 163f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC4: 164f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC5: 165f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC6: 166f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_ATTRIB_GENERIC7: 167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(attr < VERT_ATTRIB_MAX); 168fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 169fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index[slot] = num_generic++; 170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 175f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 176f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 177e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul#if 0 178e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul if (outputMapping && outputSemanticName) { 179e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul printf("VERT_RESULT written out_slot semantic_name semantic_index\n"); 180e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 181e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul printf(" %-2d %c %3d %2d %2d\n", 182e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul attr, 183e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul ((stvp->Base.Base.OutputsWritten & (1 << attr)) ? 'Y' : ' '), 184e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul outputMapping[attr], 185e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul outputSemanticName[attr], 186e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul outputSemanticIndex[attr]); 187e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul } 188e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul } 189e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul#endif 190e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul 191f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* initialize output semantics to defaults */ 192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { 193fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[i] = TGSI_SEMANTIC_GENERIC; 194fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[i] = 0; 195f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 196f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 197633e1133aeed04df650b97c8d25a041014fd6f5eBrian num_generic = 0; 198f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 199f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Determine number of outputs, the (default) output register 200f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * mapping and the semantic information for each output. 201f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 202f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 203f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (stvp->Base.Base.OutputsWritten & (1 << attr)) { 204f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint slot; 205f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 206a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul /* XXX 207a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul * Pass in the fragment program's input's semantic info. 208a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul * Use the generic semantic indexes from there, instead of 209a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul * guessing below. 210a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul */ 211a0a614480931b281d13e7f2be2c50d20681d9de4Brian Paul 212f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (outputMapping) { 213f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian slot = outputMapping[attr]; 214f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(slot != ~0); 215f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 216f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian else { 217fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul slot = vs_num_outputs; 218fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_num_outputs++; 219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian defaultOutputMapping[attr] = slot; 220f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 221f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 222f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_HPOS: 224c61b32777b5b3b138c8bf5fac7e7e70ec084c8c1Brian assert(slot == 0); 225fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 226fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 0; 227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 228f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL0: 229fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 230fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 0; 231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 232f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_COL1: 233fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 234fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 1; 235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 236f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC0: 237fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 238fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 0; 239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 240f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_BFC1: 241fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR; 242fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 1; 243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 244f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_FOGC: 245fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_FOG; 246fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 0; 247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_PSIZ: 249fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE; 250fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index[slot] = 0; 251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_EDGE: 253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian assert(0); 254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX0: 256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX1: 257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX2: 258f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX3: 259f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX4: 260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX5: 261f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX6: 262f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_TEX7: 263e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul /* fall-through */ 264f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case VERT_RESULT_VAR0: 265f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* fall-through */ 266f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 267e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul if (outputSemanticName) { 268e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul /* use provided semantic into */ 269e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul assert(outputSemanticName[attr] != TGSI_SEMANTIC_COUNT); 270e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul vs_output_semantic_name[slot] = outputSemanticName[attr]; 271e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul vs_output_semantic_index[slot] = outputSemanticIndex[attr]; 272e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul } 273e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul else { 274e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul /* use default semantic info */ 275e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul vs_output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 276e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul vs_output_semantic_index[slot] = num_generic++; 277e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul } 278f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 279f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 280f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 281f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 282fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul assert(vs_output_semantic_name[0] == TGSI_SEMANTIC_POSITION); 283c61b32777b5b3b138c8bf5fac7e7e70ec084c8c1Brian 284f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 285f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (outputMapping) { 286fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul /* find max output slot referenced to compute vs_num_outputs */ 287f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint maxSlot = 0; 288f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < VERT_RESULT_MAX; attr++) { 289f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot) 290f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian maxSlot = outputMapping[attr]; 291f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 292fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_num_outputs = maxSlot + 1; 293f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 294f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian else { 295f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian outputMapping = defaultOutputMapping; 296f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 297f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 298a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian /* free old shader state, if any */ 299a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian if (stvp->state.tokens) { 300a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian FREE((void *) stvp->state.tokens); 301a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian stvp->state.tokens = NULL; 302a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian } 303a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian if (stvp->driver_shader) { 304a770d40c3d4977e2c134661b5d8facaea446b6eaBrian Paul cso_delete_vertex_shader(st->cso_context, stvp->driver_shader); 305a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian stvp->driver_shader = NULL; 306a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian } 307a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian 308f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* XXX: fix static allocation of tokens: 309f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 31013a8c18d3d0ca505f053a15fc664a705cbc8be84Brian Paul num_tokens = st_translate_mesa_program( TGSI_PROCESSOR_VERTEX, 31144200421e8e15e603464e4a3e9d10f46787fc737Brian &stvp->Base.Base, 31244200421e8e15e603464e4a3e9d10f46787fc737Brian /* inputs */ 313fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_num_inputs, 31444200421e8e15e603464e4a3e9d10f46787fc737Brian stvp->input_to_index, 315fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_name, 316fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_input_semantic_index, 31744200421e8e15e603464e4a3e9d10f46787fc737Brian NULL, 31844200421e8e15e603464e4a3e9d10f46787fc737Brian /* outputs */ 319fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_num_outputs, 32044200421e8e15e603464e4a3e9d10f46787fc737Brian outputMapping, 321fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_name, 322fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul vs_output_semantic_index, 32344200421e8e15e603464e4a3e9d10f46787fc737Brian /* tokenized result */ 324339e7ec6805e6de8794514c0a935081b5d36d38fBrian tokens, ST_MAX_SHADER_TOKENS); 325f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 32600eb309c31692d29b01568b0b45f5066928b9107Brian Paul assert(num_tokens < ST_MAX_SHADER_TOKENS); 32700eb309c31692d29b01568b0b45f5066928b9107Brian Paul 328339e7ec6805e6de8794514c0a935081b5d36d38fBrian vs.tokens = (struct tgsi_token *) 329339e7ec6805e6de8794514c0a935081b5d36d38fBrian mem_dup(tokens, num_tokens * sizeof(tokens[0])); 33025b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin 331fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul stvp->num_inputs = vs_num_inputs; 332339e7ec6805e6de8794514c0a935081b5d36d38fBrian stvp->state = vs; /* struct copy */ 333339e7ec6805e6de8794514c0a935081b5d36d38fBrian stvp->driver_shader = pipe->create_vs_state(pipe, &vs); 334f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 335633e1133aeed04df650b97c8d25a041014fd6f5eBrian if (0) 336633e1133aeed04df650b97c8d25a041014fd6f5eBrian _mesa_print_program(&stvp->Base.Base); 337633e1133aeed04df650b97c8d25a041014fd6f5eBrian 338f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (TGSI_DEBUG) 339339e7ec6805e6de8794514c0a935081b5d36d38fBrian tgsi_dump( vs.tokens, 0 ); 340f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 341f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 342f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 343f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 344f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/** 345f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa fragment shader into a TGSI shader. 346f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param inputMapping to map fragment program input registers to TGSI 347f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * input slots 348f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut destination for TGSI tokens 349f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return pointer to cached pipe_shader object. 350f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 351b456f1374fc958e53efc80ee38ef343f580c1d6bBrian Paulvoid 352f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st, 353f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct st_fragment_program *stfp, 354339e7ec6805e6de8794514c0a935081b5d36d38fBrian const GLuint inputMapping[]) 355f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{ 356339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct pipe_context *pipe = st->pipe; 357339e7ec6805e6de8794514c0a935081b5d36d38fBrian struct tgsi_token tokens[ST_MAX_SHADER_TOKENS]; 358f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint outputMapping[FRAG_RESULT_MAX]; 359f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint defaultInputMapping[FRAG_ATTRIB_MAX]; 360f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian struct pipe_shader_state fs; 361f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint interpMode[16]; /* XXX size? */ 362f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian GLuint attr; 363e785f190f0d49f0367f7468c22b77962d0f14ea0Brian const GLbitfield inputsRead = stfp->Base.Base.InputsRead; 364e785f190f0d49f0367f7468c22b77962d0f14ea0Brian GLuint vslot = 0; 365633e1133aeed04df650b97c8d25a041014fd6f5eBrian GLuint num_generic = 0; 366339e7ec6805e6de8794514c0a935081b5d36d38fBrian GLuint num_tokens; 367f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 368fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint fs_num_inputs = 0; 369fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 370fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS]; 371fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS]; 372fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul uint fs_num_outputs = 0; 373fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul 374f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian memset(&fs, 0, sizeof(fs)); 375f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 376e785f190f0d49f0367f7468c22b77962d0f14ea0Brian /* which vertex output goes to the first fragment input: */ 377e785f190f0d49f0367f7468c22b77962d0f14ea0Brian if (inputsRead & FRAG_BIT_WPOS) 378e785f190f0d49f0367f7468c22b77962d0f14ea0Brian vslot = 0; 379e785f190f0d49f0367f7468c22b77962d0f14ea0Brian else 380e785f190f0d49f0367f7468c22b77962d0f14ea0Brian vslot = 1; 381e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 382f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 383f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Convert Mesa program inputs to TGSI input register semantics. 384f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 385f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) { 386f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (inputsRead & (1 << attr)) { 387fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul const GLuint slot = fs_num_inputs; 388f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 389f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian defaultInputMapping[attr] = slot; 390f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 391ecd50ef58b034e604ff6b2fedbb0815953e510eaBrian stfp->input_map[slot] = vslot++; 392e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 393fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_inputs++; 394e785f190f0d49f0367f7468c22b77962d0f14ea0Brian 395f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian switch (attr) { 396f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_WPOS: 397e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; 398e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = 0; 399e785f190f0d49f0367f7468c22b77962d0f14ea0Brian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 400f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 401f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL0: 402e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 403e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = 0; 404f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 405f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 406f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_COL1: 407e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_COLOR; 408e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = 1; 409f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_LINEAR; 410f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 411f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_FOGC: 4124ee8d1ad679ea8540e91616933a880cdb3836a19Brian Paul if (stfp->Base.UsesPointCoord) 4134ee8d1ad679ea8540e91616933a880cdb3836a19Brian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 4144ee8d1ad679ea8540e91616933a880cdb3836a19Brian Paul else 4154ee8d1ad679ea8540e91616933a880cdb3836a19Brian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_FOG; 416e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = 0; 417f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 418f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 419f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX0: 420f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX1: 421f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX2: 422f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX3: 423f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX4: 424f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX5: 425f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX6: 426f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_TEX7: 427e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 428e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = num_generic++; 429f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 430f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian break; 431f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian case FRAG_ATTRIB_VAR0: 432f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* fall-through */ 433f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian default: 434e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC; 435e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index[slot] = num_generic++; 436f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE; 437f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 438f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 439f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 440f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 441f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* 442bc139a19b00f8686caa8db7c56af2087f26e369aBrian * Semantics and mapping for outputs 443f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 444635c4c41bdf111462939da292d65328595d314e8Brian { 445635c4c41bdf111462939da292d65328595d314e8Brian uint numColors = 0; 446635c4c41bdf111462939da292d65328595d314e8Brian GLbitfield outputsWritten = stfp->Base.Base.OutputsWritten; 447635c4c41bdf111462939da292d65328595d314e8Brian 448bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* if z is written, emit that first */ 449635c4c41bdf111462939da292d65328595d314e8Brian if (outputsWritten & (1 << FRAG_RESULT_DEPR)) { 450fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION; 451fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index[fs_num_outputs] = 0; 452fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul outputMapping[FRAG_RESULT_DEPR] = fs_num_outputs; 453fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 454635c4c41bdf111462939da292d65328595d314e8Brian outputsWritten &= ~(1 << FRAG_RESULT_DEPR); 455635c4c41bdf111462939da292d65328595d314e8Brian } 456635c4c41bdf111462939da292d65328595d314e8Brian 457bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handle remaning outputs (color) */ 458635c4c41bdf111462939da292d65328595d314e8Brian for (attr = 0; attr < FRAG_RESULT_MAX; attr++) { 459635c4c41bdf111462939da292d65328595d314e8Brian if (outputsWritten & (1 << attr)) { 460635c4c41bdf111462939da292d65328595d314e8Brian switch (attr) { 461635c4c41bdf111462939da292d65328595d314e8Brian case FRAG_RESULT_DEPR: 462bc139a19b00f8686caa8db7c56af2087f26e369aBrian /* handled above */ 463635c4c41bdf111462939da292d65328595d314e8Brian assert(0); 464635c4c41bdf111462939da292d65328595d314e8Brian break; 465635c4c41bdf111462939da292d65328595d314e8Brian case FRAG_RESULT_COLR: 466fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR; 467fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index[fs_num_outputs] = numColors; 468fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul outputMapping[attr] = fs_num_outputs; 469635c4c41bdf111462939da292d65328595d314e8Brian numColors++; 470635c4c41bdf111462939da292d65328595d314e8Brian break; 471635c4c41bdf111462939da292d65328595d314e8Brian default: 472635c4c41bdf111462939da292d65328595d314e8Brian assert(0); 473635c4c41bdf111462939da292d65328595d314e8Brian } 474fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs++; 475f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 476f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 477f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian } 478f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 479f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (!inputMapping) 480f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian inputMapping = defaultInputMapping; 481f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 482f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian /* XXX: fix static allocation of tokens: 483f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */ 48413a8c18d3d0ca505f053a15fc664a705cbc8be84Brian Paul num_tokens = st_translate_mesa_program( TGSI_PROCESSOR_FRAGMENT, 48544200421e8e15e603464e4a3e9d10f46787fc737Brian &stfp->Base.Base, 48644200421e8e15e603464e4a3e9d10f46787fc737Brian /* inputs */ 487fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_inputs, 48844200421e8e15e603464e4a3e9d10f46787fc737Brian inputMapping, 489e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_name, 490e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul stfp->input_semantic_index, 49144200421e8e15e603464e4a3e9d10f46787fc737Brian interpMode, 49244200421e8e15e603464e4a3e9d10f46787fc737Brian /* outputs */ 493fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_num_outputs, 49444200421e8e15e603464e4a3e9d10f46787fc737Brian outputMapping, 495fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_name, 496fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul fs_output_semantic_index, 49744200421e8e15e603464e4a3e9d10f46787fc737Brian /* tokenized result */ 498339e7ec6805e6de8794514c0a935081b5d36d38fBrian tokens, ST_MAX_SHADER_TOKENS); 499f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 50000eb309c31692d29b01568b0b45f5066928b9107Brian Paul assert(num_tokens < ST_MAX_SHADER_TOKENS); 50100eb309c31692d29b01568b0b45f5066928b9107Brian Paul 502339e7ec6805e6de8794514c0a935081b5d36d38fBrian fs.tokens = (struct tgsi_token *) 503339e7ec6805e6de8794514c0a935081b5d36d38fBrian mem_dup(tokens, num_tokens * sizeof(tokens[0])); 5047ff0df6c2bf11a36bc6101e361484bde57595a79Zack Rusin 505339e7ec6805e6de8794514c0a935081b5d36d38fBrian stfp->state = fs; /* struct copy */ 506339e7ec6805e6de8794514c0a935081b5d36d38fBrian stfp->driver_shader = pipe->create_fs_state(pipe, &fs); 507f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 508633e1133aeed04df650b97c8d25a041014fd6f5eBrian if (0) 509633e1133aeed04df650b97c8d25a041014fd6f5eBrian _mesa_print_program(&stfp->Base.Base); 510633e1133aeed04df650b97c8d25a041014fd6f5eBrian 511f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian if (TGSI_DEBUG) 512339e7ec6805e6de8794514c0a935081b5d36d38fBrian tgsi_dump( fs.tokens, 0/*TGSI_DUMP_VERBOSE*/ ); 513f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian} 514f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian 515678f80b347801d925c07a774faee1ed3f716de15Brian Paul 516678f80b347801d925c07a774faee1ed3f716de15Brian Paul/** 517678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text 518678f80b347801d925c07a774faee1ed3f716de15Brian Paul */ 519678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid 520678f80b347801d925c07a774faee1ed3f716de15Brian Paulst_print_shaders(GLcontext *ctx) 521678f80b347801d925c07a774faee1ed3f716de15Brian Paul{ 522678f80b347801d925c07a774faee1ed3f716de15Brian Paul struct gl_shader_program *shProg = ctx->Shader.CurrentProgram; 523678f80b347801d925c07a774faee1ed3f716de15Brian Paul if (shProg) { 524678f80b347801d925c07a774faee1ed3f716de15Brian Paul GLuint i; 525678f80b347801d925c07a774faee1ed3f716de15Brian Paul for (i = 0; i < shProg->NumShaders; i++) { 526678f80b347801d925c07a774faee1ed3f716de15Brian Paul printf("GLSL shader %u of %u:\n", i, shProg->NumShaders); 527678f80b347801d925c07a774faee1ed3f716de15Brian Paul printf("%s\n", shProg->Shaders[i]->Source); 528678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 529678f80b347801d925c07a774faee1ed3f716de15Brian Paul } 530678f80b347801d925c07a774faee1ed3f716de15Brian Paul} 531