st_mesa_to_tgsi.c revision 90b9a11a6d69f1cf6c837def0e8a9b598079ef1b
1af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**************************************************************************
2af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *
3af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Copyright 2007 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"
356acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "tgsi/util/tgsi_parse.h"
366acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "tgsi/util/tgsi_build.h"
376acd63a4980951727939c0dd545a0324965b3834José Fonseca#include "tgsi/util/tgsi_util.h"
38af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol#include "st_mesa_to_tgsi.h"
39c5841425433f003af76f03435de719c40635005aJosé Fonseca#include "shader/prog_instruction.h"
40af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol#include "shader/prog_parameter.h"
41af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
42af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol#define TGSI_DEBUG 0
43af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
44af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
45af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/*
46af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa register file to TGSI register file.
47af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
48af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
49af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_register_file(
5021c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell   enum register_file file,
5121c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell   GLuint index,
5221c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell   const GLuint immediateMapping[] )
53af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
54af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( file ) {
55af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_UNDEFINED:
56af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_NULL;
57af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_TEMPORARY:
58af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_TEMPORARY;
59af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   //case PROGRAM_LOCAL_PARAM:
60af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   //case PROGRAM_ENV_PARAM:
6121c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell
6221c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell      /* Because of the longstanding problem with mesa arb shaders
6321c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell       * where constants, immediates and state variables are all
6421c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell       * bundled together as PROGRAM_STATE_VAR, we can't tell from the
6521c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell       * mesa register file whether this is a CONSTANT or an
6621c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell       * IMMEDIATE, hence we need all the other information.
6721c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell       */
68af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_STATE_VAR:
69af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_NAMED_PARAM:
70af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_UNIFORM:
7125e2b8d669e01aac551276af7f34d8708d8cb9d0José Fonseca      if (immediateMapping[index] != ~0)
7221c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell	 return TGSI_FILE_IMMEDIATE;
7321c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell      else
7421c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell	 return TGSI_FILE_CONSTANT;
75af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_CONSTANT:
76af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_IMMEDIATE;
77af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_INPUT:
78af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_INPUT;
79af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_OUTPUT:
80af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_OUTPUT;
81af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case PROGRAM_ADDRESS:
82af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_ADDRESS;
83af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
84af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
85af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_FILE_NULL;
86af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
87af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
88af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
89af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
90af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa register file index to TGSI index.
91af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Take special care when processing input and output indices.
92af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param file  one of TGSI_FILE_x
93af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param index  the mesa register file index
94af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping  maps Mesa input indexes to TGSI input indexes
95af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping  maps Mesa output indexes to TGSI output indexes
96af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
97af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
98af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_register_file_index(
99af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint file,
100af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint index,
101af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint inputMapping[],
102af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint outputMapping[],
103af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint immediateMapping[])
104af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
105af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( file ) {
106af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TGSI_FILE_INPUT:
107af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* inputs are mapped according to the user-defined map */
108af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return inputMapping[index];
109af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
110af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TGSI_FILE_OUTPUT:
111af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return outputMapping[index];
112af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
113af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TGSI_FILE_IMMEDIATE:
114af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return immediateMapping[index];
115af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
116af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
117af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return index;
118af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
119af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
120af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
121af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/*
122af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa texture target to TGSI texture target.
123af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
124af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
125af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_texture_target(
126af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint textarget )
127af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
128af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( textarget ) {
129af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_1D_INDEX:
130af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_1D;
131af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_2D_INDEX:
132af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_2D;
133af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_3D_INDEX:
134af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_3D;
135af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_CUBE_INDEX:
136af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_CUBE;
137af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case TEXTURE_RECT_INDEX:
138af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_TEXTURE_RECT;
139af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
140af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
141af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
142af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
143af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return TGSI_TEXTURE_1D;
144af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
145af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
146af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
147af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolconvert_sat(
148af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint sat )
149af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
150af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( sat ) {
151af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case SATURATE_OFF:
152af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_NONE;
153af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case SATURATE_ZERO_ONE:
154af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_ZERO_ONE;
155af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case SATURATE_PLUS_MINUS_ONE:
156af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_MINUS_PLUS_ONE;
157af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
158af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
159af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      return TGSI_SAT_NONE;
160af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
161af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
162af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
163af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint
164af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolconvert_writemask(
165af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint writemask )
166af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
167af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_X == TGSI_WRITEMASK_X );
168af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_Y == TGSI_WRITEMASK_Y );
169af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_Z == TGSI_WRITEMASK_Z );
170af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( WRITEMASK_W == TGSI_WRITEMASK_W );
171af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert( (writemask & ~TGSI_WRITEMASK_XYZW) == 0 );
172af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
173af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return writemask;
174af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
175af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
176af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_immediate
177af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_immediate(const float *value, uint size)
178af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
179af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_immediate imm;
180af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   imm.Immediate.Type = TGSI_TOKEN_TYPE_IMMEDIATE;
181af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   imm.Immediate.Size = 1 + size; /* one for the token itself */
182af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   imm.Immediate.DataType = TGSI_IMM_FLOAT32;
183af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   imm.u.ImmediateFloat32 = (struct tgsi_immediate_float32 *) value;
184af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return imm;
185af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
186af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
187af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic void
188af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolcompile_instruction(
189af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const struct prog_instruction *inst,
190af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_instruction *fullinst,
191af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint inputMapping[],
192af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint outputMapping[],
193af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint immediateMapping[],
194af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint preamble_size,
195e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian   GLuint processor,
196e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian   GLboolean *insideSubroutine)
197af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
198af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint i;
199af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_dst_register *fulldst;
200af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_src_register *fullsrc;
201af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
202af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *fullinst = tgsi_default_full_instruction();
203af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
204af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fullinst->Instruction.Saturate = convert_sat( inst->SaturateMode );
205af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fullinst->Instruction.NumDstRegs = _mesa_num_inst_dst_regs( inst->Opcode );
206af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fullinst->Instruction.NumSrcRegs = _mesa_num_inst_src_regs( inst->Opcode );
207af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
208af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fulldst = &fullinst->FullDstRegisters[0];
20921c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell   fulldst->DstRegister.File = map_register_file( inst->DstReg.File, 0, NULL );
210af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fulldst->DstRegister.Index = map_register_file_index(
211af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fulldst->DstRegister.File,
212af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      inst->DstReg.Index,
213af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      inputMapping,
214af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      outputMapping,
215af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      NULL
216af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      );
217af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   fulldst->DstRegister.WriteMask = convert_writemask( inst->DstReg.WriteMask );
218af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
219af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   for( i = 0; i < fullinst->Instruction.NumSrcRegs; i++ ) {
220af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      GLuint j;
221af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
222af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullsrc = &fullinst->FullSrcRegisters[i];
22321c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell      fullsrc->SrcRegister.File = map_register_file( inst->SrcReg[i].File,
22421c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell						     inst->SrcReg[i].Index,
22521c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell						     immediateMapping );
226af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullsrc->SrcRegister.Index = map_register_file_index(
227af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegister.File,
228af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         inst->SrcReg[i].Index,
229af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         inputMapping,
230af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         outputMapping,
231af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         immediateMapping);
232af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
233af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for( j = 0; j < 4; j++ ) {
234af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         GLuint swz;
235af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
236af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         swz = GET_SWZ( inst->SrcReg[i].Swizzle, j );
237af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( swz > SWIZZLE_W ) {
238af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            tgsi_util_set_src_register_extswizzle(
239af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol               &fullsrc->SrcRegisterExtSwz,
240af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol               swz,
241af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol               j );
242af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
243af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         else {
244af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            tgsi_util_set_src_register_swizzle(
245af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol               &fullsrc->SrcRegister,
246af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol               swz,
247af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol               j );
248af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
249af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
250af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
251af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].NegateBase == NEGATE_XYZW ) {
252af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegister.Negate = 1;
253af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
254af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      else if( inst->SrcReg[i].NegateBase != NEGATE_NONE ) {
255af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_X ) {
256af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateX = 1;
257af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
258af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_Y ) {
259af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateY = 1;
260af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
261af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_Z ) {
262af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateZ = 1;
263af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
264af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if( inst->SrcReg[i].NegateBase & NEGATE_W ) {
265af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fullsrc->SrcRegisterExtSwz.NegateW = 1;
266af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
267af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
268af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
269af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].Abs ) {
270af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterExtMod.Absolute = 1;
271af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
272af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
273af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].NegateAbs ) {
274af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterExtMod.Negate = 1;
275af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
276af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
277af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if( inst->SrcReg[i].RelAddr ) {
278af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegister.Indirect = 1;
279af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
280af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterInd.File = TGSI_FILE_ADDRESS;
281af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fullsrc->SrcRegisterInd.Index = 0;
282af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
283af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
284af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
285af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   switch( inst->Opcode ) {
286af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ARL:
287af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ARL;
288af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
289af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ABS:
290af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ABS;
291af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
292af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ADD:
293af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ADD;
294af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
295af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BGNLOOP:
296af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BGNLOOP2;
297af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
298af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
299af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BGNSUB:
300af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BGNSUB;
301e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      *insideSubroutine = GL_TRUE;
302af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
303af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BRA:
304af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BRA;
305af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
306af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_BRK:
307af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_BRK;
308af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
309af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_CAL:
310af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_CAL;
311af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
312af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
313af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_CMP:
314af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_CMP;
315af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
316af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_CONT:
317af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_CONT;
318af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
319af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_COS:
320af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_COS;
321af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
322af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DDX:
323af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DDX;
324af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
325af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DDY:
326af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DDY;
327af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
328af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DP3:
329af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DP3;
330af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
331af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DP4:
332af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DP4;
333af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
334af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DPH:
335af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DPH;
336af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
337af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_DST:
338af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_DST;
339af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
340af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ELSE:
341af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ELSE;
342af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
343af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
344af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ENDIF:
345af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDIF;
346af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
347af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ENDLOOP:
348af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDLOOP2;
349af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
350af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
351af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_ENDSUB:
352af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_ENDSUB;
353e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      *insideSubroutine = GL_FALSE;
354af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
355af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_EX2:
356af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_EX2;
357af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
358af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_EXP:
359af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_EXP;
360af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
361af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_FLR:
362af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_FLR;
363af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
364af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_FRC:
365af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_FRC;
366af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
367af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_IF:
368af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_IF;
369af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size;
370af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
371af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_INT:
372af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_INT;
373af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
374af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_KIL:
375af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* predicated w/ a register */
376af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_KILP;
377af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
378af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_KIL_NV:
379af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* unpredicated */
380af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert(inst->DstReg.CondMask == COND_TR);
381af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_KIL;
382af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
383af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_LG2:
384af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_LG2;
385af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
386af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_LOG:
387af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_LOG;
388af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
389af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_LIT:
390af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_LIT;
391af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
392af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_LRP:
393af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_LRP;
394af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
395af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_MAD:
396af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_MAD;
397af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
398af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_MAX:
399af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_MAX;
400af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
401af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_MIN:
402af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_MIN;
403af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
404af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_MOV:
405af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_MOV;
406af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
407af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_MUL:
408af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_MUL;
409af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
410af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_NOISE1:
411af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE1;
412af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
413af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_NOISE2:
414af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE2;
415af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
416af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_NOISE3:
417af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE3;
418af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
419af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_NOISE4:
420af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE4;
421af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
422af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_NOP:
423af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_NOP;
424af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
425af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_POW:
426af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_POW;
427af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
428af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_RCP:
429af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_RCP;
430af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
431af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_RET:
432e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      /* If RET is used inside main (not a real subroutine) we may want
433e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian       * to execute END instead of RET.  TBD...
434e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian       */
435e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      if (1 /*  *insideSubroutine */) {
436e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian         fullinst->Instruction.Opcode = TGSI_OPCODE_RET;
437e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      }
438e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      else {
439e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian         /* inside main() pseudo-function */
440e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian         fullinst->Instruction.Opcode = TGSI_OPCODE_END;
441e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian      }
442af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
443af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_RSQ:
444af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_RSQ;
445af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      tgsi_util_set_full_src_register_sign_mode(
446af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         &fullinst->FullSrcRegisters[0],
447af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         TGSI_UTIL_SIGN_CLEAR );
448af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
449af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SCS:
450af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SCS;
451af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XY;
452af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
453af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SEQ:
454af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SEQ;
455af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
456af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SGE:
457af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SGE;
458af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
459af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SGT:
460af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SGT;
461af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
462af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SIN:
463af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SIN;
464af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
465af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SLE:
466af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SLE;
467af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
468af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SLT:
469af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SLT;
470af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
471af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SNE:
472af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SNE;
473af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
474af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SUB:
475af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SUB;
476af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
477af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_SWZ:
478af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_SWZ;
479af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
480af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TEX:
481af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* ordinary texture lookup */
482af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TEX;
483af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
484af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
485af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
486af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
487af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
488af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXB:
489af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with LOD bias */
490af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TXB;
491af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
492af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
493af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
494af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
495af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
496af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXD:
497af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with explicit partial derivatives */
498af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TXD;
499af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 4;
500af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
501af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* src[0] = coord, src[1] = d[strq]/dx, src[2] = d[strq]/dy */
502af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[3].SrcRegister.File = TGSI_FILE_SAMPLER;
503af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[3].SrcRegister.Index = inst->TexSrcUnit;
504af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
505af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXL:
506af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with explicit LOD */
507af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_TXL;
508af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
509af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
510af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
511af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
512af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
513af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_TXP:
514af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* texture lookup with divide by Q component */
515af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* convert to TEX w/ special flag for division */
516a2b917c1cdb9cdd9b016e5cb9637e90c58fa911bBrian      fullinst->Instruction.Opcode = TGSI_OPCODE_TXP;
517af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.NumSrcRegs = 2;
518af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget );
519af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER;
520af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit;
521af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
522af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_XPD:
523af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fullinst->Instruction.Opcode = TGSI_OPCODE_XPD;
524af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XYZ;
525af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
526af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   case OPCODE_END:
5271575763a6f57d1f13c707b709f188b0617c8955aBrian      fullinst->Instruction.Opcode = TGSI_OPCODE_END;
528af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      break;
529af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   default:
530af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      assert( 0 );
531af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
532af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
533af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
534af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
535af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param usage_mask  bitfield of TGSI_WRITEMASK_{XYZW} tokens
536af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
537af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration
538af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_input_decl(
539af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint index,
540e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol   GLboolean interpolate_info,
541af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint interpolate,
542af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint usage_mask,
543af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLboolean semantic_info,
544af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint semantic_name,
545af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLbitfield semantic_index )
546af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
547af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_declaration decl;
548af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
549af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert(semantic_name < TGSI_SEMANTIC_COUNT);
550af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
551af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl = tgsi_default_full_declaration();
552af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.File = TGSI_FILE_INPUT;
553af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.Declare = TGSI_DECLARE_RANGE;
554af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.UsageMask = usage_mask;
555af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.Semantic = semantic_info;
556af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.u.DeclarationRange.First = index;
557af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.u.DeclarationRange.Last = index;
558af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   if (semantic_info) {
559af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      decl.Semantic.SemanticName = semantic_name;
560af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      decl.Semantic.SemanticIndex = semantic_index;
561af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
562e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol   if (interpolate_info) {
563e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol      decl.Declaration.Interpolate = 1;
564e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol      decl.Interpolation.Interpolate = interpolate;
565e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol   }
566af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
567af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return decl;
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_output_decl(
575af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint index,
576af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint semantic_name,
577af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint semantic_index,
578af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLbitfield usage_mask )
579af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
580af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_declaration decl;
581af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
582af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert(semantic_name < TGSI_SEMANTIC_COUNT);
583af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
584af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl = tgsi_default_full_declaration();
585af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.File = TGSI_FILE_OUTPUT;
586af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.Declare = TGSI_DECLARE_RANGE;
587af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.UsageMask = usage_mask;
588af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.Semantic = 1;
589af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.u.DeclarationRange.First = index;
590af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.u.DeclarationRange.Last = index;
591af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Semantic.SemanticName = semantic_name;
592af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Semantic.SemanticIndex = semantic_index;
593af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
594af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return decl;
595af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
596af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
597af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
598af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration
599af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_temp_decl(
600af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint start_index,
601af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint end_index )
602af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
603af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_declaration decl;
604af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl = tgsi_default_full_declaration();
605af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.File = TGSI_FILE_TEMPORARY;
606af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.Declaration.Declare = TGSI_DECLARE_RANGE;
607af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.u.DeclarationRange.First = start_index;
608af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   decl.u.DeclarationRange.Last = end_index;
609af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   return decl;
610af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
611af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
612af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
613814d4ff83a515fe161cfb86c8b1492e2218051feBrianstatic struct tgsi_full_declaration
614814d4ff83a515fe161cfb86c8b1492e2218051feBrianmake_sampler_decl(GLuint index)
615814d4ff83a515fe161cfb86c8b1492e2218051feBrian{
616814d4ff83a515fe161cfb86c8b1492e2218051feBrian   struct tgsi_full_declaration decl;
617814d4ff83a515fe161cfb86c8b1492e2218051feBrian   decl = tgsi_default_full_declaration();
618814d4ff83a515fe161cfb86c8b1492e2218051feBrian   decl.Declaration.File = TGSI_FILE_SAMPLER;
619814d4ff83a515fe161cfb86c8b1492e2218051feBrian   decl.Declaration.Declare = TGSI_DECLARE_RANGE;
620814d4ff83a515fe161cfb86c8b1492e2218051feBrian   decl.u.DeclarationRange.First = index;
621814d4ff83a515fe161cfb86c8b1492e2218051feBrian   decl.u.DeclarationRange.Last = index;
622814d4ff83a515fe161cfb86c8b1492e2218051feBrian   return decl;
623814d4ff83a515fe161cfb86c8b1492e2218051feBrian}
624814d4ff83a515fe161cfb86c8b1492e2218051feBrian
6258978627ad0e236796758d4912822b3428a649987Brian/** Reference into a constant buffer */
6268978627ad0e236796758d4912822b3428a649987Brianstatic struct tgsi_full_declaration
6278978627ad0e236796758d4912822b3428a649987Brianmake_constant_decl(GLuint first, GLuint last)
6288978627ad0e236796758d4912822b3428a649987Brian{
6298978627ad0e236796758d4912822b3428a649987Brian   struct tgsi_full_declaration decl;
6308978627ad0e236796758d4912822b3428a649987Brian   decl = tgsi_default_full_declaration();
6318978627ad0e236796758d4912822b3428a649987Brian   decl.Declaration.File = TGSI_FILE_CONSTANT;
6328978627ad0e236796758d4912822b3428a649987Brian   decl.Declaration.Declare = TGSI_DECLARE_RANGE;
6338978627ad0e236796758d4912822b3428a649987Brian   decl.u.DeclarationRange.First = first;
6348978627ad0e236796758d4912822b3428a649987Brian   decl.u.DeclarationRange.Last = last;
6358978627ad0e236796758d4912822b3428a649987Brian   return decl;
6368978627ad0e236796758d4912822b3428a649987Brian}
6378978627ad0e236796758d4912822b3428a649987Brian
638814d4ff83a515fe161cfb86c8b1492e2218051feBrian
639814d4ff83a515fe161cfb86c8b1492e2218051feBrian
640af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
641af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Find the temporaries which are used in the given program.
642af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
643af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic void
644af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolfind_temporaries(const struct gl_program *program,
645af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                 GLboolean tempsUsed[MAX_PROGRAM_TEMPS])
646af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
647af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint i, j;
648af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
649af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   for (i = 0; i < MAX_PROGRAM_TEMPS; i++)
650af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      tempsUsed[i] = GL_FALSE;
651af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
652af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   for (i = 0; i < program->NumInstructions; i++) {
653af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      const struct prog_instruction *inst = program->Instructions + i;
654af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      const GLuint n = _mesa_num_inst_src_regs( inst->Opcode );
655af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (j = 0; j < n; j++) {
656af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if (inst->SrcReg[j].File == PROGRAM_TEMPORARY)
657af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            tempsUsed[inst->SrcReg[j].Index] = GL_TRUE;
658af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if (inst->DstReg.File == PROGRAM_TEMPORARY)
659af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            tempsUsed[inst->DstReg.Index] = GL_TRUE;
660af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
661af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
662af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
663af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
664af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
665af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
666af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
667af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/**
668af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Translate Mesa program to TGSI format.
669af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param program  the program to translate
670af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numInputs  number of input registers used
671af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping  maps Mesa fragment program inputs to TGSI generic
672af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *                      input indexes
673af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticName  the TGSI_SEMANTIC flag for each input
674af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticIndex  the semantic index (ex: which texcoord) for each input
675af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param interpMode  the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input
676af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
677af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numOutputs  number of output registers used
678af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping  maps Mesa fragment program outputs to TGSI
679af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *                       generic outputs
680af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticName  the TGSI_SEMANTIC flag for each output
681af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticIndex  the semantic index (ex: which texcoord) for each output
682af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param tokens  array to store translated tokens in
683af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param maxTokens  size of the tokens array
684af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *
685339e7ec6805e6de8794514c0a935081b5d36d38fBrian * \return number of tokens placed in 'tokens' buffer, or zero if error
686af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */
687339e7ec6805e6de8794514c0a935081b5d36d38fBrianGLuint
688af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Kroltgsi_translate_mesa_program(
689af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   uint procType,
690af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const struct gl_program *program,
691af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint numInputs,
692af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint inputMapping[],
693af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte inputSemanticName[],
694af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte inputSemanticIndex[],
695af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint interpMode[],
696af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint numOutputs,
697af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const GLuint outputMapping[],
698af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte outputSemanticName[],
699af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   const ubyte outputSemanticIndex[],
700af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_token *tokens,
701af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint maxTokens )
702af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{
703af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint i;
704af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint ti;  /* token index */
705af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_header *header;
706af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_processor *processor;
707af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   struct tgsi_full_instruction fullinst;
708af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint preamble_size = 0;
709af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint immediates[1000];
710af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   GLuint numImmediates = 0;
711e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian   GLboolean insideSubroutine = GL_FALSE;
712af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
713af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   assert(procType == TGSI_PROCESSOR_FRAGMENT ||
714af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol          procType == TGSI_PROCESSOR_VERTEX);
715af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
716af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *(struct tgsi_version *) &tokens[0] = tgsi_build_version();
717af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
718af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   header = (struct tgsi_header *) &tokens[1];
719af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *header = tgsi_build_header();
720af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
721af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   processor = (struct tgsi_processor *) &tokens[2];
722af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   *processor = tgsi_build_processor( procType, header );
723af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
724af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   ti = 3;
725af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
726af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /*
727af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    * Declare input attributes.
728af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    */
729af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   if (procType == TGSI_PROCESSOR_FRAGMENT) {
730af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numInputs; i++) {
731af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
732e785f190f0d49f0367f7468c22b77962d0f14ea0Brian         fulldecl = make_input_decl(i,
733e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    GL_TRUE, interpMode[i],
734e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    TGSI_WRITEMASK_XYZW,
735e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    GL_TRUE, inputSemanticName[i],
736e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                    inputSemanticIndex[i]);
737e785f190f0d49f0367f7468c22b77962d0f14ea0Brian         ti += tgsi_build_full_declaration(&fulldecl,
738e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                           &tokens[ti],
739e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                           header,
740e785f190f0d49f0367f7468c22b77962d0f14ea0Brian                                           maxTokens - ti );
741af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
742af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
743af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   else {
744af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* vertex prog */
745e785f190f0d49f0367f7468c22b77962d0f14ea0Brian      /* XXX: this could probaby be merged with the clause above.
746e785f190f0d49f0367f7468c22b77962d0f14ea0Brian       * the only difference is the semantic tags.
747e785f190f0d49f0367f7468c22b77962d0f14ea0Brian       */
748af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numInputs; i++) {
749af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
750af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fulldecl = make_input_decl(i,
751e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol                                    GL_FALSE, 0,
752af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                    TGSI_WRITEMASK_XYZW,
753e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol                                    GL_FALSE, 0, 0);
754af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         ti += tgsi_build_full_declaration(&fulldecl,
755af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           &tokens[ti],
756af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           header,
757af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           maxTokens - ti );
758af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
759af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
760af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
761af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /*
762af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    * Declare output attributes.
763af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol    */
764af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   if (procType == TGSI_PROCESSOR_FRAGMENT) {
765af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numOutputs; i++) {
766af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
767af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         switch (outputSemanticName[i]) {
768af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         case TGSI_SEMANTIC_POSITION:
769af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fulldecl = make_output_decl(i,
77090b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        TGSI_SEMANTIC_POSITION, /* Z / Depth */
77190b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        outputSemanticIndex[i],
772af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                        TGSI_WRITEMASK_Z );
773af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            break;
774af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         case TGSI_SEMANTIC_COLOR:
775af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fulldecl = make_output_decl(i,
77690b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        TGSI_SEMANTIC_COLOR,
77790b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian                                        outputSemanticIndex[i],
778af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                        TGSI_WRITEMASK_XYZW );
779af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            break;
780af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         default:
781af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            abort();
782af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
783af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         ti += tgsi_build_full_declaration(&fulldecl,
784af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           &tokens[ti],
785af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           header,
786af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           maxTokens - ti );
787af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
788af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
789af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   else {
790af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      /* vertex prog */
791af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < numOutputs; i++) {
792af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_declaration fulldecl;
793af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         fulldecl = make_output_decl(i,
794af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                     outputSemanticName[i],
795af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                     outputSemanticIndex[i],
796af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                     TGSI_WRITEMASK_XYZW );
797af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         ti += tgsi_build_full_declaration(&fulldecl,
798af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           &tokens[ti],
799af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           header,
800af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                           maxTokens - ti );
801af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
802af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
803af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
804af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /* temporary decls */
805af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   {
806af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      GLboolean tempsUsed[MAX_PROGRAM_TEMPS + 1];
807af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      GLboolean inside_range = GL_FALSE;
808af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      GLuint start_range;
809af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
810af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      find_temporaries(program, tempsUsed);
811af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      tempsUsed[MAX_PROGRAM_TEMPS] = GL_FALSE;
812af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      for (i = 0; i < MAX_PROGRAM_TEMPS + 1; i++) {
813af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         if (tempsUsed[i] && !inside_range) {
814af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            inside_range = GL_TRUE;
815af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            start_range = i;
816af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
817af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         else if (!tempsUsed[i] && inside_range) {
818af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            struct tgsi_full_declaration fulldecl;
819af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
820af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            inside_range = GL_FALSE;
821af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            fulldecl = make_temp_decl( start_range, i - 1 );
822af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            ti += tgsi_build_full_declaration(
823af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                              &fulldecl,
824af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                              &tokens[ti],
825af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                              header,
826af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                              maxTokens - ti );
827af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         }
828af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
829af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
830af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
831af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   /* immediates/literals */
83221c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell   memset(immediates, ~0, sizeof(immediates));
83325e2b8d669e01aac551276af7f34d8708d8cb9d0José Fonseca
8342f496ff9574ad99f8d85b5d63e97b15faf5aee39Michel Dänzer   for (i = 0; program->Parameters && i < program->Parameters->NumParameters;
8358978627ad0e236796758d4912822b3428a649987Brian        i++) {
836af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      if (program->Parameters->Parameters[i].Type == PROGRAM_CONSTANT) {
837af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         struct tgsi_full_immediate fullimm
838b53d6ae4be955c701695e093ea4457ab1c9c0ed7Brian            = make_immediate(program->Parameters->ParameterValues[i], 4);
839af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         ti += tgsi_build_full_immediate(&fullimm,
840af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                         &tokens[ti],
841af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                         header,
842af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol                                         maxTokens - ti);
843af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         immediates[i] = numImmediates;
844af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         numImmediates++;
845af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      }
846af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
847af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
8488978627ad0e236796758d4912822b3428a649987Brian   /* constant buffer refs */
8498978627ad0e236796758d4912822b3428a649987Brian   {
8508978627ad0e236796758d4912822b3428a649987Brian      GLint start = -1, end = -1;
8518978627ad0e236796758d4912822b3428a649987Brian
8528978627ad0e236796758d4912822b3428a649987Brian      for (i = 0;
8538978627ad0e236796758d4912822b3428a649987Brian           program->Parameters && i < program->Parameters->NumParameters;
8548978627ad0e236796758d4912822b3428a649987Brian           i++) {
8558978627ad0e236796758d4912822b3428a649987Brian         GLboolean emit = (i == program->Parameters->NumParameters - 1);
8568978627ad0e236796758d4912822b3428a649987Brian
8578978627ad0e236796758d4912822b3428a649987Brian         switch (program->Parameters->Parameters[i].Type) {
8588978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_ENV_PARAM:
8598978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_STATE_VAR:
8608978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_NAMED_PARAM:
8618978627ad0e236796758d4912822b3428a649987Brian         case PROGRAM_UNIFORM:
8628978627ad0e236796758d4912822b3428a649987Brian            if (start == -1) {
8638978627ad0e236796758d4912822b3428a649987Brian               /* begin a sequence */
8648978627ad0e236796758d4912822b3428a649987Brian               start = i;
8658978627ad0e236796758d4912822b3428a649987Brian               end = i;
8668978627ad0e236796758d4912822b3428a649987Brian            }
8678978627ad0e236796758d4912822b3428a649987Brian            else {
8688978627ad0e236796758d4912822b3428a649987Brian               /* continue sequence */
8698978627ad0e236796758d4912822b3428a649987Brian               end = i;
8708978627ad0e236796758d4912822b3428a649987Brian            }
8718978627ad0e236796758d4912822b3428a649987Brian            break;
8728978627ad0e236796758d4912822b3428a649987Brian         default:
8738978627ad0e236796758d4912822b3428a649987Brian            if (start != -1) {
8748978627ad0e236796758d4912822b3428a649987Brian               /* end of sequence */
8758978627ad0e236796758d4912822b3428a649987Brian               emit = GL_TRUE;
8768978627ad0e236796758d4912822b3428a649987Brian            }
8778978627ad0e236796758d4912822b3428a649987Brian         }
8788978627ad0e236796758d4912822b3428a649987Brian
8798978627ad0e236796758d4912822b3428a649987Brian         if (emit && start >= 0) {
8808978627ad0e236796758d4912822b3428a649987Brian            struct tgsi_full_declaration fulldecl;
8818978627ad0e236796758d4912822b3428a649987Brian            fulldecl = make_constant_decl( start, end );
8828978627ad0e236796758d4912822b3428a649987Brian            ti += tgsi_build_full_declaration(&fulldecl,
8838978627ad0e236796758d4912822b3428a649987Brian                                              &tokens[ti],
8848978627ad0e236796758d4912822b3428a649987Brian                                              header,
8858978627ad0e236796758d4912822b3428a649987Brian                                              maxTokens - ti);
8868978627ad0e236796758d4912822b3428a649987Brian            start = end = -1;
8878978627ad0e236796758d4912822b3428a649987Brian         }
8888978627ad0e236796758d4912822b3428a649987Brian      }
8898978627ad0e236796758d4912822b3428a649987Brian   }
8908978627ad0e236796758d4912822b3428a649987Brian
891814d4ff83a515fe161cfb86c8b1492e2218051feBrian   /* texture samplers */
892814d4ff83a515fe161cfb86c8b1492e2218051feBrian   for (i = 0; i < 8; i++) {
893814d4ff83a515fe161cfb86c8b1492e2218051feBrian      if (program->SamplersUsed & (1 << i)) {
894814d4ff83a515fe161cfb86c8b1492e2218051feBrian         struct tgsi_full_declaration fulldecl;
895814d4ff83a515fe161cfb86c8b1492e2218051feBrian         fulldecl = make_sampler_decl( i );
896814d4ff83a515fe161cfb86c8b1492e2218051feBrian         ti += tgsi_build_full_declaration(&fulldecl,
897814d4ff83a515fe161cfb86c8b1492e2218051feBrian                                           &tokens[ti],
898814d4ff83a515fe161cfb86c8b1492e2218051feBrian                                           header,
899814d4ff83a515fe161cfb86c8b1492e2218051feBrian                                           maxTokens - ti );
900814d4ff83a515fe161cfb86c8b1492e2218051feBrian      }
901814d4ff83a515fe161cfb86c8b1492e2218051feBrian   }
902814d4ff83a515fe161cfb86c8b1492e2218051feBrian
903814d4ff83a515fe161cfb86c8b1492e2218051feBrian
904af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   for( i = 0; i < program->NumInstructions; i++ ) {
905af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      compile_instruction(
906af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            &program->Instructions[i],
907af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            &fullinst,
908af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            inputMapping,
909af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            outputMapping,
910af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            immediates,
911af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol            preamble_size,
912e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian            procType,
913e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian            &insideSubroutine);
914af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
915af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol      ti += tgsi_build_full_instruction(
916af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         &fullinst,
917af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         &tokens[ti],
918af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         header,
919af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol         maxTokens - ti );
920af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol   }
921af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
922339e7ec6805e6de8794514c0a935081b5d36d38fBrian   return ti;
923af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol}
924af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol
925