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