st_program.c revision bc139a19b00f8686caa8db7c56af2087f26e369a
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"
36f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
37f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_context.h"
38f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/p_defines.h"
398731e391f5a8bb45adb53242b0a473707c0c024cZack Rusin#include "pipe/draw/draw_context.h"
40f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/tgsi/mesa/mesa_to_tgsi.h"
41f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "pipe/tgsi/exec/tgsi_core.h"
42f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
43f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h"
44f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_cache.h"
45f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_atom.h"
46f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h"
47f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
48f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
491201eb852966a64742645a4cd3a2879bed81e29dBrian#define TGSI_DEBUG 0
50f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
51f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
52f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
53f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader.
54f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param outputMapping  to map vertex program output registers to TGSI
55f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *                       output slots
56f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut  destination for TGSI tokens
57f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
58f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
59f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianconst struct cso_vertex_shader *
60f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_vertex_program(struct st_context *st,
61f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                            struct st_vertex_program *stvp,
62f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                            const GLuint outputMapping[],
63f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                            struct tgsi_token *tokensOut,
64f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                            GLuint maxTokens)
65f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
66f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint defaultOutputMapping[VERT_RESULT_MAX];
67f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   struct pipe_shader_state vs;
68f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   const struct cso_vertex_shader *cso;
69f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint attr, i;
70f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
71f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   memset(&vs, 0, sizeof(vs));
72f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
73f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
74f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Determine number of inputs, the mappings between VERT_ATTRIB_x
75f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * and TGSI generic input indexes, plus input attrib semantic info.
76f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
77f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
78f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      if (stvp->Base.Base.InputsRead & (1 << attr)) {
79f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         const GLuint slot = vs.num_inputs;
80f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
81f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         vs.num_inputs++;
82f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
83f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         stvp->input_to_index[attr] = slot;
84f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         stvp->index_to_input[slot] = attr;
85f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
86f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
87f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_POS:
88f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
89f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_index[slot] = 0;
90f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
91f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_WEIGHT:
92f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            /* fall-through */
93f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_NORMAL:
94f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            /* just label as a generic */
95f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
96f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_index[slot] = 0;
97f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
98f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_COLOR0:
99f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
100f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_index[slot] = 0;
101f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
102f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_COLOR1:
103f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
104f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_index[slot] = 1;
105f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
106f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_FOG:
107f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
108f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_index[slot] = 0;
109f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
110f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_TEX0:
111f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_TEX1:
112f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_TEX2:
113f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_TEX3:
114f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_TEX4:
115f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_TEX5:
116f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_TEX6:
117f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_TEX7:
118f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
119f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_index[slot] = attr - VERT_ATTRIB_TEX0;
120f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
121f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_GENERIC0:
122f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_GENERIC1:
123f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_GENERIC2:
124f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_GENERIC3:
125f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_GENERIC4:
126f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_GENERIC5:
127f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_GENERIC6:
128f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_ATTRIB_GENERIC7:
129f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(attr < VERT_ATTRIB_MAX);
130f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
131f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.input_semantic_index[slot] = attr - VERT_ATTRIB_GENERIC0;
132f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
133f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
134f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(0);
135f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
136f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
137f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
138f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
139f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /* initialize output semantics to defaults */
140f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) {
141f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      vs.output_semantic_name[i] = TGSI_SEMANTIC_GENERIC;
142f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      vs.output_semantic_index[i] = 0;
143f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
144f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
145f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
146f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Determine number of outputs, the (default) output register
147f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * mapping and the semantic information for each output.
148f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
149f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
150f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      if (stvp->Base.Base.OutputsWritten & (1 << attr)) {
151f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         GLuint slot;
152f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
153f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         if (outputMapping) {
154f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            slot = outputMapping[attr];
155f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(slot != ~0);
156f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
157f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         else {
158f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            slot = vs.num_outputs;
159f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.num_outputs++;
160f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            defaultOutputMapping[attr] = slot;
161f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
162f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
163f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         /*
164f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         printf("Output %u -> slot %u\n", attr, slot);
165f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         */
166f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_HPOS:
169f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_index[slot] = 0;
171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL0:
173f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
174f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_index[slot] = 0;
175f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
176f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL1:
177f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
178f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_index[slot] = 1;
179f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
180f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC0:
181f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
182f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_index[slot] = 0;
183f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
184f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC1:
185f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
186f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_index[slot] = 1;
187f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
188f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_FOGC:
189f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
190f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_index[slot] = 0;
191f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
192f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_PSIZ:
193f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_index[slot] = 0;
195f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
196f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_EDGE:
197f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(0);
198f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
199f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX0:
200f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX1:
201f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX2:
202f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX3:
203f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX4:
204f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX5:
205f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX6:
206f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX7:
207f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
208f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
209f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
210f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_VAR0:
211f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            /* fall-through */
212f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
213f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(attr - VERT_RESULT_VAR0 < MAX_VARYING);
214f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
215f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            vs.output_semantic_index[slot] = attr - VERT_RESULT_VAR0;
216f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
217f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
218f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
219f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
220f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
221f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   if (outputMapping) {
222f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      /* find max output slot referenced to compute vs.num_outputs */
223f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      GLuint maxSlot = 0;
224f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
225f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         if (outputMapping[attr] != ~0 && outputMapping[attr] > maxSlot)
226f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            maxSlot = outputMapping[attr];
227f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
228f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      vs.num_outputs = maxSlot + 1;
229f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
230f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   else {
231f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      outputMapping = defaultOutputMapping;
232f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
233f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
234f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /* XXX: fix static allocation of tokens:
235f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
236f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   tgsi_mesa_compile_vp_program( &stvp->Base,
237f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 /* inputs */
238f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 vs.num_inputs,
239f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 stvp->input_to_index,
240f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 vs.input_semantic_name,
241f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 vs.input_semantic_index,
242f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 /* outputs */
243f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 vs.num_outputs,
244f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 outputMapping,
245f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 vs.output_semantic_name,
246f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 vs.output_semantic_index,
247f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 /* tokenized result */
248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 tokensOut, maxTokens);
249f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
250f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   vs.tokens = tokensOut;
251f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   cso = st_cached_vs_state(st, &vs);
252f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   stvp->vs = cso;
253f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
254f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   if (TGSI_DEBUG)
255f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      tgsi_dump( tokensOut, 0 );
256f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
257f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   return cso;
258f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
259f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
260f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
261f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
262f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
263f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa fragment shader into a TGSI shader.
264f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param inputMapping  to map fragment program input registers to TGSI
265f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian *                      input slots
266f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut  destination for TGSI tokens
267f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
268f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
269f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianconst struct cso_fragment_shader *
270f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st,
271f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                              struct st_fragment_program *stfp,
272f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                              const GLuint inputMapping[],
273f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                              struct tgsi_token *tokensOut,
274f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                              GLuint maxTokens)
275f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
276f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint outputMapping[FRAG_RESULT_MAX];
277f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint defaultInputMapping[FRAG_ATTRIB_MAX];
278f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   struct pipe_shader_state fs;
279f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   const struct cso_fragment_shader *cso;
280f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint interpMode[16];  /* XXX size? */
281f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint attr;
282f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLbitfield inputsRead = stfp->Base.Base.InputsRead;
283f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
284b13618c3167002a823e9bb1e744a0a316fd0e2bfBrian   /* For software rendering, we always need the fragment input position
285b13618c3167002a823e9bb1e744a0a316fd0e2bfBrian    * in order to calculate interpolated values.
286b13618c3167002a823e9bb1e744a0a316fd0e2bfBrian    * For i915, we always want to emit the semantic info for position.
287f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
288b13618c3167002a823e9bb1e744a0a316fd0e2bfBrian   inputsRead |= FRAG_BIT_WPOS;
289f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
290f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   memset(&fs, 0, sizeof(fs));
291f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
292f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
293f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Convert Mesa program inputs to TGSI input register semantics.
294f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
295f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
296f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      if (inputsRead & (1 << attr)) {
297f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         const GLuint slot = fs.num_inputs;
298f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
299f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         fs.num_inputs++;
300f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
301f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         defaultInputMapping[attr] = slot;
302f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
303f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
304f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_WPOS:
305f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
306f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_index[slot] = 0;
307f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
308f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
309f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_COL0:
310f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
311f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_index[slot] = 0;
312f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
313f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
314f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_COL1:
315f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
316f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_index[slot] = 1;
317f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
318f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
319f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_FOGC:
320f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
321f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_index[slot] = 0;
322f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
323f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
324f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX0:
325f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX1:
326f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX2:
327f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX3:
328f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX4:
329f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX5:
330f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX6:
331f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX7:
332f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
333f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_index[slot] = attr - FRAG_ATTRIB_TEX0;
334f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
335f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
336f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_VAR0:
337f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            /* fall-through */
338f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
339f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
340f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            fs.input_semantic_index[slot] = attr - FRAG_ATTRIB_VAR0;
341f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
342f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
343f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
344f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
345f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
346f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
347bc139a19b00f8686caa8db7c56af2087f26e369aBrian    * Semantics and mapping for outputs
348f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
349635c4c41bdf111462939da292d65328595d314e8Brian   {
350635c4c41bdf111462939da292d65328595d314e8Brian      uint numColors = 0;
351635c4c41bdf111462939da292d65328595d314e8Brian      GLbitfield outputsWritten = stfp->Base.Base.OutputsWritten;
352635c4c41bdf111462939da292d65328595d314e8Brian
353bc139a19b00f8686caa8db7c56af2087f26e369aBrian      /* if z is written, emit that first */
354635c4c41bdf111462939da292d65328595d314e8Brian      if (outputsWritten & (1 << FRAG_RESULT_DEPR)) {
355bc139a19b00f8686caa8db7c56af2087f26e369aBrian         fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_POSITION;
356bc139a19b00f8686caa8db7c56af2087f26e369aBrian         fs.output_semantic_index[fs.num_outputs] = 0;
357bc139a19b00f8686caa8db7c56af2087f26e369aBrian         outputMapping[FRAG_RESULT_DEPR] = fs.num_outputs;
358bc139a19b00f8686caa8db7c56af2087f26e369aBrian         fs.num_outputs++;
359635c4c41bdf111462939da292d65328595d314e8Brian         outputsWritten &= ~(1 << FRAG_RESULT_DEPR);
360635c4c41bdf111462939da292d65328595d314e8Brian      }
361635c4c41bdf111462939da292d65328595d314e8Brian
362bc139a19b00f8686caa8db7c56af2087f26e369aBrian      /* handle remaning outputs (color) */
363635c4c41bdf111462939da292d65328595d314e8Brian      for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
364635c4c41bdf111462939da292d65328595d314e8Brian         if (outputsWritten & (1 << attr)) {
365635c4c41bdf111462939da292d65328595d314e8Brian            switch (attr) {
366635c4c41bdf111462939da292d65328595d314e8Brian            case FRAG_RESULT_DEPR:
367bc139a19b00f8686caa8db7c56af2087f26e369aBrian               /* handled above */
368635c4c41bdf111462939da292d65328595d314e8Brian               assert(0);
369635c4c41bdf111462939da292d65328595d314e8Brian               break;
370635c4c41bdf111462939da292d65328595d314e8Brian            case FRAG_RESULT_COLR:
371635c4c41bdf111462939da292d65328595d314e8Brian               fs.output_semantic_name[fs.num_outputs] = TGSI_SEMANTIC_COLOR;
372635c4c41bdf111462939da292d65328595d314e8Brian               fs.output_semantic_index[fs.num_outputs] = numColors;
373635c4c41bdf111462939da292d65328595d314e8Brian               outputMapping[attr] = fs.num_outputs;
374635c4c41bdf111462939da292d65328595d314e8Brian               numColors++;
375635c4c41bdf111462939da292d65328595d314e8Brian               break;
376635c4c41bdf111462939da292d65328595d314e8Brian            default:
377635c4c41bdf111462939da292d65328595d314e8Brian               assert(0);
378635c4c41bdf111462939da292d65328595d314e8Brian            }
379635c4c41bdf111462939da292d65328595d314e8Brian            fs.num_outputs++;
380f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
381f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
382f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
383f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
384f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   if (!inputMapping)
385f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      inputMapping = defaultInputMapping;
386f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
387f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /* XXX: fix static allocation of tokens:
388f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
389f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   tgsi_mesa_compile_fp_program( &stfp->Base,
390f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 /* inputs */
391f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 fs.num_inputs,
392f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 inputMapping,
393f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 fs.input_semantic_name,
394f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 fs.input_semantic_index,
395f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 interpMode,
396f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 /* outputs */
397f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 outputMapping,
398f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 /* tokenized result */
399f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian                                 tokensOut, maxTokens);
400f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
401f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
402f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   fs.tokens = tokensOut;
403f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
404f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   cso = st_cached_fs_state(st, &fs);
405f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   stfp->fs = cso;
406f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
407f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   if (TGSI_DEBUG)
408f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      tgsi_dump( tokensOut, 0/*TGSI_DUMP_VERBOSE*/ );
409f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
410f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   return cso;
411f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
412f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
413