st_mesa_to_tgsi.c revision c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2
1af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**************************************************************************
2af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *
381dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * All Rights Reserved.
5af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *
6af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Permission is hereby granted, free of charge, to any person obtaining a
7af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * copy of this software and associated documentation files (the
8af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * "Software"), to deal in the Software without restriction, including
9af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * without limitation the rights to use, copy, modify, merge, publish,
10af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * distribute, sub license, and/or sell copies of the Software, and to
11af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * permit persons to whom the Software is furnished to do so, subject to
12af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * the following conditions:
13af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *
14af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * The above copyright notice and this permission notice (including the
15af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * next paragraph) shall be included in all copies or substantial portions
16af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * of the Software.
17af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *
18af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *
26af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol **************************************************************************/
27af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
28af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/*
29af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \author
30af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Michal Krol
31af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
32af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
33abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_compiler.h"
34abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h"
35c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_parse.h"
36c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_build.h"
37c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_util.h"
38358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#include "tgsi/tgsi_dump.h"
39358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#include "tgsi/tgsi_sanity.h"
40af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol#include "st_mesa_to_tgsi.h"
41c5841425433f003af76f03435de719c40635005aJosé Fonseca#include "shader/prog_instruction.h"
42af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol#include "shader/prog_parameter.h"
43095ca0acd8019e8f2da89f9320b92ce4a96a140eBrian Paul#include "shader/prog_print.h"
44358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#include "pipe/p_debug.h"
45af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
46af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/*
47af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa register file to TGSI register file.
48af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
49af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
50af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_register_file(
5121c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell   enum register_file file,
5221c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell   GLuint index,
535d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   const GLuint immediateMapping[],
545d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   GLboolean indirectAccess )
55af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
56af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( file ) {
57af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_UNDEFINED:
58af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_NULL;
59af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_TEMPORARY:
60af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_TEMPORARY;
6193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul   /*case PROGRAM_LOCAL_PARAM:*/
6293f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul   /*case PROGRAM_ENV_PARAM:*/
6321c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell
6421c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell      /* Because of the longstanding problem with mesa arb shaders
6521c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell       * where constants, immediates and state variables are all
6621c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell       * bundled together as PROGRAM_STATE_VAR, we can't tell from the
6721c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell       * mesa register file whether this is a CONSTANT or an
6821c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell       * IMMEDIATE, hence we need all the other information.
6921c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell       */
70af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_STATE_VAR:
71af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_NAMED_PARAM:
72af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_UNIFORM:
735d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      if (!indirectAccess && immediateMapping && immediateMapping[index] != ~0)
7468ef8e89a5f25cd9f80e2b9088604631a28edc3cZack Rusin         return TGSI_FILE_IMMEDIATE;
7521c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell      else
7621c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell	 return TGSI_FILE_CONSTANT;
77af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_CONSTANT:
785d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      if (indirectAccess)
795d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         return TGSI_FILE_CONSTANT;
800576e837f18ad9925d732f883f4922c907d7bafbBrian Paul      assert(immediateMapping[index] != ~0);
81af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_IMMEDIATE;
82af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_INPUT:
83af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_INPUT;
84af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_OUTPUT:
85af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_OUTPUT;
86af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_ADDRESS:
87af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_ADDRESS;
88af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
89af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
90af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_NULL;
91af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
92af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
93af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
94af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
95af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa register file index to TGSI index.
96af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Take special care when processing input and output indices.
97af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param file  one of TGSI_FILE_x
98af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param index  the mesa register file index
99af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping  maps Mesa input indexes to TGSI input indexes
100af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping  maps Mesa output indexes to TGSI output indexes
101af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
102af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
103af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_register_file_index(
104af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint file,
105af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint index,
106af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint inputMapping[],
107af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint outputMapping[],
1085d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   const GLuint immediateMapping[],
1095d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   GLboolean indirectAccess )
110af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
111af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( file ) {
112af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TGSI_FILE_INPUT:
113af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* inputs are mapped according to the user-defined map */
114af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return inputMapping[index];
115af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
116af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TGSI_FILE_OUTPUT:
117af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return outputMapping[index];
118af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
119af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TGSI_FILE_IMMEDIATE:
1205d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      if (indirectAccess)
1215d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         return index;
1220576e837f18ad9925d732f883f4922c907d7bafbBrian Paul      assert(immediateMapping[index] != ~0);
123af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return immediateMapping[index];
124af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
125af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
126af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return index;
127af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
128af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
129af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
130af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/*
131af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa texture target to TGSI texture target.
132af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
133af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
134af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_texture_target(
135af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint textarget )
136af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
137af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( textarget ) {
138af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_1D_INDEX:
139af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_1D;
140af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_2D_INDEX:
141af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_2D;
142af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_3D_INDEX:
143af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_3D;
144af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_CUBE_INDEX:
145af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_CUBE;
146af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_RECT_INDEX:
147af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_RECT;
148af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
149af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
150af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
151af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
152af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return TGSI_TEXTURE_1D;
153af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
154af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
155af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
156af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolconvert_sat(
157af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint sat )
158af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
159af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( sat ) {
160af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case SATURATE_OFF:
161af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_NONE;
162af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case SATURATE_ZERO_ONE:
163af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_ZERO_ONE;
164af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case SATURATE_PLUS_MINUS_ONE:
165af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_MINUS_PLUS_ONE;
166af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
167af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
168af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_NONE;
169af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
170af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
171af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
172af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
173af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolconvert_writemask(
174af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint writemask )
175af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
176af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_X == TGSI_WRITEMASK_X );
177af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_Y == TGSI_WRITEMASK_Y );
178af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_Z == TGSI_WRITEMASK_Z );
179af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_W == TGSI_WRITEMASK_W );
180af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( (writemask & ~TGSI_WRITEMASK_XYZW) == 0 );
181af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
182af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return writemask;
183af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
184af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
185af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_immediate
186af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_immediate(const float *value, uint size)
187af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
188af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_immediate imm;
18981dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol
19081dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol   imm = tgsi_default_full_immediate();
19181dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol   imm.Immediate.Size += size;
192af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   imm.Immediate.DataType = TGSI_IMM_FLOAT32;
19381dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol   imm.u.Pointer = value;
194af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return imm;
195af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
196af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
197af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic void
198af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolcompile_instruction(
199af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const struct prog_instruction *inst,
200af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_instruction *fullinst,
201af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint inputMapping[],
202af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint outputMapping[],
203af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint immediateMapping[],
2045d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   GLboolean indirectAccess,
205af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint preamble_size,
206e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian   GLuint processor,
207e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian   GLboolean *insideSubroutine)
208af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
209af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint i;
210af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_dst_register *fulldst;
211af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_src_register *fullsrc;
212af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
213af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *fullinst = tgsi_default_full_instruction();
214af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
215af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fullinst->Instruction.Saturate = convert_sat( inst->SaturateMode );
216af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fullinst->Instruction.NumDstRegs = _mesa_num_inst_dst_regs( inst->Opcode );
217af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fullinst->Instruction.NumSrcRegs = _mesa_num_inst_src_regs( inst->Opcode );
218af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
219af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fulldst = &fullinst->FullDstRegisters[0];
2205d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   fulldst->DstRegister.File = map_register_file( inst->DstReg.File, 0, NULL, GL_FALSE );
221af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fulldst->DstRegister.Index = map_register_file_index(
222af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fulldst->DstRegister.File,
223af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      inst->DstReg.Index,
224af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      inputMapping,
225af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      outputMapping,
2265d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      NULL,
2275d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      GL_FALSE );
228af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fulldst->DstRegister.WriteMask = convert_writemask( inst->DstReg.WriteMask );
229af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
2305d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   for (i = 0; i < fullinst->Instruction.NumSrcRegs; i++) {
231af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      GLuint j;
232af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
233af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullsrc = &fullinst->FullSrcRegisters[i];
2345d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      fullsrc->SrcRegister.File = map_register_file(
2355d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         inst->SrcReg[i].File,
2365d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         inst->SrcReg[i].Index,
2375d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         immediateMapping,
2385d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         indirectAccess );
239af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullsrc->SrcRegister.Index = map_register_file_index(
240af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegister.File,
241af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         inst->SrcReg[i].Index,
242af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         inputMapping,
243af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         outputMapping,
2445d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         immediateMapping,
2455d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         indirectAccess );
246af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
247ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz
24893f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul      /* swizzle (ext swizzle also depends on negation) */
24993f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul      {
25093f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul         GLuint swz[4];
25193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul         GLboolean extended = (inst->SrcReg[i].NegateBase != NEGATE_NONE &&
25293f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul                               inst->SrcReg[i].NegateBase != NEGATE_XYZW);
25393f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul         for( j = 0; j < 4; j++ ) {
25493f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            swz[j] = GET_SWZ( inst->SrcReg[i].Swizzle, j );
25593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            if (swz[j] > SWIZZLE_W)
25693f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul               extended = GL_TRUE;
25793f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul         }
25893f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul         if (extended) {
25993f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            for (j = 0; j < 4; j++) {
26093f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul               tgsi_util_set_src_register_extswizzle(&fullsrc->SrcRegisterExtSwz,
26193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul                                                     swz[j], j);
26293f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            }
263af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
264af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         else {
26593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            for (j = 0; j < 4; j++) {
26693f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul               tgsi_util_set_src_register_swizzle(&fullsrc->SrcRegister,
26793f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul                                                  swz[j], j);
26893f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            }
269af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
270af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
271af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
272af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].NegateBase == NEGATE_XYZW ) {
273af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegister.Negate = 1;
274af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
275af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      else if( inst->SrcReg[i].NegateBase != NEGATE_NONE ) {
276af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_X ) {
277af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateX = 1;
278af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
279af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_Y ) {
280af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateY = 1;
281af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
282af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_Z ) {
283af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateZ = 1;
284af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
285af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_W ) {
286af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateW = 1;
287af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
288af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
289af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
290af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].Abs ) {
291af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterExtMod.Absolute = 1;
292af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
293af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
294af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].NegateAbs ) {
295af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterExtMod.Negate = 1;
296af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
297af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
298af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].RelAddr ) {
299af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegister.Indirect = 1;
300af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
301af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterInd.File = TGSI_FILE_ADDRESS;
302af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterInd.Index = 0;
303af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
304af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
305af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
306af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( inst->Opcode ) {
307af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ARL:
308af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ARL;
309af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
310af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ABS:
311af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ABS;
312af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
313af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ADD:
314af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ADD;
315af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
316af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BGNLOOP:
317af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BGNLOOP2;
318af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
319af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
320af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BGNSUB:
321af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BGNSUB;
322e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      *insideSubroutine = GL_TRUE;
323af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
324af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BRA:
325af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BRA;
326af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
327af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BRK:
328af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BRK;
329af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
330af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_CAL:
331af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_CAL;
332af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
333af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
334af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_CMP:
335af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_CMP;
336af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
337af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_CONT:
338af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_CONT;
339af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
340af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_COS:
341af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_COS;
342af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
343af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DDX:
344af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DDX;
345af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
346af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DDY:
347af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DDY;
348af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
3498343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul   case OPCODE_DP2:
3508343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul      fullinst->Instruction.Opcode = TGSI_OPCODE_DP2;
3518343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul      break;
3528343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul   case OPCODE_DP2A:
3538343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul      fullinst->Instruction.Opcode = TGSI_OPCODE_DP2A;
3548343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul      break;
355af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DP3:
356af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DP3;
357af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
358af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DP4:
359af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DP4;
360af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
361af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DPH:
362af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DPH;
363af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
364af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DST:
365af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DST;
366af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
367af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ELSE:
368af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ELSE;
369af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
370af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
371af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ENDIF:
372af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDIF;
373af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
374af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ENDLOOP:
375af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDLOOP2;
376af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
377af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
378af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ENDSUB:
379af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDSUB;
380e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      *insideSubroutine = GL_FALSE;
381af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
382af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_EX2:
383af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_EX2;
384af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
385af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_EXP:
386af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_EXP;
387af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
388af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_FLR:
389af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_FLR;
390af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
391af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_FRC:
392af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_FRC;
393af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
394af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_IF:
395af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_IF;
396af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
397af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
3983225bc84932f08a52db7025367ae206a9d2f8fefBrian Paul   case OPCODE_TRUNC:
3993225bc84932f08a52db7025367ae206a9d2f8fefBrian Paul      fullinst->Instruction.Opcode = TGSI_OPCODE_TRUNC;
400af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
401af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_KIL:
402e7e992b12ab3717eadaf055fe2fab88c3be8a092Michal Krol      /* conditional */
403e7e992b12ab3717eadaf055fe2fab88c3be8a092Michal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_KIL;
404af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
405af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_KIL_NV:
406e7e992b12ab3717eadaf055fe2fab88c3be8a092Michal Krol      /* predicated */
407af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert(inst->DstReg.CondMask == COND_TR);
408e7e992b12ab3717eadaf055fe2fab88c3be8a092Michal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_KILP;
409af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
410af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_LG2:
411af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_LG2;
412af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
413af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_LOG:
414af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_LOG;
415af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
416af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_LIT:
417af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_LIT;
418af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
419af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_LRP:
420af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_LRP;
421af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
422af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_MAD:
423af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_MAD;
424af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
425af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_MAX:
426af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_MAX;
427af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
428af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_MIN:
429af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_MIN;
430af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
431af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_MOV:
432af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_MOV;
433af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
434af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_MUL:
435af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_MUL;
436af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
437af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_NOISE1:
438af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE1;
439af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
440af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_NOISE2:
441af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE2;
442af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
443af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_NOISE3:
444af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE3;
445af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
446af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_NOISE4:
447af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE4;
448af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
449af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_NOP:
450af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_NOP;
451af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
4528343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul   case OPCODE_NRM3:
4538343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul      fullinst->Instruction.Opcode = TGSI_OPCODE_NRM;
4548343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul      break;
4558343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul   case OPCODE_NRM4:
4568343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul      fullinst->Instruction.Opcode = TGSI_OPCODE_NRM4;
4578343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul      break;
458af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_POW:
459af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_POW;
460af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
461af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_RCP:
462af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_RCP;
463af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
464af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_RET:
465e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      /* If RET is used inside main (not a real subroutine) we may want
466e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian       * to execute END instead of RET.  TBD...
467e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian       */
468e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      if (1 /*  *insideSubroutine */) {
469e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian         fullinst->Instruction.Opcode = TGSI_OPCODE_RET;
470e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      }
471e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      else {
472e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian         /* inside main() pseudo-function */
473e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian         fullinst->Instruction.Opcode = TGSI_OPCODE_END;
474e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      }
475af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
476af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_RSQ:
477af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_RSQ;
478af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      tgsi_util_set_full_src_register_sign_mode(
479af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         &fullinst->FullSrcRegisters[0],
480af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         TGSI_UTIL_SIGN_CLEAR );
481af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
482af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SCS:
483af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SCS;
484af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XY;
485af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
486af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SEQ:
487af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SEQ;
488af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
489af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SGE:
490af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SGE;
491af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
492af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SGT:
493af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SGT;
494af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
495af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SIN:
496af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SIN;
497af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
498af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SLE:
499af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SLE;
500af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
501af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SLT:
502af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SLT;
503af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
504af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SNE:
505af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SNE;
506af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
5078343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul   case OPCODE_SSG:
5088343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul      fullinst->Instruction.Opcode = TGSI_OPCODE_SSG;
5098343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul      break;
510af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SUB:
511af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SUB;
512af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
513af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SWZ:
514af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SWZ;
515af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
516af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TEX:
517af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* ordinary texture lookup */
518af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TEX;
519af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
520af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
521af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
522af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
523af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
524af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXB:
525af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with LOD bias */
526af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TXB;
527af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
528af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
529af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
530af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
531af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
532af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXD:
533af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with explicit partial derivatives */
534af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TXD;
535af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 4;
536af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
537af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* src[0] = coord, src[1] = d[strq]/dx, src[2] = d[strq]/dy */
538af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[3].SrcRegister.File = TGSI_FILE_SAMPLER;
539af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[3].SrcRegister.Index = inst->TexSrcUnit;
540af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
541af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXL:
542af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with explicit LOD */
543af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TXL;
544af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
545af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
546af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
547af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
548af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
549af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXP:
550af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with divide by Q component */
551af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* convert to TEX w/ special flag for division */
552a2b917c1cdb9cdd9b016e5cb9637e90c58fa911bBrian      fullinst->Instruction.Opcode = TGSI_OPCODE_TXP;
553af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
554af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
555af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
556af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
557af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
558af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_XPD:
559af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_XPD;
560af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XYZ;
561af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
562af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_END:
5631575763a6f57d1f13c707b709f188b0617c8955aBrian      fullinst->Instruction.Opcode = TGSI_OPCODE_END;
564af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
565af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
566af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
567af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
568af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
569af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
570af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
571af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param usage_mask  bitfield of TGSI_WRITEMASK_{XYZW} tokens
572af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
573af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration
574af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_input_decl(
575af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint index,
576e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol   GLboolean interpolate_info,
577af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint interpolate,
578af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint usage_mask,
579af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLboolean semantic_info,
580af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint semantic_name,
581c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul   GLbitfield semantic_index,
582c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul   GLbitfield input_flags)
583af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
584af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_declaration decl;
585af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
586af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert(semantic_name < TGSI_SEMANTIC_COUNT);
587af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
588af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl = tgsi_default_full_declaration();
589af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.File = TGSI_FILE_INPUT;
590af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.UsageMask = usage_mask;
591af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.Semantic = semantic_info;
592a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.First = index;
593a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.Last = index;
594af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   if (semantic_info) {
595af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      decl.Semantic.SemanticName = semantic_name;
596af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      decl.Semantic.SemanticIndex = semantic_index;
597af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
598e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol   if (interpolate_info) {
599a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol      decl.Declaration.Interpolate = interpolate;
600e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol   }
601c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul   if (input_flags & PROG_PARAM_BIT_CENTROID)
602c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul      decl.Declaration.Centroid = 1;
603c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul   if (input_flags & PROG_PARAM_BIT_INVARIANT)
604c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul      decl.Declaration.Invariant = 1;
605af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
606af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return decl;
607af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
608af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
609af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
610af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param usage_mask  bitfield of TGSI_WRITEMASK_{XYZW} tokens
611af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
612af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration
613af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_output_decl(
614af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint index,
615af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint semantic_name,
616af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint semantic_index,
617c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul   GLuint usage_mask,
618c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul   GLbitfield output_flags)
619af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
620af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_declaration decl;
621af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
622af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert(semantic_name < TGSI_SEMANTIC_COUNT);
623af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
624af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl = tgsi_default_full_declaration();
625af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.File = TGSI_FILE_OUTPUT;
626af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.UsageMask = usage_mask;
627af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.Semantic = 1;
628a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.First = index;
629a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.Last = index;
630af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Semantic.SemanticName = semantic_name;
631af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Semantic.SemanticIndex = semantic_index;
632c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul   if (output_flags & PROG_PARAM_BIT_CENTROID)
633c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul      decl.Declaration.Centroid = 1;
634c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul   if (output_flags & PROG_PARAM_BIT_INVARIANT)
635c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul      decl.Declaration.Invariant = 1;
636af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
637af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return decl;
638af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
639af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
640af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
641af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration
642af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_temp_decl(
643af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint start_index,
644af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint end_index )
645af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
646af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_declaration decl;
647af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl = tgsi_default_full_declaration();
648af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.File = TGSI_FILE_TEMPORARY;
649a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.First = start_index;
650a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.Last = end_index;
651af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return decl;
652af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
653af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
6543eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krolstatic struct tgsi_full_declaration
6553eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krolmake_addr_decl(
6563eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   GLuint start_index,
6573eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   GLuint end_index )
6583eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol{
6593eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   struct tgsi_full_declaration decl;
6603eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol
6613eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   decl = tgsi_default_full_declaration();
6623eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   decl.Declaration.File = TGSI_FILE_ADDRESS;
6633eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   decl.DeclarationRange.First = start_index;
6643eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   decl.DeclarationRange.Last = end_index;
6653eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   return decl;
6663eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol}
667af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
668814d4ff83a515fe161cfb86c8b1492e2218051feBrianstatic struct tgsi_full_declaration
669814d4ff83a515fe161cfb86c8b1492e2218051feBrianmake_sampler_decl(GLuint index)
670814d4ff83a515fe161cfb86c8b1492e2218051feBrian{
671814d4ff83a515fe161cfb86c8b1492e2218051feBrian   struct tgsi_full_declaration decl;
672814d4ff83a515fe161cfb86c8b1492e2218051feBrian   decl = tgsi_default_full_declaration();
673814d4ff83a515fe161cfb86c8b1492e2218051feBrian   decl.Declaration.File = TGSI_FILE_SAMPLER;
674a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.First = index;
675a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.Last = index;
676814d4ff83a515fe161cfb86c8b1492e2218051feBrian   return decl;
677814d4ff83a515fe161cfb86c8b1492e2218051feBrian}
678814d4ff83a515fe161cfb86c8b1492e2218051feBrian
6798978627ad0e236796758d4912822b3428a649987Brian/** Reference into a constant buffer */
6808978627ad0e236796758d4912822b3428a649987Brianstatic struct tgsi_full_declaration
6818978627ad0e236796758d4912822b3428a649987Brianmake_constant_decl(GLuint first, GLuint last)
6828978627ad0e236796758d4912822b3428a649987Brian{
6838978627ad0e236796758d4912822b3428a649987Brian   struct tgsi_full_declaration decl;
6848978627ad0e236796758d4912822b3428a649987Brian   decl = tgsi_default_full_declaration();
6858978627ad0e236796758d4912822b3428a649987Brian   decl.Declaration.File = TGSI_FILE_CONSTANT;
686a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.First = first;
687a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.Last = last;
6888978627ad0e236796758d4912822b3428a649987Brian   return decl;
6898978627ad0e236796758d4912822b3428a649987Brian}
6908978627ad0e236796758d4912822b3428a649987Brian
691814d4ff83a515fe161cfb86c8b1492e2218051feBrian
692814d4ff83a515fe161cfb86c8b1492e2218051feBrian
693af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
694af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Find the temporaries which are used in the given program.
695af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
696af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic void
697af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolfind_temporaries(const struct gl_program *program,
698af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                 GLboolean tempsUsed[MAX_PROGRAM_TEMPS])
699af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
700af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint i, j;
701af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
702af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   for (i = 0; i < MAX_PROGRAM_TEMPS; i++)
703af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      tempsUsed[i] = GL_FALSE;
704af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
705af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   for (i = 0; i < program->NumInstructions; i++) {
706af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      const struct prog_instruction *inst = program->Instructions + i;
707af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      const GLuint n = _mesa_num_inst_src_regs( inst->Opcode );
708af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (j = 0; j < n; j++) {
709af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if (inst->SrcReg[j].File == PROGRAM_TEMPORARY)
710af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            tempsUsed[inst->SrcReg[j].Index] = GL_TRUE;
711af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if (inst->DstReg.File == PROGRAM_TEMPORARY)
712af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            tempsUsed[inst->DstReg.Index] = GL_TRUE;
713af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
714af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
715af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
716af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
717af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
718af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
719af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
720af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
721af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Translate Mesa program to TGSI format.
722af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param program  the program to translate
723af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numInputs  number of input registers used
724af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping  maps Mesa fragment program inputs to TGSI generic
725af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *                      input indexes
726af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticName  the TGSI_SEMANTIC flag for each input
727af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticIndex  the semantic index (ex: which texcoord) for each input
728af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param interpMode  the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input
729af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
730af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numOutputs  number of output registers used
731af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping  maps Mesa fragment program outputs to TGSI
732af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *                       generic outputs
733af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticName  the TGSI_SEMANTIC flag for each output
734af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticIndex  the semantic index (ex: which texcoord) for each output
735af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param tokens  array to store translated tokens in
736af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param maxTokens  size of the tokens array
737af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *
738339e7ec6805e6de8794514c0a935081b5d36d38fBrian * \return number of tokens placed in 'tokens' buffer, or zero if error
739af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
740339e7ec6805e6de8794514c0a935081b5d36d38fBrianGLuint
74181234666fcd2cbdc92ba5e14b3bb259929b17549Brian Paulst_translate_mesa_program(
742af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   uint procType,
743af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const struct gl_program *program,
744af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint numInputs,
745af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint inputMapping[],
746af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte inputSemanticName[],
747af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte inputSemanticIndex[],
748af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint interpMode[],
749c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul   const GLbitfield inputFlags[],
750af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint numOutputs,
751af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint outputMapping[],
752af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte outputSemanticName[],
753af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte outputSemanticIndex[],
754c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul   const GLbitfield outputFlags[],
755af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_token *tokens,
756af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint maxTokens )
757af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
758af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint i;
759af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint ti;  /* token index */
760af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_header *header;
761af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_processor *processor;
762af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_instruction fullinst;
763af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint preamble_size = 0;
764af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint immediates[1000];
765af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint numImmediates = 0;
766e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian   GLboolean insideSubroutine = GL_FALSE;
7675d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   GLboolean indirectAccess = GL_FALSE;
768af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
769af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert(procType == TGSI_PROCESSOR_FRAGMENT ||
770af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol          procType == TGSI_PROCESSOR_VERTEX);
771af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
772af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *(struct tgsi_version *) &tokens[0] = tgsi_build_version();
773af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
774af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   header = (struct tgsi_header *) &tokens[1];
775af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *header = tgsi_build_header();
776af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
777af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   processor = (struct tgsi_processor *) &tokens[2];
778af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *processor = tgsi_build_processor( procType, header );
779af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
780af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   ti = 3;
781af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
782af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /*
783af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    * Declare input attributes.
784af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    */
785af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   if (procType == TGSI_PROCESSOR_FRAGMENT) {
786af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numInputs; i++) {
787af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
788e785f190f0d49f0367f7468c22b77962d0f14ea0Brian         fulldecl = make_input_decl(i,
789e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    GL_TRUE, interpMode[i],
790e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    TGSI_WRITEMASK_XYZW,
791e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    GL_TRUE, inputSemanticName[i],
792c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul                                    inputSemanticIndex[i],
793c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul                                    inputFlags[i]);
794e785f190f0d49f0367f7468c22b77962d0f14ea0Brian         ti += tgsi_build_full_declaration(&fulldecl,
795e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                           &tokens[ti],
796e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                           header,
797e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                           maxTokens - ti );
798af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
799af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
800af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   else {
801af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* vertex prog */
802e785f190f0d49f0367f7468c22b77962d0f14ea0Brian      /* XXX: this could probaby be merged with the clause above.
803e785f190f0d49f0367f7468c22b77962d0f14ea0Brian       * the only difference is the semantic tags.
804e785f190f0d49f0367f7468c22b77962d0f14ea0Brian       */
805af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numInputs; i++) {
806af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
807af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fulldecl = make_input_decl(i,
808e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol                                    GL_FALSE, 0,
809af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                    TGSI_WRITEMASK_XYZW,
810c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul                                    GL_FALSE, 0, 0,
811c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul                                    inputFlags[i]);
812af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         ti += tgsi_build_full_declaration(&fulldecl,
813af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           &tokens[ti],
814af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           header,
815af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           maxTokens - ti );
816af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
817af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
818af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
819af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /*
820af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    * Declare output attributes.
821af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    */
822af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   if (procType == TGSI_PROCESSOR_FRAGMENT) {
823af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numOutputs; i++) {
824af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
825af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         switch (outputSemanticName[i]) {
826af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         case TGSI_SEMANTIC_POSITION:
827af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fulldecl = make_output_decl(i,
82890b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        TGSI_SEMANTIC_POSITION, /* Z / Depth */
82990b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        outputSemanticIndex[i],
830c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul                                        TGSI_WRITEMASK_Z,
831c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul                                        outputFlags[i]);
832af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            break;
833af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         case TGSI_SEMANTIC_COLOR:
834af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fulldecl = make_output_decl(i,
83590b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        TGSI_SEMANTIC_COLOR,
83690b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        outputSemanticIndex[i],
837c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul                                        TGSI_WRITEMASK_XYZW,
838c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul                                        outputFlags[i]);
839af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            break;
840af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         default:
841c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca            assert(0);
842c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca            return 0;
843af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
844af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         ti += tgsi_build_full_declaration(&fulldecl,
845af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           &tokens[ti],
846af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           header,
847af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           maxTokens - ti );
848af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
849af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
850af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   else {
851af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* vertex prog */
852af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numOutputs; i++) {
853af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
854af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fulldecl = make_output_decl(i,
855af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                     outputSemanticName[i],
856af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                     outputSemanticIndex[i],
857c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul                                     TGSI_WRITEMASK_XYZW,
858c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul                                     outputFlags[i]);
859af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         ti += tgsi_build_full_declaration(&fulldecl,
860af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           &tokens[ti],
861af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           header,
862af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           maxTokens - ti );
863af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
864af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
865af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
866af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /* temporary decls */
867af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   {
868af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      GLboolean tempsUsed[MAX_PROGRAM_TEMPS + 1];
869af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      GLboolean inside_range = GL_FALSE;
870bf1e120b318ba8cbda7316fb8862acd44a3b459fKeith Whitwell      GLuint start_range = 0;
871af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
872af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      find_temporaries(program, tempsUsed);
873af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      tempsUsed[MAX_PROGRAM_TEMPS] = GL_FALSE;
874af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < MAX_PROGRAM_TEMPS + 1; i++) {
875af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if (tempsUsed[i] && !inside_range) {
876af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            inside_range = GL_TRUE;
877af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            start_range = i;
878af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
879af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         else if (!tempsUsed[i] && inside_range) {
880af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            struct tgsi_full_declaration fulldecl;
881af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
882af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            inside_range = GL_FALSE;
883af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fulldecl = make_temp_decl( start_range, i - 1 );
884af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            ti += tgsi_build_full_declaration(
8855d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &fulldecl,
8865d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &tokens[ti],
8875d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               header,
8885d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               maxTokens - ti );
889af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
890af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
891af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
892af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
8935d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   /* Declare address register.
8943eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   */
8953eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   if (program->NumAddressRegs > 0) {
8963eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol      struct tgsi_full_declaration fulldecl;
8973eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol
8983eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol      assert( program->NumAddressRegs == 1 );
8993eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol
9003eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol      fulldecl = make_addr_decl( 0, 0 );
9013eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol      ti += tgsi_build_full_declaration(
9023eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol         &fulldecl,
9033eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol         &tokens[ti],
9043eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol         header,
9053eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol         maxTokens - ti );
9065d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol
9075d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      indirectAccess = GL_TRUE;
9083eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   }
9093eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol
910af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /* immediates/literals */
91121c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell   memset(immediates, ~0, sizeof(immediates));
91225e2b8d669e01aac551276af7f34d8708d8cb9d0José Fonseca
9135d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   /* Emit immediates only when there is no address register in use.
9145d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol    * FIXME: Be smarter and recognize param arrays -- indirect addressing is
9155d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol    *        only valid within the referenced array.
9165d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol    */
9175d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   if (program->Parameters && !indirectAccess) {
9185d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      for (i = 0; i < program->Parameters->NumParameters; i++) {
9195d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         if (program->Parameters->Parameters[i].Type == PROGRAM_CONSTANT) {
9205d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            struct tgsi_full_immediate fullimm;
9215d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol
9225d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            fullimm = make_immediate( program->Parameters->ParameterValues[i], 4 );
9235d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            ti += tgsi_build_full_immediate(
9245d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &fullimm,
9255d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &tokens[ti],
9265d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               header,
9275d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               maxTokens - ti );
9285d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            immediates[i] = numImmediates;
9295d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            numImmediates++;
9305d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         }
931af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
932af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
933af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
9348978627ad0e236796758d4912822b3428a649987Brian   /* constant buffer refs */
9355d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   if (program->Parameters) {
9368978627ad0e236796758d4912822b3428a649987Brian      GLint start = -1, end = -1;
9378978627ad0e236796758d4912822b3428a649987Brian
9385d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      for (i = 0; i < program->Parameters->NumParameters; i++) {
9398978627ad0e236796758d4912822b3428a649987Brian         GLboolean emit = (i == program->Parameters->NumParameters - 1);
9405d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         GLboolean matches;
9418978627ad0e236796758d4912822b3428a649987Brian
9428978627ad0e236796758d4912822b3428a649987Brian         switch (program->Parameters->Parameters[i].Type) {
9438978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_ENV_PARAM:
9448978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_STATE_VAR:
9458978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_NAMED_PARAM:
9468978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_UNIFORM:
9475d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            matches = GL_TRUE;
9485d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            break;
9495d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         case PROGRAM_CONSTANT:
9505d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            matches = indirectAccess;
9515d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            break;
9525d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         default:
9535d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            matches = GL_FALSE;
9545d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         }
9555d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol
9565d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         if (matches) {
9578978627ad0e236796758d4912822b3428a649987Brian            if (start == -1) {
9588978627ad0e236796758d4912822b3428a649987Brian               /* begin a sequence */
9598978627ad0e236796758d4912822b3428a649987Brian               start = i;
9608978627ad0e236796758d4912822b3428a649987Brian               end = i;
9618978627ad0e236796758d4912822b3428a649987Brian            }
9628978627ad0e236796758d4912822b3428a649987Brian            else {
9638978627ad0e236796758d4912822b3428a649987Brian               /* continue sequence */
9648978627ad0e236796758d4912822b3428a649987Brian               end = i;
9658978627ad0e236796758d4912822b3428a649987Brian            }
9665d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         }
9675d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         else {
9688978627ad0e236796758d4912822b3428a649987Brian            if (start != -1) {
9698978627ad0e236796758d4912822b3428a649987Brian               /* end of sequence */
9708978627ad0e236796758d4912822b3428a649987Brian               emit = GL_TRUE;
9718978627ad0e236796758d4912822b3428a649987Brian            }
9728978627ad0e236796758d4912822b3428a649987Brian         }
9738978627ad0e236796758d4912822b3428a649987Brian
9748978627ad0e236796758d4912822b3428a649987Brian         if (emit && start >= 0) {
9758978627ad0e236796758d4912822b3428a649987Brian            struct tgsi_full_declaration fulldecl;
9765d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol
9778978627ad0e236796758d4912822b3428a649987Brian            fulldecl = make_constant_decl( start, end );
9785d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            ti += tgsi_build_full_declaration(
9795d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &fulldecl,
9805d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &tokens[ti],
9815d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               header,
9825d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               maxTokens - ti );
9838978627ad0e236796758d4912822b3428a649987Brian            start = end = -1;
9848978627ad0e236796758d4912822b3428a649987Brian         }
9858978627ad0e236796758d4912822b3428a649987Brian      }
9868978627ad0e236796758d4912822b3428a649987Brian   }
9878978627ad0e236796758d4912822b3428a649987Brian
988814d4ff83a515fe161cfb86c8b1492e2218051feBrian   /* texture samplers */
989814d4ff83a515fe161cfb86c8b1492e2218051feBrian   for (i = 0; i < 8; i++) {
990814d4ff83a515fe161cfb86c8b1492e2218051feBrian      if (program->SamplersUsed & (1 << i)) {
991814d4ff83a515fe161cfb86c8b1492e2218051feBrian         struct tgsi_full_declaration fulldecl;
9925d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol
993814d4ff83a515fe161cfb86c8b1492e2218051feBrian         fulldecl = make_sampler_decl( i );
9945d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         ti += tgsi_build_full_declaration(
9955d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            &fulldecl,
9965d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            &tokens[ti],
9975d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            header,
9985d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            maxTokens - ti );
999814d4ff83a515fe161cfb86c8b1492e2218051feBrian      }
1000814d4ff83a515fe161cfb86c8b1492e2218051feBrian   }
1001814d4ff83a515fe161cfb86c8b1492e2218051feBrian
10025d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   for (i = 0; i < program->NumInstructions; i++) {
1003af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      compile_instruction(
10045d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         &program->Instructions[i],
10055d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         &fullinst,
10065d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         inputMapping,
10075d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         outputMapping,
10085d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         immediates,
10095d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         indirectAccess,
10105d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         preamble_size,
10115d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         procType,
10125d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         &insideSubroutine );
1013af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
1014af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      ti += tgsi_build_full_instruction(
1015af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         &fullinst,
1016af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         &tokens[ti],
1017af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         header,
1018af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         maxTokens - ti );
1019af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
1020af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
1021358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#if DEBUG
1022358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz   if(!tgsi_sanity_check(tokens)) {
1023f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz      debug_printf("Due to sanity check failure(s) above the following shader program is invalid:\n");
1024f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz      debug_printf("\nOriginal program:\n%s", program->String);
1025f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz      debug_printf("\nMesa program:\n");
1026f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz      _mesa_print_program(program);
1027f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz      debug_printf("\nTGSI program:\n");
1028358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz      tgsi_dump(tokens, 0);
1029358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz      assert(0);
1030358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz   }
1031358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#endif
1032358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz
1033339e7ec6805e6de8794514c0a935081b5d36d38fBrian   return ti;
1034af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
1035