st_mesa_to_tgsi.c revision ea4bf267e4b023b08043f91ac44592fed1736e7f
1af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/************************************************************************** 2af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 381dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 4af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * All Rights Reserved. 5af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 6af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Permission is hereby granted, free of charge, to any person obtaining a 7af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * copy of this software and associated documentation files (the 8af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * "Software"), to deal in the Software without restriction, including 9af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * without limitation the rights to use, copy, modify, merge, publish, 10af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * distribute, sub license, and/or sell copies of the Software, and to 11af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * permit persons to whom the Software is furnished to do so, subject to 12af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * the following conditions: 13af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 14af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * The above copyright notice and this permission notice (including the 15af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * next paragraph) shall be included in all copies or substantial portions 16af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * of the Software. 17af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 18af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 26af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol **************************************************************************/ 27af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 28af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/* 29af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \author 30af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Michal Krol 31af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 32af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 33abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_compiler.h" 34abd5e8e41d54f7f491f91af9354f19c8d24d3572Michal Krol#include "pipe/p_shader_tokens.h" 35c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_parse.h" 36c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_build.h" 37c208a2c791fa24c7c5887fc496738cbddbfafc72José Fonseca#include "tgsi/tgsi_util.h" 38358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#include "tgsi/tgsi_dump.h" 39358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#include "tgsi/tgsi_sanity.h" 40af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol#include "st_mesa_to_tgsi.h" 41c5841425433f003af76f03435de719c40635005aJosé Fonseca#include "shader/prog_instruction.h" 42af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol#include "shader/prog_parameter.h" 43095ca0acd8019e8f2da89f9320b92ce4a96a140eBrian Paul#include "shader/prog_print.h" 44ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h" 45af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 46af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/* 47af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa register file to TGSI register file. 48af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 49af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint 50af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_register_file( 5121c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell enum register_file file, 5221c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell GLuint index, 535d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol const GLuint immediateMapping[], 545d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GLboolean indirectAccess ) 55af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 56af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 57af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_UNDEFINED: 58af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_NULL; 59af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_TEMPORARY: 60af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_TEMPORARY; 6193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul /*case PROGRAM_LOCAL_PARAM:*/ 6293f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul /*case PROGRAM_ENV_PARAM:*/ 6321c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell 6421c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell /* Because of the longstanding problem with mesa arb shaders 6521c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell * where constants, immediates and state variables are all 6621c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell * bundled together as PROGRAM_STATE_VAR, we can't tell from the 6721c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell * mesa register file whether this is a CONSTANT or an 6821c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell * IMMEDIATE, hence we need all the other information. 6921c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell */ 70af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_STATE_VAR: 71af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_NAMED_PARAM: 72af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_UNIFORM: 735d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (!indirectAccess && immediateMapping && immediateMapping[index] != ~0) 7468ef8e89a5f25cd9f80e2b9088604631a28edc3cZack Rusin return TGSI_FILE_IMMEDIATE; 7521c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell else 7621c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell return TGSI_FILE_CONSTANT; 77af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_CONSTANT: 785d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (indirectAccess) 795d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol return TGSI_FILE_CONSTANT; 800576e837f18ad9925d732f883f4922c907d7bafbBrian Paul assert(immediateMapping[index] != ~0); 81af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_IMMEDIATE; 82af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_INPUT: 83af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_INPUT; 84af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_OUTPUT: 85af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_OUTPUT; 86af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_ADDRESS: 87af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_ADDRESS; 88af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 89af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 90af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_NULL; 91af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 92af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 93af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 94af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 95af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa register file index to TGSI index. 96af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Take special care when processing input and output indices. 97af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param file one of TGSI_FILE_x 98af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param index the mesa register file index 99af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping maps Mesa input indexes to TGSI input indexes 100af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping maps Mesa output indexes to TGSI output indexes 101af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 102af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint 103af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_register_file_index( 104af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint file, 105af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint index, 106af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 107af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 1085d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol const GLuint immediateMapping[], 1095d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GLboolean indirectAccess ) 110af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 111af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 112af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_FILE_INPUT: 113af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* inputs are mapped according to the user-defined map */ 114af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return inputMapping[index]; 115af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 116af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_FILE_OUTPUT: 117af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return outputMapping[index]; 118af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 119af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_FILE_IMMEDIATE: 1205d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (indirectAccess) 1215d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol return index; 1220576e837f18ad9925d732f883f4922c907d7bafbBrian Paul assert(immediateMapping[index] != ~0); 123af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return immediateMapping[index]; 124af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 125af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 126af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return index; 127af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 128af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 129af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 130af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/* 131af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa texture target to TGSI texture target. 132af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 133af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint 134af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_texture_target( 135af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint textarget ) 136af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 137af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( textarget ) { 138af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TEXTURE_1D_INDEX: 139af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_1D; 140af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TEXTURE_2D_INDEX: 141af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_2D; 142af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TEXTURE_3D_INDEX: 143af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_3D; 144af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TEXTURE_CUBE_INDEX: 145af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_CUBE; 146af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TEXTURE_RECT_INDEX: 147af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_RECT; 148af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 149af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 150af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 151af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 152af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_1D; 153af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 154af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 155af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint 156af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolconvert_sat( 157af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint sat ) 158af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 159af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( sat ) { 160af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case SATURATE_OFF: 161af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_SAT_NONE; 162af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case SATURATE_ZERO_ONE: 163af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_SAT_ZERO_ONE; 164af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case SATURATE_PLUS_MINUS_ONE: 165af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_SAT_MINUS_PLUS_ONE; 166af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 167af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 168af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_SAT_NONE; 169af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 170af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 171af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 172af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint 173af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolconvert_writemask( 174af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint writemask ) 175af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 176af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( WRITEMASK_X == TGSI_WRITEMASK_X ); 177af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( WRITEMASK_Y == TGSI_WRITEMASK_Y ); 178af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( WRITEMASK_Z == TGSI_WRITEMASK_Z ); 179af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( WRITEMASK_W == TGSI_WRITEMASK_W ); 180af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( (writemask & ~TGSI_WRITEMASK_XYZW) == 0 ); 181af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 182af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return writemask; 183af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 184af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 185af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_immediate 186af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_immediate(const float *value, uint size) 187af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 188af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_immediate imm; 18981dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol 19081dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol imm = tgsi_default_full_immediate(); 191b20a1b28b7e581304701c5802e8627003e461e45Patrice Mandin imm.Immediate.NrTokens += size; 192af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol imm.Immediate.DataType = TGSI_IMM_FLOAT32; 19381dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol imm.u.Pointer = value; 194af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return imm; 195af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 196af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 197af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic void 198af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolcompile_instruction( 199af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct prog_instruction *inst, 200af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_instruction *fullinst, 201af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 202af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 203af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint immediateMapping[], 2045d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GLboolean indirectAccess, 205af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint preamble_size, 206e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian GLuint processor, 207e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian GLboolean *insideSubroutine) 208af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 209af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint i; 210af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_dst_register *fulldst; 211af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_src_register *fullsrc; 212af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 213af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *fullinst = tgsi_default_full_instruction(); 214af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 215af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Saturate = convert_sat( inst->SaturateMode ); 216af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumDstRegs = _mesa_num_inst_dst_regs( inst->Opcode ); 217af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = _mesa_num_inst_src_regs( inst->Opcode ); 218af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 219af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst = &fullinst->FullDstRegisters[0]; 2205d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol fulldst->DstRegister.File = map_register_file( inst->DstReg.File, 0, NULL, GL_FALSE ); 221af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst->DstRegister.Index = map_register_file_index( 222af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst->DstRegister.File, 223af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inst->DstReg.Index, 224af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inputMapping, 225af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol outputMapping, 2265d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol NULL, 2275d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GL_FALSE ); 228af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst->DstRegister.WriteMask = convert_writemask( inst->DstReg.WriteMask ); 229af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2305d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < fullinst->Instruction.NumSrcRegs; i++) { 231af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint j; 232af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 233af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc = &fullinst->FullSrcRegisters[i]; 2345d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol fullsrc->SrcRegister.File = map_register_file( 2355d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol inst->SrcReg[i].File, 2365d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol inst->SrcReg[i].Index, 2375d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol immediateMapping, 2385d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol indirectAccess ); 239af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegister.Index = map_register_file_index( 240af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegister.File, 241af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inst->SrcReg[i].Index, 242af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inputMapping, 243af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol outputMapping, 2445d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol immediateMapping, 2455d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol indirectAccess ); 246af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 247ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz 24893f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul /* swizzle (ext swizzle also depends on negation) */ 24993f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul { 25093f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul GLuint swz[4]; 25193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul GLboolean extended = (inst->SrcReg[i].NegateBase != NEGATE_NONE && 25293f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul inst->SrcReg[i].NegateBase != NEGATE_XYZW); 25393f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul for( j = 0; j < 4; j++ ) { 25493f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul swz[j] = GET_SWZ( inst->SrcReg[i].Swizzle, j ); 25593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul if (swz[j] > SWIZZLE_W) 25693f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul extended = GL_TRUE; 25793f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 25893f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul if (extended) { 25993f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul for (j = 0; j < 4; j++) { 26093f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul tgsi_util_set_src_register_extswizzle(&fullsrc->SrcRegisterExtSwz, 26193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul swz[j], j); 26293f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 263af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 264af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 26593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul for (j = 0; j < 4; j++) { 26693f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul tgsi_util_set_src_register_swizzle(&fullsrc->SrcRegister, 26793f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul swz[j], j); 26893f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 269af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 270af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 271af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 272af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateBase == NEGATE_XYZW ) { 273af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegister.Negate = 1; 274af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 275af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else if( inst->SrcReg[i].NegateBase != NEGATE_NONE ) { 276af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateBase & NEGATE_X ) { 277af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtSwz.NegateX = 1; 278af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 279af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateBase & NEGATE_Y ) { 280af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtSwz.NegateY = 1; 281af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 282af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateBase & NEGATE_Z ) { 283af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtSwz.NegateZ = 1; 284af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 285af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateBase & NEGATE_W ) { 286af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtSwz.NegateW = 1; 287af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 288af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 289af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 290af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].Abs ) { 291af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtMod.Absolute = 1; 292af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 293af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 294af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateAbs ) { 295af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtMod.Negate = 1; 296af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 297af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 298af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].RelAddr ) { 299af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegister.Indirect = 1; 300af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 301af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterInd.File = TGSI_FILE_ADDRESS; 302af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterInd.Index = 0; 303af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 304af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 305af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 306af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( inst->Opcode ) { 307af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ARL: 308af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_ARL; 309af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 310af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ABS: 311af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_ABS; 312af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 313af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ADD: 314af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_ADD; 315af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 316af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNLOOP: 317af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_BGNLOOP2; 318af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; 319af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 320af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNSUB: 321af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_BGNSUB; 322e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian *insideSubroutine = GL_TRUE; 323af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 324af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRA: 325af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_BRA; 326af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 327af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRK: 328af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_BRK; 329af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 330af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CAL: 331af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_CAL; 332af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; 333af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 334af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CMP: 335af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_CMP; 336af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 337af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CONT: 338af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_CONT; 339af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 340af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_COS: 341af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_COS; 342af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 343af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDX: 344af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_DDX; 345af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 346af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDY: 347af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_DDY; 348af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 3498343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2: 3508343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul fullinst->Instruction.Opcode = TGSI_OPCODE_DP2; 3518343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul break; 3528343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_DP2A: 3538343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul fullinst->Instruction.Opcode = TGSI_OPCODE_DP2A; 3548343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul break; 355af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP3: 356af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_DP3; 357af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 358af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DP4: 359af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_DP4; 360af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 361af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DPH: 362af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_DPH; 363af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 364af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DST: 365af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_DST; 366af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 367af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ELSE: 368af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_ELSE; 369af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; 370af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 371af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDIF: 372af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_ENDIF; 373af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 374af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDLOOP: 375af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_ENDLOOP2; 376af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; 377af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 378af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ENDSUB: 379af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_ENDSUB; 380e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian *insideSubroutine = GL_FALSE; 381af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 382af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EX2: 383af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_EX2; 384af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 385af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_EXP: 386af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_EXP; 387af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 388af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FLR: 389af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_FLR; 390af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 391af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_FRC: 392af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_FRC; 393af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 394af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_IF: 395af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_IF; 396af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; 397af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 3983225bc84932f08a52db7025367ae206a9d2f8fefBrian Paul case OPCODE_TRUNC: 3993225bc84932f08a52db7025367ae206a9d2f8fefBrian Paul fullinst->Instruction.Opcode = TGSI_OPCODE_TRUNC; 400af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 401af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL: 402e7e992b12ab3717eadaf055fe2fab88c3be8a092Michal Krol /* conditional */ 403e7e992b12ab3717eadaf055fe2fab88c3be8a092Michal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_KIL; 404af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 405af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_KIL_NV: 406e7e992b12ab3717eadaf055fe2fab88c3be8a092Michal Krol /* predicated */ 407af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert(inst->DstReg.CondMask == COND_TR); 408e7e992b12ab3717eadaf055fe2fab88c3be8a092Michal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_KILP; 409af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 410af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LG2: 411af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_LG2; 412af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 413af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LOG: 414af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_LOG; 415af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 416af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LIT: 417af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_LIT; 418af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 419af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_LRP: 420af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_LRP; 421af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 422af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAD: 423af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_MAD; 424af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 425af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MAX: 426af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_MAX; 427af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 428af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MIN: 429af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_MIN; 430af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 431af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MOV: 432af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_MOV; 433af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 434af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_MUL: 435af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_MUL; 436af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 437af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOISE1: 438af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE1; 439af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 440af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOISE2: 441af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE2; 442af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 443af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOISE3: 444af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE3; 445af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 446af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOISE4: 447af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_NOISE4; 448af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 449af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_NOP: 450af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_NOP; 451af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 4528343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM3: 4538343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul fullinst->Instruction.Opcode = TGSI_OPCODE_NRM; 4548343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul break; 4558343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_NRM4: 4568343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul fullinst->Instruction.Opcode = TGSI_OPCODE_NRM4; 4578343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul break; 458af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_POW: 459af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_POW; 460af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 461af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RCP: 462af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_RCP; 463af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 464af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RET: 465e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian /* If RET is used inside main (not a real subroutine) we may want 466e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian * to execute END instead of RET. TBD... 467e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian */ 468e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian if (1 /* *insideSubroutine */) { 469e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian fullinst->Instruction.Opcode = TGSI_OPCODE_RET; 470e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian } 471e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian else { 472e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian /* inside main() pseudo-function */ 473e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian fullinst->Instruction.Opcode = TGSI_OPCODE_END; 474e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian } 475af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 476af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RSQ: 477af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_RSQ; 478af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 479af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SCS: 480af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SCS; 481af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XY; 482af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 483af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SEQ: 484af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SEQ; 485af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 486af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGE: 487af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SGE; 488af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 489af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGT: 490af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SGT; 491af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 492af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SIN: 493af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SIN; 494af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 495af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLE: 496af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SLE; 497af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 498af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLT: 499af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SLT; 500af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 501af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SNE: 502af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SNE; 503af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 5048343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul case OPCODE_SSG: 5058343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul fullinst->Instruction.Opcode = TGSI_OPCODE_SSG; 5068343d0f6e4e6cc49c866f98f0a551872cc8ffa26Brian Paul break; 507af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SUB: 508af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SUB; 509af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 510af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SWZ: 511af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SWZ; 512af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 513af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TEX: 514af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* ordinary texture lookup */ 515af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_TEX; 516af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = 2; 517af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget ); 518af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; 519af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; 520af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 521af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXB: 522af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* texture lookup with LOD bias */ 523af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_TXB; 524af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = 2; 525af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget ); 526af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; 527af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; 528af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 529af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXD: 530af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* texture lookup with explicit partial derivatives */ 531af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_TXD; 532af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = 4; 533af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget ); 534af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* src[0] = coord, src[1] = d[strq]/dx, src[2] = d[strq]/dy */ 535af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[3].SrcRegister.File = TGSI_FILE_SAMPLER; 536af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[3].SrcRegister.Index = inst->TexSrcUnit; 537af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 538af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXL: 539af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* texture lookup with explicit LOD */ 540af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_TXL; 541af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = 2; 542af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget ); 543af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; 544af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; 545af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 546af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXP: 547af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* texture lookup with divide by Q component */ 548af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* convert to TEX w/ special flag for division */ 549a2b917c1cdb9cdd9b016e5cb9637e90c58fa911bBrian fullinst->Instruction.Opcode = TGSI_OPCODE_TXP; 550af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = 2; 551af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget ); 552af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; 553af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; 554af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 555af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_XPD: 556af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_XPD; 557af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XYZ; 558af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 559af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_END: 5601575763a6f57d1f13c707b709f188b0617c8955aBrian fullinst->Instruction.Opcode = TGSI_OPCODE_END; 561af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 562af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 563af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 564af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 565af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 566af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 567af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 568af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param usage_mask bitfield of TGSI_WRITEMASK_{XYZW} tokens 569af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 570af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration 571af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_input_decl( 572af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint index, 573e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol GLboolean interpolate_info, 574af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint interpolate, 575af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint usage_mask, 576af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLboolean semantic_info, 577af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint semantic_name, 578c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul GLbitfield semantic_index, 579c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul GLbitfield input_flags) 580af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 581af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration decl; 582af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 583af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert(semantic_name < TGSI_SEMANTIC_COUNT); 584af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 585af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl = tgsi_default_full_declaration(); 586af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.File = TGSI_FILE_INPUT; 587af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.UsageMask = usage_mask; 588af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.Semantic = semantic_info; 589a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.First = index; 590a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.Last = index; 591af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (semantic_info) { 592af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Semantic.SemanticName = semantic_name; 593af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Semantic.SemanticIndex = semantic_index; 594af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 595e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol if (interpolate_info) { 596a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.Declaration.Interpolate = interpolate; 597e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol } 598c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul if (input_flags & PROG_PARAM_BIT_CENTROID) 599c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul decl.Declaration.Centroid = 1; 600c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul if (input_flags & PROG_PARAM_BIT_INVARIANT) 601c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul decl.Declaration.Invariant = 1; 602af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 603af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return decl; 604af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 605af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 606af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 607af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param usage_mask bitfield of TGSI_WRITEMASK_{XYZW} tokens 608af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 609af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration 610af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_output_decl( 611af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint index, 612af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint semantic_name, 613af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint semantic_index, 614c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul GLuint usage_mask, 615c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul GLbitfield output_flags) 616af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 617af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration decl; 618af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 619af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert(semantic_name < TGSI_SEMANTIC_COUNT); 620af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 621af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl = tgsi_default_full_declaration(); 622af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.File = TGSI_FILE_OUTPUT; 623af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.UsageMask = usage_mask; 624af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.Semantic = 1; 625a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.First = index; 626a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.Last = index; 627af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Semantic.SemanticName = semantic_name; 628af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Semantic.SemanticIndex = semantic_index; 629c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul if (output_flags & PROG_PARAM_BIT_CENTROID) 630c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul decl.Declaration.Centroid = 1; 631c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul if (output_flags & PROG_PARAM_BIT_INVARIANT) 632c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul decl.Declaration.Invariant = 1; 633af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 634af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return decl; 635af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 636af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 637af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 638af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration 639af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_temp_decl( 640af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint start_index, 641af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint end_index ) 642af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 643af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration decl; 644af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl = tgsi_default_full_declaration(); 645af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.File = TGSI_FILE_TEMPORARY; 646a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.First = start_index; 647a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.Last = end_index; 648af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return decl; 649af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 650af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6513eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krolstatic struct tgsi_full_declaration 6523eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krolmake_addr_decl( 6533eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol GLuint start_index, 6543eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol GLuint end_index ) 6553eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol{ 6563eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol struct tgsi_full_declaration decl; 6573eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 6583eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol decl = tgsi_default_full_declaration(); 6593eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol decl.Declaration.File = TGSI_FILE_ADDRESS; 6603eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol decl.DeclarationRange.First = start_index; 6613eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol decl.DeclarationRange.Last = end_index; 6623eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol return decl; 6633eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol} 664af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 665814d4ff83a515fe161cfb86c8b1492e2218051feBrianstatic struct tgsi_full_declaration 666814d4ff83a515fe161cfb86c8b1492e2218051feBrianmake_sampler_decl(GLuint index) 667814d4ff83a515fe161cfb86c8b1492e2218051feBrian{ 668814d4ff83a515fe161cfb86c8b1492e2218051feBrian struct tgsi_full_declaration decl; 669814d4ff83a515fe161cfb86c8b1492e2218051feBrian decl = tgsi_default_full_declaration(); 670814d4ff83a515fe161cfb86c8b1492e2218051feBrian decl.Declaration.File = TGSI_FILE_SAMPLER; 671a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.First = index; 672a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.Last = index; 673814d4ff83a515fe161cfb86c8b1492e2218051feBrian return decl; 674814d4ff83a515fe161cfb86c8b1492e2218051feBrian} 675814d4ff83a515fe161cfb86c8b1492e2218051feBrian 6768978627ad0e236796758d4912822b3428a649987Brian/** Reference into a constant buffer */ 6778978627ad0e236796758d4912822b3428a649987Brianstatic struct tgsi_full_declaration 6788978627ad0e236796758d4912822b3428a649987Brianmake_constant_decl(GLuint first, GLuint last) 6798978627ad0e236796758d4912822b3428a649987Brian{ 6808978627ad0e236796758d4912822b3428a649987Brian struct tgsi_full_declaration decl; 6818978627ad0e236796758d4912822b3428a649987Brian decl = tgsi_default_full_declaration(); 6828978627ad0e236796758d4912822b3428a649987Brian decl.Declaration.File = TGSI_FILE_CONSTANT; 683a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.First = first; 684a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.Last = last; 6858978627ad0e236796758d4912822b3428a649987Brian return decl; 6868978627ad0e236796758d4912822b3428a649987Brian} 6878978627ad0e236796758d4912822b3428a649987Brian 688814d4ff83a515fe161cfb86c8b1492e2218051feBrian 689814d4ff83a515fe161cfb86c8b1492e2218051feBrian 690af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 691af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Find the temporaries which are used in the given program. 692af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 693af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic void 694af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolfind_temporaries(const struct gl_program *program, 695af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLboolean tempsUsed[MAX_PROGRAM_TEMPS]) 696af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 697af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint i, j; 698af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 699af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < MAX_PROGRAM_TEMPS; i++) 700af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol tempsUsed[i] = GL_FALSE; 701af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 702af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < program->NumInstructions; i++) { 703af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct prog_instruction *inst = program->Instructions + i; 704af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint n = _mesa_num_inst_src_regs( inst->Opcode ); 705af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (j = 0; j < n; j++) { 706af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (inst->SrcReg[j].File == PROGRAM_TEMPORARY) 707af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol tempsUsed[inst->SrcReg[j].Index] = GL_TRUE; 708af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (inst->DstReg.File == PROGRAM_TEMPORARY) 709af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol tempsUsed[inst->DstReg.Index] = GL_TRUE; 710af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 711af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 712af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 713af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 714af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 715af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 716af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 717af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 718af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Translate Mesa program to TGSI format. 719af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param program the program to translate 720af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numInputs number of input registers used 721af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping maps Mesa fragment program inputs to TGSI generic 722af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * input indexes 723af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticName the TGSI_SEMANTIC flag for each input 724af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticIndex the semantic index (ex: which texcoord) for each input 725af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input 726af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 727af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numOutputs number of output registers used 728af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping maps Mesa fragment program outputs to TGSI 729af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * generic outputs 730af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticName the TGSI_SEMANTIC flag for each output 731af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticIndex the semantic index (ex: which texcoord) for each output 732af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param tokens array to store translated tokens in 733af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param maxTokens size of the tokens array 734af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 735339e7ec6805e6de8794514c0a935081b5d36d38fBrian * \return number of tokens placed in 'tokens' buffer, or zero if error 736af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 737339e7ec6805e6de8794514c0a935081b5d36d38fBrianGLuint 73881234666fcd2cbdc92ba5e14b3bb259929b17549Brian Paulst_translate_mesa_program( 739d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul GLcontext *ctx, 740af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol uint procType, 741af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct gl_program *program, 742af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numInputs, 743af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 744af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticName[], 745af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticIndex[], 746af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint interpMode[], 747c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul const GLbitfield inputFlags[], 748af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numOutputs, 749af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 750af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte outputSemanticName[], 751af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte outputSemanticIndex[], 752c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul const GLbitfield outputFlags[], 753af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_token *tokens, 754af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint maxTokens ) 755af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 756af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint i; 757af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint ti; /* token index */ 758af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_header *header; 759af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_processor *processor; 760af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_instruction fullinst; 761af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint preamble_size = 0; 762af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint immediates[1000]; 763af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numImmediates = 0; 764e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian GLboolean insideSubroutine = GL_FALSE; 7655d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GLboolean indirectAccess = GL_FALSE; 766af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 767af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert(procType == TGSI_PROCESSOR_FRAGMENT || 768af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol procType == TGSI_PROCESSOR_VERTEX); 769af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 770af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *(struct tgsi_version *) &tokens[0] = tgsi_build_version(); 771af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 772af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol header = (struct tgsi_header *) &tokens[1]; 773af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *header = tgsi_build_header(); 774af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 775af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol processor = (struct tgsi_processor *) &tokens[2]; 776af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *processor = tgsi_build_processor( procType, header ); 777af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 778af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti = 3; 779af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 780af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* 781af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Declare input attributes. 782af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 783af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (procType == TGSI_PROCESSOR_FRAGMENT) { 784af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numInputs; i++) { 785af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration fulldecl; 786e785f190f0d49f0367f7468c22b77962d0f14ea0Brian fulldecl = make_input_decl(i, 787e785f190f0d49f0367f7468c22b77962d0f14ea0Brian GL_TRUE, interpMode[i], 788e785f190f0d49f0367f7468c22b77962d0f14ea0Brian TGSI_WRITEMASK_XYZW, 789e785f190f0d49f0367f7468c22b77962d0f14ea0Brian GL_TRUE, inputSemanticName[i], 790c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul inputSemanticIndex[i], 791c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul inputFlags[i]); 792e785f190f0d49f0367f7468c22b77962d0f14ea0Brian ti += tgsi_build_full_declaration(&fulldecl, 793e785f190f0d49f0367f7468c22b77962d0f14ea0Brian &tokens[ti], 794e785f190f0d49f0367f7468c22b77962d0f14ea0Brian header, 795e785f190f0d49f0367f7468c22b77962d0f14ea0Brian maxTokens - ti ); 796af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 797af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 798af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 799af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* vertex prog */ 800e785f190f0d49f0367f7468c22b77962d0f14ea0Brian /* XXX: this could probaby be merged with the clause above. 801e785f190f0d49f0367f7468c22b77962d0f14ea0Brian * the only difference is the semantic tags. 802e785f190f0d49f0367f7468c22b77962d0f14ea0Brian */ 803af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numInputs; i++) { 804af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration fulldecl; 805af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldecl = make_input_decl(i, 806e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol GL_FALSE, 0, 807af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol TGSI_WRITEMASK_XYZW, 808c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul GL_FALSE, 0, 0, 809c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul inputFlags[i]); 810af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti += tgsi_build_full_declaration(&fulldecl, 811af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &tokens[ti], 812af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol header, 813af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol maxTokens - ti ); 814af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 815af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 816af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 817af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* 818af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Declare output attributes. 819af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 820af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (procType == TGSI_PROCESSOR_FRAGMENT) { 821af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numOutputs; i++) { 822af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration fulldecl; 823af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch (outputSemanticName[i]) { 824af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_POSITION: 825af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldecl = make_output_decl(i, 82690b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian TGSI_SEMANTIC_POSITION, /* Z / Depth */ 82790b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian outputSemanticIndex[i], 828c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul TGSI_WRITEMASK_Z, 829c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul outputFlags[i]); 830af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 831af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_COLOR: 832af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldecl = make_output_decl(i, 83390b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian TGSI_SEMANTIC_COLOR, 83490b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian outputSemanticIndex[i], 835c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul TGSI_WRITEMASK_XYZW, 836c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul outputFlags[i]); 837af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 838af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 839c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca assert(0); 840c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca return 0; 841af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 842af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti += tgsi_build_full_declaration(&fulldecl, 843af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &tokens[ti], 844af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol header, 845af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol maxTokens - ti ); 846af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 847af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 848af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 849af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* vertex prog */ 850af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numOutputs; i++) { 851af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration fulldecl; 852af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldecl = make_output_decl(i, 853af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol outputSemanticName[i], 854af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol outputSemanticIndex[i], 855c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul TGSI_WRITEMASK_XYZW, 856c5b52b5e0e6f6e47c3953076fa788921b1c5a5e2Brian Paul outputFlags[i]); 857af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti += tgsi_build_full_declaration(&fulldecl, 858af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &tokens[ti], 859af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol header, 860af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol maxTokens - ti ); 861af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 862af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 863af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 864af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* temporary decls */ 865af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol { 866af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLboolean tempsUsed[MAX_PROGRAM_TEMPS + 1]; 867af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLboolean inside_range = GL_FALSE; 868bf1e120b318ba8cbda7316fb8862acd44a3b459fKeith Whitwell GLuint start_range = 0; 869af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 870af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol find_temporaries(program, tempsUsed); 871af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol tempsUsed[MAX_PROGRAM_TEMPS] = GL_FALSE; 872af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < MAX_PROGRAM_TEMPS + 1; i++) { 873af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (tempsUsed[i] && !inside_range) { 874af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inside_range = GL_TRUE; 875af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol start_range = i; 876af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 877af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else if (!tempsUsed[i] && inside_range) { 878af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration fulldecl; 879af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 880af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inside_range = GL_FALSE; 881af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldecl = make_temp_decl( start_range, i - 1 ); 882af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti += tgsi_build_full_declaration( 8835d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &fulldecl, 8845d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &tokens[ti], 8855d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol header, 8865d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol maxTokens - ti ); 887af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 888af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 889af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 890af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 8915d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol /* Declare address register. 8923eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol */ 8933eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol if (program->NumAddressRegs > 0) { 8943eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol struct tgsi_full_declaration fulldecl; 8953eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 8963eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol assert( program->NumAddressRegs == 1 ); 8973eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 8983eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol fulldecl = make_addr_decl( 0, 0 ); 8993eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol ti += tgsi_build_full_declaration( 9003eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol &fulldecl, 9013eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol &tokens[ti], 9023eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol header, 9033eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol maxTokens - ti ); 9045d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol 9055d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol indirectAccess = GL_TRUE; 9063eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol } 9073eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 908af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* immediates/literals */ 90921c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell memset(immediates, ~0, sizeof(immediates)); 91025e2b8d669e01aac551276af7f34d8708d8cb9d0José Fonseca 9115d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol /* Emit immediates only when there is no address register in use. 9125d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol * FIXME: Be smarter and recognize param arrays -- indirect addressing is 9135d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol * only valid within the referenced array. 9145d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol */ 9155d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters && !indirectAccess) { 9165d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->Parameters->NumParameters; i++) { 9175d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters->Parameters[i].Type == PROGRAM_CONSTANT) { 9185d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol struct tgsi_full_immediate fullimm; 9195d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol 9205d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol fullimm = make_immediate( program->Parameters->ParameterValues[i], 4 ); 9215d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol ti += tgsi_build_full_immediate( 9225d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &fullimm, 9235d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &tokens[ti], 9245d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol header, 9255d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol maxTokens - ti ); 9265d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol immediates[i] = numImmediates; 9275d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol numImmediates++; 9285d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol } 929af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 930af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 931af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 9328978627ad0e236796758d4912822b3428a649987Brian /* constant buffer refs */ 9335d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters) { 9348978627ad0e236796758d4912822b3428a649987Brian GLint start = -1, end = -1; 9358978627ad0e236796758d4912822b3428a649987Brian 9365d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->Parameters->NumParameters; i++) { 9378978627ad0e236796758d4912822b3428a649987Brian GLboolean emit = (i == program->Parameters->NumParameters - 1); 9385d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GLboolean matches; 9398978627ad0e236796758d4912822b3428a649987Brian 9408978627ad0e236796758d4912822b3428a649987Brian switch (program->Parameters->Parameters[i].Type) { 9418978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_ENV_PARAM: 9428978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_STATE_VAR: 9438978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_NAMED_PARAM: 9448978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_UNIFORM: 9455d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol matches = GL_TRUE; 9465d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 9475d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol case PROGRAM_CONSTANT: 9485d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol matches = indirectAccess; 9495d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 9505d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol default: 9515d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol matches = GL_FALSE; 9525d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol } 9535d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol 9545d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (matches) { 9558978627ad0e236796758d4912822b3428a649987Brian if (start == -1) { 9568978627ad0e236796758d4912822b3428a649987Brian /* begin a sequence */ 9578978627ad0e236796758d4912822b3428a649987Brian start = i; 9588978627ad0e236796758d4912822b3428a649987Brian end = i; 9598978627ad0e236796758d4912822b3428a649987Brian } 9608978627ad0e236796758d4912822b3428a649987Brian else { 9618978627ad0e236796758d4912822b3428a649987Brian /* continue sequence */ 9628978627ad0e236796758d4912822b3428a649987Brian end = i; 9638978627ad0e236796758d4912822b3428a649987Brian } 9645d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol } 9655d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol else { 9668978627ad0e236796758d4912822b3428a649987Brian if (start != -1) { 9678978627ad0e236796758d4912822b3428a649987Brian /* end of sequence */ 9688978627ad0e236796758d4912822b3428a649987Brian emit = GL_TRUE; 9698978627ad0e236796758d4912822b3428a649987Brian } 9708978627ad0e236796758d4912822b3428a649987Brian } 9718978627ad0e236796758d4912822b3428a649987Brian 9728978627ad0e236796758d4912822b3428a649987Brian if (emit && start >= 0) { 9738978627ad0e236796758d4912822b3428a649987Brian struct tgsi_full_declaration fulldecl; 9745d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol 9758978627ad0e236796758d4912822b3428a649987Brian fulldecl = make_constant_decl( start, end ); 9765d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol ti += tgsi_build_full_declaration( 9775d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &fulldecl, 9785d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &tokens[ti], 9795d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol header, 9805d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol maxTokens - ti ); 9818978627ad0e236796758d4912822b3428a649987Brian start = end = -1; 9828978627ad0e236796758d4912822b3428a649987Brian } 9838978627ad0e236796758d4912822b3428a649987Brian } 9848978627ad0e236796758d4912822b3428a649987Brian } 9858978627ad0e236796758d4912822b3428a649987Brian 986814d4ff83a515fe161cfb86c8b1492e2218051feBrian /* texture samplers */ 987d917ad5dbd17f2399a5a3590fe6c06a64d683771Brian Paul for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) { 988814d4ff83a515fe161cfb86c8b1492e2218051feBrian if (program->SamplersUsed & (1 << i)) { 989814d4ff83a515fe161cfb86c8b1492e2218051feBrian struct tgsi_full_declaration fulldecl; 9905d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol 991814d4ff83a515fe161cfb86c8b1492e2218051feBrian fulldecl = make_sampler_decl( i ); 9925d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol ti += tgsi_build_full_declaration( 9935d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &fulldecl, 9945d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &tokens[ti], 9955d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol header, 9965d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol maxTokens - ti ); 997814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 998814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 999814d4ff83a515fe161cfb86c8b1492e2218051feBrian 10005d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->NumInstructions; i++) { 1001af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol compile_instruction( 10025d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &program->Instructions[i], 10035d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &fullinst, 10045d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol inputMapping, 10055d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol outputMapping, 10065d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol immediates, 10075d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol indirectAccess, 10085d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol preamble_size, 10095d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol procType, 10105d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &insideSubroutine ); 1011af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1012af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti += tgsi_build_full_instruction( 1013af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &fullinst, 1014af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &tokens[ti], 1015af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol header, 1016af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol maxTokens - ti ); 1017af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 1018af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 1019358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#if DEBUG 1020358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz if(!tgsi_sanity_check(tokens)) { 1021f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz debug_printf("Due to sanity check failure(s) above the following shader program is invalid:\n"); 1022f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz debug_printf("\nOriginal program:\n%s", program->String); 1023f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz debug_printf("\nMesa program:\n"); 1024f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz _mesa_print_program(program); 1025f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz debug_printf("\nTGSI program:\n"); 1026358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz tgsi_dump(tokens, 0); 1027358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz assert(0); 1028358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz } 1029358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#endif 1030358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz 1031339e7ec6805e6de8794514c0a935081b5d36d38fBrian return ti; 1032af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 1033