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