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