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