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