st_mesa_to_tgsi.c revision 095ca0acd8019e8f2da89f9320b92ce4a96a140e
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;
80af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_IMMEDIATE;
81af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_INPUT:
82af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_INPUT;
83af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_OUTPUT:
84af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_OUTPUT;
85af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_ADDRESS:
86af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_ADDRESS;
87af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
88af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
89af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_NULL;
90af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
91af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
92af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
93af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
94af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa register file index to TGSI index.
95af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Take special care when processing input and output indices.
96af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param file  one of TGSI_FILE_x
97af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param index  the mesa register file index
98af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping  maps Mesa input indexes to TGSI input indexes
99af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping  maps Mesa output indexes to TGSI output indexes
100af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
101af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
102af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_register_file_index(
103af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint file,
104af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint index,
105af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint inputMapping[],
106af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint outputMapping[],
1075d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   const GLuint immediateMapping[],
1085d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   GLboolean indirectAccess )
109af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
110af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( file ) {
111af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TGSI_FILE_INPUT:
112af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* inputs are mapped according to the user-defined map */
113af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return inputMapping[index];
114af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
115af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TGSI_FILE_OUTPUT:
116af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return outputMapping[index];
117af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
118af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TGSI_FILE_IMMEDIATE:
1195d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      if (indirectAccess)
1205d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         return index;
121af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return immediateMapping[index];
122af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
123af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
124af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return index;
125af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
126af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
127af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
128af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/*
129af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa texture target to TGSI texture target.
130af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
131af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
132af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_texture_target(
133af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint textarget )
134af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
135af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( textarget ) {
136af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_1D_INDEX:
137af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_1D;
138af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_2D_INDEX:
139af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_2D;
140af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_3D_INDEX:
141af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_3D;
142af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_CUBE_INDEX:
143af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_CUBE;
144af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_RECT_INDEX:
145af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_RECT;
146af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
147af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
148af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
149af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
150af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return TGSI_TEXTURE_1D;
151af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
152af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
153af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
154af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolconvert_sat(
155af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint sat )
156af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
157af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( sat ) {
158af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case SATURATE_OFF:
159af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_NONE;
160af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case SATURATE_ZERO_ONE:
161af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_ZERO_ONE;
162af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case SATURATE_PLUS_MINUS_ONE:
163af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_MINUS_PLUS_ONE;
164af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
165af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
166af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_NONE;
167af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
168af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
169af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
170af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
171af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolconvert_writemask(
172af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint writemask )
173af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
174af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_X == TGSI_WRITEMASK_X );
175af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_Y == TGSI_WRITEMASK_Y );
176af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_Z == TGSI_WRITEMASK_Z );
177af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_W == TGSI_WRITEMASK_W );
178af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( (writemask & ~TGSI_WRITEMASK_XYZW) == 0 );
179af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
180af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return writemask;
181af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
182af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
183af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_immediate
184af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_immediate(const float *value, uint size)
185af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
186af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_immediate imm;
18781dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol
18881dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol   imm = tgsi_default_full_immediate();
18981dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol   imm.Immediate.Size += size;
190af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   imm.Immediate.DataType = TGSI_IMM_FLOAT32;
19181dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol   imm.u.Pointer = value;
192af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return imm;
193af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
194af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
195af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic void
196af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolcompile_instruction(
197af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const struct prog_instruction *inst,
198af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_instruction *fullinst,
199af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint inputMapping[],
200af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint outputMapping[],
201af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint immediateMapping[],
2025d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   GLboolean indirectAccess,
203af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint preamble_size,
204e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian   GLuint processor,
205e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian   GLboolean *insideSubroutine)
206af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
207af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint i;
208af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_dst_register *fulldst;
209af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_src_register *fullsrc;
210af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
211af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *fullinst = tgsi_default_full_instruction();
212af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
213af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fullinst->Instruction.Saturate = convert_sat( inst->SaturateMode );
214af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fullinst->Instruction.NumDstRegs = _mesa_num_inst_dst_regs( inst->Opcode );
215af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fullinst->Instruction.NumSrcRegs = _mesa_num_inst_src_regs( inst->Opcode );
216af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
217af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fulldst = &fullinst->FullDstRegisters[0];
2185d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   fulldst->DstRegister.File = map_register_file( inst->DstReg.File, 0, NULL, GL_FALSE );
219af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fulldst->DstRegister.Index = map_register_file_index(
220af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fulldst->DstRegister.File,
221af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      inst->DstReg.Index,
222af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      inputMapping,
223af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      outputMapping,
2245d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      NULL,
2255d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      GL_FALSE );
226af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fulldst->DstRegister.WriteMask = convert_writemask( inst->DstReg.WriteMask );
227af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
2285d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   for (i = 0; i < fullinst->Instruction.NumSrcRegs; i++) {
229af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      GLuint j;
230af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
231af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullsrc = &fullinst->FullSrcRegisters[i];
2325d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      fullsrc->SrcRegister.File = map_register_file(
2335d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         inst->SrcReg[i].File,
2345d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         inst->SrcReg[i].Index,
2355d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         immediateMapping,
2365d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         indirectAccess );
237af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullsrc->SrcRegister.Index = map_register_file_index(
238af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegister.File,
239af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         inst->SrcReg[i].Index,
240af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         inputMapping,
241af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         outputMapping,
2425d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         immediateMapping,
2435d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         indirectAccess );
244af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
245ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz      /**
246ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz       * This not at all the correct solution.
247ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz       * FIXME: Roll this up in the above map functions
248ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz       */
249ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz      if (fullsrc->SrcRegister.File == TGSI_FILE_IMMEDIATE && fullsrc->SrcRegister.Index == ~0) {
250ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz         fullsrc->SrcRegister.File = TGSI_FILE_CONSTANT;
251ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz         fullsrc->SrcRegister.Index = inst->SrcReg[i].Index;
252ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz      }
253ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz
25493f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul      /* swizzle (ext swizzle also depends on negation) */
25593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul      {
25693f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul         GLuint swz[4];
25793f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul         GLboolean extended = (inst->SrcReg[i].NegateBase != NEGATE_NONE &&
25893f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul                               inst->SrcReg[i].NegateBase != NEGATE_XYZW);
25993f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul         for( j = 0; j < 4; j++ ) {
26093f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            swz[j] = GET_SWZ( inst->SrcReg[i].Swizzle, j );
26193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            if (swz[j] > SWIZZLE_W)
26293f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul               extended = GL_TRUE;
26393f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul         }
26493f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul         if (extended) {
26593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            for (j = 0; j < 4; j++) {
26693f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul               tgsi_util_set_src_register_extswizzle(&fullsrc->SrcRegisterExtSwz,
26793f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul                                                     swz[j], j);
26893f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            }
269af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
270af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         else {
27193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            for (j = 0; j < 4; j++) {
27293f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul               tgsi_util_set_src_register_swizzle(&fullsrc->SrcRegister,
27393f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul                                                  swz[j], j);
27493f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul            }
275af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
276af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
277af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
278af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].NegateBase == NEGATE_XYZW ) {
279af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegister.Negate = 1;
280af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
281af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      else if( inst->SrcReg[i].NegateBase != NEGATE_NONE ) {
282af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_X ) {
283af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateX = 1;
284af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
285af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_Y ) {
286af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateY = 1;
287af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
288af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_Z ) {
289af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateZ = 1;
290af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
291af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_W ) {
292af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateW = 1;
293af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
294af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
295af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
296af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].Abs ) {
297af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterExtMod.Absolute = 1;
298af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
299af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
300af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].NegateAbs ) {
301af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterExtMod.Negate = 1;
302af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
303af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
304af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].RelAddr ) {
305af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegister.Indirect = 1;
306af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
307af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterInd.File = TGSI_FILE_ADDRESS;
308af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterInd.Index = 0;
309af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
310af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
311af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
312af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( inst->Opcode ) {
313af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ARL:
314af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ARL;
315af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
316af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ABS:
317af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ABS;
318af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
319af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ADD:
320af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ADD;
321af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
322af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BGNLOOP:
323af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BGNLOOP2;
324af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
325af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
326af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BGNSUB:
327af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BGNSUB;
328e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      *insideSubroutine = GL_TRUE;
329af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
330af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BRA:
331af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BRA;
332af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
333af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BRK:
334af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BRK;
335af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
336af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_CAL:
337af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_CAL;
338af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
339af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
340af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_CMP:
341af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_CMP;
342af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
343af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_CONT:
344af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_CONT;
345af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
346af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_COS:
347af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_COS;
348af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
349af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DDX:
350af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DDX;
351af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
352af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DDY:
353af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DDY;
354af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      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;
398af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_INT:
399af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_INT;
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;
452af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_POW:
453af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_POW;
454af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
455af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_RCP:
456af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_RCP;
457af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
458af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_RET:
459e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      /* If RET is used inside main (not a real subroutine) we may want
460e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian       * to execute END instead of RET.  TBD...
461e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian       */
462e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      if (1 /*  *insideSubroutine */) {
463e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian         fullinst->Instruction.Opcode = TGSI_OPCODE_RET;
464e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      }
465e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      else {
466e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian         /* inside main() pseudo-function */
467e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian         fullinst->Instruction.Opcode = TGSI_OPCODE_END;
468e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      }
469af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
470af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_RSQ:
471af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_RSQ;
472af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      tgsi_util_set_full_src_register_sign_mode(
473af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         &fullinst->FullSrcRegisters[0],
474af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         TGSI_UTIL_SIGN_CLEAR );
475af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
476af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SCS:
477af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SCS;
478af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XY;
479af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
480af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SEQ:
481af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SEQ;
482af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
483af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SGE:
484af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SGE;
485af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
486af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SGT:
487af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SGT;
488af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
489af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SIN:
490af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SIN;
491af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
492af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SLE:
493af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SLE;
494af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
495af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SLT:
496af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SLT;
497af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
498af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SNE:
499af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SNE;
500af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
501af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SUB:
502af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SUB;
503af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
504af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SWZ:
505af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SWZ;
506af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
507af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TEX:
508af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* ordinary texture lookup */
509af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TEX;
510af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
511af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
512af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
513af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
514af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
515af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXB:
516af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with LOD bias */
517af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TXB;
518af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
519af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
520af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
521af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
522af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
523af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXD:
524af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with explicit partial derivatives */
525af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TXD;
526af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 4;
527af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
528af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* src[0] = coord, src[1] = d[strq]/dx, src[2] = d[strq]/dy */
529af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[3].SrcRegister.File = TGSI_FILE_SAMPLER;
530af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[3].SrcRegister.Index = inst->TexSrcUnit;
531af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
532af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXL:
533af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with explicit LOD */
534af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TXL;
535af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
536af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
537af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
538af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
539af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
540af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXP:
541af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with divide by Q component */
542af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* convert to TEX w/ special flag for division */
543a2b917c1cdb9cdd9b016e5cb9637e90c58fa911bBrian      fullinst->Instruction.Opcode = TGSI_OPCODE_TXP;
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_XPD:
550af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_XPD;
551af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XYZ;
552af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
553af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_END:
5541575763a6f57d1f13c707b709f188b0617c8955aBrian      fullinst->Instruction.Opcode = TGSI_OPCODE_END;
555af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
556af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
557af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
558af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
559af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
560af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
561af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
562af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param usage_mask  bitfield of TGSI_WRITEMASK_{XYZW} tokens
563af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
564af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration
565af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_input_decl(
566af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint index,
567e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol   GLboolean interpolate_info,
568af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint interpolate,
569af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint usage_mask,
570af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLboolean semantic_info,
571af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint semantic_name,
572af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLbitfield semantic_index )
573af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
574af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_declaration decl;
575af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
576af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert(semantic_name < TGSI_SEMANTIC_COUNT);
577af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
578af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl = tgsi_default_full_declaration();
579af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.File = TGSI_FILE_INPUT;
580af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.UsageMask = usage_mask;
581af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.Semantic = semantic_info;
582a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.First = index;
583a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.Last = index;
584af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   if (semantic_info) {
585af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      decl.Semantic.SemanticName = semantic_name;
586af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      decl.Semantic.SemanticIndex = semantic_index;
587af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
588e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol   if (interpolate_info) {
589a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol      decl.Declaration.Interpolate = interpolate;
590e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol   }
591af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
592af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return decl;
593af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
594af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
595af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
596af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param usage_mask  bitfield of TGSI_WRITEMASK_{XYZW} tokens
597af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
598af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration
599af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_output_decl(
600af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint index,
601af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint semantic_name,
602af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint semantic_index,
603af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLbitfield usage_mask )
604af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
605af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_declaration decl;
606af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
607af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert(semantic_name < TGSI_SEMANTIC_COUNT);
608af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
609af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl = tgsi_default_full_declaration();
610af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.File = TGSI_FILE_OUTPUT;
611af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.UsageMask = usage_mask;
612af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.Semantic = 1;
613a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.First = index;
614a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.Last = index;
615af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Semantic.SemanticName = semantic_name;
616af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Semantic.SemanticIndex = semantic_index;
617af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
618af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return decl;
619af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
620af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
621af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
622af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration
623af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_temp_decl(
624af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint start_index,
625af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint end_index )
626af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
627af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_declaration decl;
628af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl = tgsi_default_full_declaration();
629af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.File = TGSI_FILE_TEMPORARY;
630a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.First = start_index;
631a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.Last = end_index;
632af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return decl;
633af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
634af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
6353eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krolstatic struct tgsi_full_declaration
6363eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krolmake_addr_decl(
6373eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   GLuint start_index,
6383eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   GLuint end_index )
6393eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol{
6403eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   struct tgsi_full_declaration decl;
6413eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol
6423eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   decl = tgsi_default_full_declaration();
6433eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   decl.Declaration.File = TGSI_FILE_ADDRESS;
6443eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   decl.DeclarationRange.First = start_index;
6453eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   decl.DeclarationRange.Last = end_index;
6463eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   return decl;
6473eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol}
648af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
649814d4ff83a515fe161cfb86c8b1492e2218051feBrianstatic struct tgsi_full_declaration
650814d4ff83a515fe161cfb86c8b1492e2218051feBrianmake_sampler_decl(GLuint index)
651814d4ff83a515fe161cfb86c8b1492e2218051feBrian{
652814d4ff83a515fe161cfb86c8b1492e2218051feBrian   struct tgsi_full_declaration decl;
653814d4ff83a515fe161cfb86c8b1492e2218051feBrian   decl = tgsi_default_full_declaration();
654814d4ff83a515fe161cfb86c8b1492e2218051feBrian   decl.Declaration.File = TGSI_FILE_SAMPLER;
655a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.First = index;
656a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.Last = index;
657814d4ff83a515fe161cfb86c8b1492e2218051feBrian   return decl;
658814d4ff83a515fe161cfb86c8b1492e2218051feBrian}
659814d4ff83a515fe161cfb86c8b1492e2218051feBrian
6608978627ad0e236796758d4912822b3428a649987Brian/** Reference into a constant buffer */
6618978627ad0e236796758d4912822b3428a649987Brianstatic struct tgsi_full_declaration
6628978627ad0e236796758d4912822b3428a649987Brianmake_constant_decl(GLuint first, GLuint last)
6638978627ad0e236796758d4912822b3428a649987Brian{
6648978627ad0e236796758d4912822b3428a649987Brian   struct tgsi_full_declaration decl;
6658978627ad0e236796758d4912822b3428a649987Brian   decl = tgsi_default_full_declaration();
6668978627ad0e236796758d4912822b3428a649987Brian   decl.Declaration.File = TGSI_FILE_CONSTANT;
667a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.First = first;
668a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol   decl.DeclarationRange.Last = last;
6698978627ad0e236796758d4912822b3428a649987Brian   return decl;
6708978627ad0e236796758d4912822b3428a649987Brian}
6718978627ad0e236796758d4912822b3428a649987Brian
672814d4ff83a515fe161cfb86c8b1492e2218051feBrian
673814d4ff83a515fe161cfb86c8b1492e2218051feBrian
674af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
675af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Find the temporaries which are used in the given program.
676af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
677af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic void
678af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolfind_temporaries(const struct gl_program *program,
679af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                 GLboolean tempsUsed[MAX_PROGRAM_TEMPS])
680af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
681af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint i, j;
682af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
683af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   for (i = 0; i < MAX_PROGRAM_TEMPS; i++)
684af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      tempsUsed[i] = GL_FALSE;
685af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
686af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   for (i = 0; i < program->NumInstructions; i++) {
687af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      const struct prog_instruction *inst = program->Instructions + i;
688af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      const GLuint n = _mesa_num_inst_src_regs( inst->Opcode );
689af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (j = 0; j < n; j++) {
690af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if (inst->SrcReg[j].File == PROGRAM_TEMPORARY)
691af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            tempsUsed[inst->SrcReg[j].Index] = GL_TRUE;
692af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if (inst->DstReg.File == PROGRAM_TEMPORARY)
693af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            tempsUsed[inst->DstReg.Index] = GL_TRUE;
694af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
695af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
696af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
697af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
698af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
699af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
700af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
701af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
702af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Translate Mesa program to TGSI format.
703af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param program  the program to translate
704af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numInputs  number of input registers used
705af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping  maps Mesa fragment program inputs to TGSI generic
706af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *                      input indexes
707af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticName  the TGSI_SEMANTIC flag for each input
708af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticIndex  the semantic index (ex: which texcoord) for each input
709af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param interpMode  the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input
710af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
711af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numOutputs  number of output registers used
712af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping  maps Mesa fragment program outputs to TGSI
713af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *                       generic outputs
714af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticName  the TGSI_SEMANTIC flag for each output
715af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticIndex  the semantic index (ex: which texcoord) for each output
716af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param tokens  array to store translated tokens in
717af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param maxTokens  size of the tokens array
718af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *
719339e7ec6805e6de8794514c0a935081b5d36d38fBrian * \return number of tokens placed in 'tokens' buffer, or zero if error
720af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
721339e7ec6805e6de8794514c0a935081b5d36d38fBrianGLuint
722af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Kroltgsi_translate_mesa_program(
723af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   uint procType,
724af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const struct gl_program *program,
725af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint numInputs,
726af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint inputMapping[],
727af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte inputSemanticName[],
728af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte inputSemanticIndex[],
729af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint interpMode[],
730af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint numOutputs,
731af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint outputMapping[],
732af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte outputSemanticName[],
733af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte outputSemanticIndex[],
734af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_token *tokens,
735af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint maxTokens )
736af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
737af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint i;
738af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint ti;  /* token index */
739af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_header *header;
740af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_processor *processor;
741af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_instruction fullinst;
742af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint preamble_size = 0;
743af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint immediates[1000];
744af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint numImmediates = 0;
745e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian   GLboolean insideSubroutine = GL_FALSE;
7465d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   GLboolean indirectAccess = GL_FALSE;
747af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
748af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert(procType == TGSI_PROCESSOR_FRAGMENT ||
749af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol          procType == TGSI_PROCESSOR_VERTEX);
750af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
751af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *(struct tgsi_version *) &tokens[0] = tgsi_build_version();
752af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
753af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   header = (struct tgsi_header *) &tokens[1];
754af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *header = tgsi_build_header();
755af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
756af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   processor = (struct tgsi_processor *) &tokens[2];
757af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *processor = tgsi_build_processor( procType, header );
758af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
759af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   ti = 3;
760af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
761af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /*
762af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    * Declare input attributes.
763af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    */
764af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   if (procType == TGSI_PROCESSOR_FRAGMENT) {
765af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numInputs; i++) {
766af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
767e785f190f0d49f0367f7468c22b77962d0f14ea0Brian         fulldecl = make_input_decl(i,
768e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    GL_TRUE, interpMode[i],
769e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    TGSI_WRITEMASK_XYZW,
770e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    GL_TRUE, inputSemanticName[i],
771e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    inputSemanticIndex[i]);
772e785f190f0d49f0367f7468c22b77962d0f14ea0Brian         ti += tgsi_build_full_declaration(&fulldecl,
773e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                           &tokens[ti],
774e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                           header,
775e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                           maxTokens - ti );
776af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
777af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
778af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   else {
779af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* vertex prog */
780e785f190f0d49f0367f7468c22b77962d0f14ea0Brian      /* XXX: this could probaby be merged with the clause above.
781e785f190f0d49f0367f7468c22b77962d0f14ea0Brian       * the only difference is the semantic tags.
782e785f190f0d49f0367f7468c22b77962d0f14ea0Brian       */
783af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numInputs; i++) {
784af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
785af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fulldecl = make_input_decl(i,
786e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol                                    GL_FALSE, 0,
787af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                    TGSI_WRITEMASK_XYZW,
788e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol                                    GL_FALSE, 0, 0);
789af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         ti += tgsi_build_full_declaration(&fulldecl,
790af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           &tokens[ti],
791af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           header,
792af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           maxTokens - ti );
793af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
794af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
795af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
796af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /*
797af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    * Declare output attributes.
798af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    */
799af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   if (procType == TGSI_PROCESSOR_FRAGMENT) {
800af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numOutputs; i++) {
801af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
802af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         switch (outputSemanticName[i]) {
803af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         case TGSI_SEMANTIC_POSITION:
804af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fulldecl = make_output_decl(i,
80590b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        TGSI_SEMANTIC_POSITION, /* Z / Depth */
80690b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        outputSemanticIndex[i],
807af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                        TGSI_WRITEMASK_Z );
808af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            break;
809af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         case TGSI_SEMANTIC_COLOR:
810af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fulldecl = make_output_decl(i,
81190b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        TGSI_SEMANTIC_COLOR,
81290b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        outputSemanticIndex[i],
813af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                        TGSI_WRITEMASK_XYZW );
814af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            break;
815af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         default:
816c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca            assert(0);
817c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca            return 0;
818af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
819af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         ti += tgsi_build_full_declaration(&fulldecl,
820af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           &tokens[ti],
821af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           header,
822af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           maxTokens - ti );
823af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
824af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
825af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   else {
826af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* vertex prog */
827af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numOutputs; i++) {
828af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
829af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fulldecl = make_output_decl(i,
830af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                     outputSemanticName[i],
831af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                     outputSemanticIndex[i],
832af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                     TGSI_WRITEMASK_XYZW );
833af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         ti += tgsi_build_full_declaration(&fulldecl,
834af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           &tokens[ti],
835af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           header,
836af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           maxTokens - ti );
837af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
838af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
839af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
840af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /* temporary decls */
841af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   {
842af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      GLboolean tempsUsed[MAX_PROGRAM_TEMPS + 1];
843af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      GLboolean inside_range = GL_FALSE;
844bf1e120b318ba8cbda7316fb8862acd44a3b459fKeith Whitwell      GLuint start_range = 0;
845af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
846af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      find_temporaries(program, tempsUsed);
847af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      tempsUsed[MAX_PROGRAM_TEMPS] = GL_FALSE;
848af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < MAX_PROGRAM_TEMPS + 1; i++) {
849af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if (tempsUsed[i] && !inside_range) {
850af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            inside_range = GL_TRUE;
851af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            start_range = i;
852af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
853af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         else if (!tempsUsed[i] && inside_range) {
854af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            struct tgsi_full_declaration fulldecl;
855af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
856af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            inside_range = GL_FALSE;
857af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fulldecl = make_temp_decl( start_range, i - 1 );
858af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            ti += tgsi_build_full_declaration(
8595d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &fulldecl,
8605d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &tokens[ti],
8615d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               header,
8625d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               maxTokens - ti );
863af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
864af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
865af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
866af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
8675d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   /* Declare address register.
8683eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   */
8693eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   if (program->NumAddressRegs > 0) {
8703eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol      struct tgsi_full_declaration fulldecl;
8713eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol
8723eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol      assert( program->NumAddressRegs == 1 );
8733eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol
8743eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol      fulldecl = make_addr_decl( 0, 0 );
8753eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol      ti += tgsi_build_full_declaration(
8763eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol         &fulldecl,
8773eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol         &tokens[ti],
8783eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol         header,
8793eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol         maxTokens - ti );
8805d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol
8815d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      indirectAccess = GL_TRUE;
8823eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol   }
8833eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol
884af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /* immediates/literals */
88521c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell   memset(immediates, ~0, sizeof(immediates));
88625e2b8d669e01aac551276af7f34d8708d8cb9d0José Fonseca
8875d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   /* Emit immediates only when there is no address register in use.
8885d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol    * FIXME: Be smarter and recognize param arrays -- indirect addressing is
8895d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol    *        only valid within the referenced array.
8905d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol    */
8915d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   if (program->Parameters && !indirectAccess) {
8925d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      for (i = 0; i < program->Parameters->NumParameters; i++) {
8935d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         if (program->Parameters->Parameters[i].Type == PROGRAM_CONSTANT) {
8945d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            struct tgsi_full_immediate fullimm;
8955d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol
8965d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            fullimm = make_immediate( program->Parameters->ParameterValues[i], 4 );
8975d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            ti += tgsi_build_full_immediate(
8985d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &fullimm,
8995d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &tokens[ti],
9005d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               header,
9015d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               maxTokens - ti );
9025d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            immediates[i] = numImmediates;
9035d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            numImmediates++;
9045d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         }
905af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
906af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
907af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
9088978627ad0e236796758d4912822b3428a649987Brian   /* constant buffer refs */
9095d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   if (program->Parameters) {
9108978627ad0e236796758d4912822b3428a649987Brian      GLint start = -1, end = -1;
9118978627ad0e236796758d4912822b3428a649987Brian
9125d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol      for (i = 0; i < program->Parameters->NumParameters; i++) {
9138978627ad0e236796758d4912822b3428a649987Brian         GLboolean emit = (i == program->Parameters->NumParameters - 1);
9145d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         GLboolean matches;
9158978627ad0e236796758d4912822b3428a649987Brian
9168978627ad0e236796758d4912822b3428a649987Brian         switch (program->Parameters->Parameters[i].Type) {
9178978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_ENV_PARAM:
9188978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_STATE_VAR:
9198978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_NAMED_PARAM:
9208978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_UNIFORM:
9215d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            matches = GL_TRUE;
9225d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            break;
9235d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         case PROGRAM_CONSTANT:
9245d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            matches = indirectAccess;
9255d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            break;
9265d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         default:
9275d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            matches = GL_FALSE;
9285d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         }
9295d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol
9305d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         if (matches) {
9318978627ad0e236796758d4912822b3428a649987Brian            if (start == -1) {
9328978627ad0e236796758d4912822b3428a649987Brian               /* begin a sequence */
9338978627ad0e236796758d4912822b3428a649987Brian               start = i;
9348978627ad0e236796758d4912822b3428a649987Brian               end = i;
9358978627ad0e236796758d4912822b3428a649987Brian            }
9368978627ad0e236796758d4912822b3428a649987Brian            else {
9378978627ad0e236796758d4912822b3428a649987Brian               /* continue sequence */
9388978627ad0e236796758d4912822b3428a649987Brian               end = i;
9398978627ad0e236796758d4912822b3428a649987Brian            }
9405d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         }
9415d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         else {
9428978627ad0e236796758d4912822b3428a649987Brian            if (start != -1) {
9438978627ad0e236796758d4912822b3428a649987Brian               /* end of sequence */
9448978627ad0e236796758d4912822b3428a649987Brian               emit = GL_TRUE;
9458978627ad0e236796758d4912822b3428a649987Brian            }
9468978627ad0e236796758d4912822b3428a649987Brian         }
9478978627ad0e236796758d4912822b3428a649987Brian
9488978627ad0e236796758d4912822b3428a649987Brian         if (emit && start >= 0) {
9498978627ad0e236796758d4912822b3428a649987Brian            struct tgsi_full_declaration fulldecl;
9505d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol
9518978627ad0e236796758d4912822b3428a649987Brian            fulldecl = make_constant_decl( start, end );
9525d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            ti += tgsi_build_full_declaration(
9535d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &fulldecl,
9545d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               &tokens[ti],
9555d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               header,
9565d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol               maxTokens - ti );
9578978627ad0e236796758d4912822b3428a649987Brian            start = end = -1;
9588978627ad0e236796758d4912822b3428a649987Brian         }
9598978627ad0e236796758d4912822b3428a649987Brian      }
9608978627ad0e236796758d4912822b3428a649987Brian   }
9618978627ad0e236796758d4912822b3428a649987Brian
962814d4ff83a515fe161cfb86c8b1492e2218051feBrian   /* texture samplers */
963814d4ff83a515fe161cfb86c8b1492e2218051feBrian   for (i = 0; i < 8; i++) {
964814d4ff83a515fe161cfb86c8b1492e2218051feBrian      if (program->SamplersUsed & (1 << i)) {
965814d4ff83a515fe161cfb86c8b1492e2218051feBrian         struct tgsi_full_declaration fulldecl;
9665d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol
967814d4ff83a515fe161cfb86c8b1492e2218051feBrian         fulldecl = make_sampler_decl( i );
9685d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         ti += tgsi_build_full_declaration(
9695d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            &fulldecl,
9705d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            &tokens[ti],
9715d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            header,
9725d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol            maxTokens - ti );
973814d4ff83a515fe161cfb86c8b1492e2218051feBrian      }
974814d4ff83a515fe161cfb86c8b1492e2218051feBrian   }
975814d4ff83a515fe161cfb86c8b1492e2218051feBrian
9765d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol   for (i = 0; i < program->NumInstructions; i++) {
977af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      compile_instruction(
9785d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         &program->Instructions[i],
9795d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         &fullinst,
9805d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         inputMapping,
9815d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         outputMapping,
9825d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         immediates,
9835d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         indirectAccess,
9845d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         preamble_size,
9855d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         procType,
9865d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol         &insideSubroutine );
987af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
988af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      ti += tgsi_build_full_instruction(
989af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         &fullinst,
990af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         &tokens[ti],
991af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         header,
992af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         maxTokens - ti );
993af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
994af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
995358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#if DEBUG
996358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz   if(!tgsi_sanity_check(tokens)) {
997f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz      debug_printf("Due to sanity check failure(s) above the following shader program is invalid:\n");
998f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz      debug_printf("\nOriginal program:\n%s", program->String);
999f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz      debug_printf("\nMesa program:\n");
1000f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz      _mesa_print_program(program);
1001f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz      debug_printf("\nTGSI program:\n");
1002358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz      tgsi_dump(tokens, 0);
1003358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz      assert(0);
1004358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz   }
1005358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#endif
1006358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz
1007339e7ec6805e6de8794514c0a935081b5d36d38fBrian   return ti;
1008af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
1009