st_program.c revision b7eed19efec0cdaca42cabbc6f9fadcb892aee81
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
45b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell#include "st_debug.h"
46f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_context.h"
47f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian#include "st_program.h"
48ef6940f17220f1149dce6daf548bd0103d91a281Brian#include "st_mesa_to_tgsi.h"
49339e7ec6805e6de8794514c0a935081b5d36d38fBrian#include "cso_cache/cso_context.h"
50f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
518468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul
528468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul
538468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul/**
548468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul * Clean out any old compilations:
558468234bfa98be77cbceecc8e91325c00e4e424bBrian Paul */
5607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellvoid
5707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_vp_release_varients( struct st_context *st,
5807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                        struct st_vertex_program *stvp )
5907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
6007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct st_vp_varient *vpv;
6107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
6207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   for (vpv = stvp->varients; vpv; ) {
6307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      struct st_vp_varient *next = vpv->next;
6407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
6507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      if (vpv->driver_shader)
6607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         cso_delete_vertex_shader(st->cso_context, vpv->driver_shader);
6707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
6807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      if (vpv->draw_shader)
6907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         draw_delete_vertex_shader( st->draw, vpv->draw_shader );
7007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
71b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      if (vpv->tgsi.tokens)
72b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul         st_free_tokens(vpv->tgsi.tokens);
7307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
7407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      FREE( vpv );
7507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
7607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      vpv = next;
7707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   }
7807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
7907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->varients = NULL;
8007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
8107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
8207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
8307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
84f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
85f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
86f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa vertex shader into a TGSI shader.
87e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul * \param outputMapping  to map vertex program output registers (VERT_RESULT_x)
88e3f3e22cf7e9af4c5416d37329b7b8ee50f0cfcbBrian Paul *       to TGSI output slots
89f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \param tokensOut  destination for TGSI tokens
90f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
91f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
92ac95fee4fffee77bb7bd798d094ed2e3a7c4019bBrianvoid
9307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_prepare_vertex_program(struct st_context *st,
9407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp)
95f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
9607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   GLuint attr;
97c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
9807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_inputs = 0;
9907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   stvp->num_outputs = 0;
100f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
101f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs   if (stvp->Base.IsPositionInvariant)
102f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs      _mesa_insert_mvp_code(st->ctx, &stvp->Base);
103f3a62372bf155d14876f98b1a085841607bb344cBen Skeggs
104325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell   assert(stvp->Base.Base.NumInstructions > 1);
105325f045c04121b989bddfca02711e3d03f7f9c3fKeith Whitwell
106f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
107f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Determine number of inputs, the mappings between VERT_ATTRIB_x
108f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * and TGSI generic input indexes, plus input attrib semantic info.
109f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
110f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
111f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      if (stvp->Base.Base.InputsRead & (1 << attr)) {
11207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->input_to_index[attr] = stvp->num_inputs;
11307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->index_to_input[stvp->num_inputs] = attr;
11407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->num_inputs++;
115f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
116f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
11750caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   /* bit of a hack, presetup potentially unused edgeflag input */
11850caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->input_to_index[VERT_ATTRIB_EDGEFLAG] = stvp->num_inputs;
11950caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   stvp->index_to_input[stvp->num_inputs] = VERT_ATTRIB_EDGEFLAG;
120f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
12107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   /* Compute mapping of vertex program outputs to slots.
122f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
123f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < VERT_RESULT_MAX; attr++) {
12407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      if ((stvp->Base.Base.OutputsWritten & (1 << attr)) == 0) {
12507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = ~0;
12607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      }
12707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell      else {
12807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         unsigned slot = stvp->num_outputs++;
12907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
13007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell         stvp->result_to_output[attr] = slot;
131f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
132f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
133f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_HPOS:
13407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
13507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
136f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
137f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL0:
13807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
13907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
140f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
141f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_COL1:
14207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
14307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
144f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
145f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC0:
14607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
14707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
148f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
149f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_BFC1:
15007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_BCOLOR;
15107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 1;
152f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
153f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_FOGC:
15407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_FOG;
15507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
156f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
157f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_PSIZ:
15807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_PSIZE;
15907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = 0;
160f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
161f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_EDGE:
162f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            assert(0);
163f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
16407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
165f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX0:
166f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX1:
167f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX2:
168f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX3:
169f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX4:
170f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX5:
171f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX6:
172f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_TEX7:
17307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
17407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = attr - VERT_RESULT_TEX0;
17507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
17607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
177f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case VERT_RESULT_VAR0:
178f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
17907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            assert(attr < VERT_RESULT_MAX);
18007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
18107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            stvp->output_semantic_index[slot] = (FRAG_ATTRIB_VAR0 -
18207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                FRAG_ATTRIB_TEX0 +
18307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                attr -
18407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                                VERT_RESULT_VAR0);
18507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
186f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
187f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
188f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
189890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   /* similar hack to above, presetup potentially unused edgeflag output */
190890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->result_to_output[VERT_RESULT_EDGE] = stvp->num_outputs;
191890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_name[stvp->num_outputs] = TGSI_SEMANTIC_EDGEFLAG;
192890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   stvp->output_semantic_index[stvp->num_outputs] = 0;
19307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell}
194f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
195509d9eb686411254b24139012b7594e10a760b6cBrian Paul
19607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellstruct st_vp_varient *
19707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwellst_translate_vertex_program(struct st_context *st,
19807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            struct st_vertex_program *stvp,
19907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                            const struct st_vp_varient_key *key)
20007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell{
20107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct st_vp_varient *vpv = CALLOC_STRUCT(st_vp_varient);
20207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   struct pipe_context *pipe = st->pipe;
203a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   struct ureg_program *ureg;
204a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   enum pipe_error error;
205890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   unsigned num_outputs;
206a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
207a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg = ureg_create( TGSI_PROCESSOR_VERTEX );
208b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   if (ureg == NULL) {
209b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee      FREE(vpv);
210a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      return NULL;
211b7eed19efec0cdaca42cabbc6f9fadcb892aee81Vinson Lee   }
212a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
21350caff5675888c0063c73fa64b88129db7aa11ddRoland Scheidegger   vpv->num_inputs = stvp->num_inputs;
214890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   num_outputs = stvp->num_outputs;
215890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   if (key->passthrough_edgeflags) {
216890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      vpv->num_inputs++;
217890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger      num_outputs++;
218890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger   }
219a35c1ca3ad4361fee30d21ef13d8d37ae91aee66Brian
220a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   error =
2214295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell      st_translate_mesa_program(st->ctx,
2224295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                TGSI_PROCESSOR_VERTEX,
223a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell                                ureg,
2244295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                &stvp->Base.Base,
2254295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                /* inputs */
226890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger                                vpv->num_inputs,
2274295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                stvp->input_to_index,
228b44b70dc114ddcfb4d359759928df4d7b9efaafbKeith Whitwell                                NULL, /* input semantic name */
229b44b70dc114ddcfb4d359759928df4d7b9efaafbKeith Whitwell                                NULL, /* input semantic index */
2304295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                NULL,
2314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                /* outputs */
232890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger                                num_outputs,
23307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                stvp->result_to_output,
23407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell                                stvp->output_semantic_name,
235890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger                                stvp->output_semantic_index,
236890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger                                key->passthrough_edgeflags );
23725b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
238a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   if (error)
239a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell      goto fail;
240a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
241b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->tgsi.tokens = ureg_get_tokens( ureg, NULL );
242b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   if (!vpv->tgsi.tokens)
2439d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger      goto fail;
2449d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
245a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
24625b17b213b7ba0d1b93ec37211504ee489944ce8Zack Rusin
247b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   vpv->driver_shader = pipe->create_vs_state(pipe, &vpv->tgsi);
248f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
249b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
250633e1133aeed04df650b97c8d25a041014fd6f5eBrian      _mesa_print_program(&stvp->Base.Base);
251b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
252b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
253633e1133aeed04df650b97c8d25a041014fd6f5eBrian
254b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
255b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( vpv->tgsi.tokens, 0 );
256b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
257b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
25807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
25907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell   return vpv;
260a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
261a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwellfail:
2629d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_printf("%s: failed to translate Mesa program:\n", __FUNCTION__);
2639d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   _mesa_print_program(&stvp->Base.Base);
2649d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger   debug_assert(0);
2659d938e29f202552a98605906b71f31485af1ef60Roland Scheidegger
266a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg_destroy( ureg );
267a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   return NULL;
268f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
269f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
270f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
271f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
272f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian/**
273f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * Translate a Mesa fragment shader into a TGSI shader.
274f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian * \return  pointer to cached pipe_shader object.
275f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian */
276b456f1374fc958e53efc80ee38ef343f580c1d6bBrian Paulvoid
277f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrianst_translate_fragment_program(struct st_context *st,
278e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell                              struct st_fragment_program *stfp )
279f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian{
280339e7ec6805e6de8794514c0a935081b5d36d38fBrian   struct pipe_context *pipe = st->pipe;
281f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint outputMapping[FRAG_RESULT_MAX];
282e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell   GLuint inputMapping[FRAG_ATTRIB_MAX];
283e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul   GLuint interpMode[PIPE_MAX_SHADER_INPUTS];  /* XXX size? */
284f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   GLuint attr;
285a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   enum pipe_error error;
286e785f190f0d49f0367f7468c22b77962d0f14ea0Brian   const GLbitfield inputsRead = stfp->Base.Base.InputsRead;
287a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   struct ureg_program *ureg;
288f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
289e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul   ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
290e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul   ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
291fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul   uint fs_num_inputs = 0;
292fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
293fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul   ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
294fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul   ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
295fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul   uint fs_num_outputs = 0;
296fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul
297f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
298f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    * Convert Mesa program inputs to TGSI input register semantics.
299f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
300f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
301f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      if (inputsRead & (1 << attr)) {
302e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell         const GLuint slot = fs_num_inputs++;
303f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
304e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell         inputMapping[attr] = slot;
305e785f190f0d49f0367f7468c22b77962d0f14ea0Brian
306f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         switch (attr) {
307f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_WPOS:
308e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
309e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_index[slot] = 0;
310e785f190f0d49f0367f7468c22b77962d0f14ea0Brian            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
311f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
312f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_COL0:
313e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
314e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_index[slot] = 0;
315f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
316f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
317f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_COL1:
318e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
319e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_index[slot] = 1;
320f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
321f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian            break;
3229d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul         case FRAG_ATTRIB_FOGC:
323e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
324e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_index[slot] = 0;
3259d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
3269d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            break;
3279d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul         case FRAG_ATTRIB_FACE:
328e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
329e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_index[slot] = 0;
3309d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
3319d0b8d72d8d704ff4d8e10448b60cbb42f07eecbBrian Paul            break;
332f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul         case FRAG_ATTRIB_PNTC:
333f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul            /* This is a hack.  We really need a new semantic label for
334f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul             * point coord.  The draw module needs to know which fragment
335f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul             * shader input is the point coord attribute so that it can set
336f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul             * up the right vertex attribute values.
337f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul             */
338e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
339e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_index[slot] = 0;
340f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
341f1d544d6a62fe950ddc113473cba83619caaec6bBrian Paul            break;
34207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell
34307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            /* In most cases, there is nothing special about these
34407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * inputs, so adopt a convention to use the generic
34507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * semantic name and the mesa FRAG_ATTRIB_ number as the
34607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * index.
34707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             *
34807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * All that is required is that the vertex shader labels
34907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * its own outputs similarly, and that the vertex shader
35007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * generates at least every output required by the
35107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * fragment shader plus fixed-function hardware (such as
35207fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * BFC).
35307fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             *
35407fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * There is no requirement that semantic indexes start at
35507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * zero or be restricted to a particular range -- nobody
35607fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * should be building tables based on semantic index.
35707fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             */
358f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX0:
359f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX1:
360f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX2:
361f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX3:
362f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX4:
363f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX5:
364f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX6:
365f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_TEX7:
366f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         case FRAG_ATTRIB_VAR0:
367f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         default:
36807fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            /* Actually, let's try and zero-base this just for
36907fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             * readability of the generated TGSI.
37007fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell             */
37107fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            assert(attr >= FRAG_ATTRIB_TEX0);
372e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
373e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul            input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
374dd98a979b6f565f0b0060403fbfad36005278802Brian Paul            interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
37507fafc7c9346aa260829603bf3188596481e9e62Keith Whitwell            break;
376f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
377f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
378e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      else {
379e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell	 inputMapping[attr] = -1;
380e1906ae98ef4d8f153553056552c06ac4292d1f5Keith Whitwell      }
381f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
382f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
383f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   /*
384bc139a19b00f8686caa8db7c56af2087f26e369aBrian    * Semantics and mapping for outputs
385f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian    */
386635c4c41bdf111462939da292d65328595d314e8Brian   {
387635c4c41bdf111462939da292d65328595d314e8Brian      uint numColors = 0;
3885606dfb572bf4b89b4882265924705bacc8c182bIan Romanick      GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
389635c4c41bdf111462939da292d65328595d314e8Brian
390bc139a19b00f8686caa8db7c56af2087f26e369aBrian      /* if z is written, emit that first */
3918d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul      if (outputsWritten & (1 << FRAG_RESULT_DEPTH)) {
392fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul         fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_POSITION;
393fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul         fs_output_semantic_index[fs_num_outputs] = 0;
3948d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul         outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
395fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul         fs_num_outputs++;
3968d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul         outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
397635c4c41bdf111462939da292d65328595d314e8Brian      }
398635c4c41bdf111462939da292d65328595d314e8Brian
399bc139a19b00f8686caa8db7c56af2087f26e369aBrian      /* handle remaning outputs (color) */
400635c4c41bdf111462939da292d65328595d314e8Brian      for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
401635c4c41bdf111462939da292d65328595d314e8Brian         if (outputsWritten & (1 << attr)) {
402635c4c41bdf111462939da292d65328595d314e8Brian            switch (attr) {
4038d475822e6e19fa79719c856a2db5b6a205db1b9Brian Paul            case FRAG_RESULT_DEPTH:
404bc139a19b00f8686caa8db7c56af2087f26e369aBrian               /* handled above */
405635c4c41bdf111462939da292d65328595d314e8Brian               assert(0);
406635c4c41bdf111462939da292d65328595d314e8Brian               break;
407af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca            default:
408af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca               assert(attr == FRAG_RESULT_COLOR ||
409af9d202b26f75555b653dbe1c2ebaf6a2cf14d28José Fonseca                      (FRAG_RESULT_DATA0 <= attr && attr < FRAG_RESULT_MAX));
410fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul               fs_output_semantic_name[fs_num_outputs] = TGSI_SEMANTIC_COLOR;
411fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul               fs_output_semantic_index[fs_num_outputs] = numColors;
412fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul               outputMapping[attr] = fs_num_outputs;
413635c4c41bdf111462939da292d65328595d314e8Brian               numColors++;
414635c4c41bdf111462939da292d65328595d314e8Brian               break;
415635c4c41bdf111462939da292d65328595d314e8Brian            }
416c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul
417fa9e7e9a8debb68611909ac2ffab527c6c39a3e5Brian Paul            fs_num_outputs++;
418f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian         }
419f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian      }
420f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian   }
421f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
422a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
423a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell   if (ureg == NULL)
424a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger      return;
425a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
426a08e348a84f57ed5e8bf5888f1ce13934d2ce8faKeith Whitwell
427a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   error =
4284295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell      st_translate_mesa_program(st->ctx,
4294295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                TGSI_PROCESSOR_FRAGMENT,
430a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger                                ureg,
4314295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                &stfp->Base.Base,
4324295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                /* inputs */
4334295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                fs_num_inputs,
4344295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                inputMapping,
435e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul                                input_semantic_name,
436e90bc2e2ce5b8d835d7dcd069071f71fa032ebe2Brian Paul                                input_semantic_index,
4374295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                interpMode,
4384295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                /* outputs */
4394295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                fs_num_outputs,
4404295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                outputMapping,
4414295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell                                fs_output_semantic_name,
442890809d71b6ab40c56d341a5dad9f5e6b06469d0Roland Scheidegger                                fs_output_semantic_index, FALSE );
4434295b34d25f40f38b8cfd3ebdc64aef29d0666dbKeith Whitwell
444b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   stfp->tgsi.tokens = ureg_get_tokens( ureg, NULL );
445a0127b6ced257919180ba3a1bf534b68d9c750beRoland Scheidegger   ureg_destroy( ureg );
446b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul   stfp->driver_shader = pipe->create_fs_state(pipe, &stfp->tgsi);
447f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
448b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if ((ST_DEBUG & DEBUG_TGSI) && (ST_DEBUG & DEBUG_MESA)) {
449633e1133aeed04df650b97c8d25a041014fd6f5eBrian      _mesa_print_program(&stfp->Base.Base);
450b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
451b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
452633e1133aeed04df650b97c8d25a041014fd6f5eBrian
453b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   if (ST_DEBUG & DEBUG_TGSI) {
454b9b4e7724e5ae80121a053ca66cee73942cc16b7Brian Paul      tgsi_dump( stfp->tgsi.tokens, 0/*TGSI_DUMP_VERBOSE*/ );
455b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell      debug_printf("\n");
456b02ef740b90029bc40629e5b81270a8cf77101d3Keith Whitwell   }
457f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian}
458f9ed2fdaace0d4d7f091a4423a8638945e920b0dBrian
459678f80b347801d925c07a774faee1ed3f716de15Brian Paul
460678f80b347801d925c07a774faee1ed3f716de15Brian Paul/**
461678f80b347801d925c07a774faee1ed3f716de15Brian Paul * Debug- print current shader text
462678f80b347801d925c07a774faee1ed3f716de15Brian Paul */
463678f80b347801d925c07a774faee1ed3f716de15Brian Paulvoid
464678f80b347801d925c07a774faee1ed3f716de15Brian Paulst_print_shaders(GLcontext *ctx)
465678f80b347801d925c07a774faee1ed3f716de15Brian Paul{
466678f80b347801d925c07a774faee1ed3f716de15Brian Paul   struct gl_shader_program *shProg = ctx->Shader.CurrentProgram;
467678f80b347801d925c07a774faee1ed3f716de15Brian Paul   if (shProg) {
468678f80b347801d925c07a774faee1ed3f716de15Brian Paul      GLuint i;
469678f80b347801d925c07a774faee1ed3f716de15Brian Paul      for (i = 0; i < shProg->NumShaders; i++) {
470678f80b347801d925c07a774faee1ed3f716de15Brian Paul         printf("GLSL shader %u of %u:\n", i, shProg->NumShaders);
471678f80b347801d925c07a774faee1ed3f716de15Brian Paul         printf("%s\n", shProg->Shaders[i]->Source);
472678f80b347801d925c07a774faee1ed3f716de15Brian Paul      }
473678f80b347801d925c07a774faee1ed3f716de15Brian Paul   }
474678f80b347801d925c07a774faee1ed3f716de15Brian Paul}
475