st_mesa_to_tgsi.c revision 095ca0acd8019e8f2da89f9320b92ce4a96a140e
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" 44358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#include "pipe/p_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; 80af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_IMMEDIATE; 81af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_INPUT: 82af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_INPUT; 83af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_OUTPUT: 84af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_OUTPUT; 85af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case PROGRAM_ADDRESS: 86af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_ADDRESS; 87af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 88af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 89af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_FILE_NULL; 90af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 91af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 92af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 93af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 94af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa register file index to TGSI index. 95af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Take special care when processing input and output indices. 96af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param file one of TGSI_FILE_x 97af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param index the mesa register file index 98af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping maps Mesa input indexes to TGSI input indexes 99af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping maps Mesa output indexes to TGSI output indexes 100af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 101af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint 102af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_register_file_index( 103af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint file, 104af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint index, 105af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 106af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 1075d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol const GLuint immediateMapping[], 1085d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GLboolean indirectAccess ) 109af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 110af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( file ) { 111af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_FILE_INPUT: 112af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* inputs are mapped according to the user-defined map */ 113af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return inputMapping[index]; 114af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 115af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_FILE_OUTPUT: 116af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return outputMapping[index]; 117af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 118af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_FILE_IMMEDIATE: 1195d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (indirectAccess) 1205d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol return index; 121af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return immediateMapping[index]; 122af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 123af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 124af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return index; 125af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 126af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 127af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 128af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/* 129af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Map mesa texture target to TGSI texture target. 130af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 131af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint 132af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmap_texture_target( 133af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint textarget ) 134af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 135af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( textarget ) { 136af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TEXTURE_1D_INDEX: 137af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_1D; 138af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TEXTURE_2D_INDEX: 139af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_2D; 140af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TEXTURE_3D_INDEX: 141af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_3D; 142af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TEXTURE_CUBE_INDEX: 143af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_CUBE; 144af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TEXTURE_RECT_INDEX: 145af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_RECT; 146af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 147af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 148af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 149af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 150af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_TEXTURE_1D; 151af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 152af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 153af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint 154af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolconvert_sat( 155af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint sat ) 156af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 157af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( sat ) { 158af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case SATURATE_OFF: 159af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_SAT_NONE; 160af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case SATURATE_ZERO_ONE: 161af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_SAT_ZERO_ONE; 162af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case SATURATE_PLUS_MINUS_ONE: 163af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_SAT_MINUS_PLUS_ONE; 164af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 165af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 166af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return TGSI_SAT_NONE; 167af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 168af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 169af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 170af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic GLuint 171af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolconvert_writemask( 172af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint writemask ) 173af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 174af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( WRITEMASK_X == TGSI_WRITEMASK_X ); 175af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( WRITEMASK_Y == TGSI_WRITEMASK_Y ); 176af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( WRITEMASK_Z == TGSI_WRITEMASK_Z ); 177af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( WRITEMASK_W == TGSI_WRITEMASK_W ); 178af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( (writemask & ~TGSI_WRITEMASK_XYZW) == 0 ); 179af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 180af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return writemask; 181af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 182af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 183af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_immediate 184af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_immediate(const float *value, uint size) 185af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 186af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_immediate imm; 18781dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol 18881dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol imm = tgsi_default_full_immediate(); 18981dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol imm.Immediate.Size += size; 190af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol imm.Immediate.DataType = TGSI_IMM_FLOAT32; 19181dbc31f8b21aecdb91802dd4481057bd670f227Michal Krol imm.u.Pointer = value; 192af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return imm; 193af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 194af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 195af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic void 196af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolcompile_instruction( 197af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct prog_instruction *inst, 198af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_instruction *fullinst, 199af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 200af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 201af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint immediateMapping[], 2025d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GLboolean indirectAccess, 203af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint preamble_size, 204e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian GLuint processor, 205e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian GLboolean *insideSubroutine) 206af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 207af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint i; 208af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_dst_register *fulldst; 209af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_src_register *fullsrc; 210af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 211af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *fullinst = tgsi_default_full_instruction(); 212af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 213af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Saturate = convert_sat( inst->SaturateMode ); 214af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumDstRegs = _mesa_num_inst_dst_regs( inst->Opcode ); 215af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = _mesa_num_inst_src_regs( inst->Opcode ); 216af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 217af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst = &fullinst->FullDstRegisters[0]; 2185d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol fulldst->DstRegister.File = map_register_file( inst->DstReg.File, 0, NULL, GL_FALSE ); 219af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst->DstRegister.Index = map_register_file_index( 220af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst->DstRegister.File, 221af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inst->DstReg.Index, 222af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inputMapping, 223af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol outputMapping, 2245d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol NULL, 2255d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GL_FALSE ); 226af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst->DstRegister.WriteMask = convert_writemask( inst->DstReg.WriteMask ); 227af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 2285d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < fullinst->Instruction.NumSrcRegs; i++) { 229af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint j; 230af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 231af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc = &fullinst->FullSrcRegisters[i]; 2325d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol fullsrc->SrcRegister.File = map_register_file( 2335d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol inst->SrcReg[i].File, 2345d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol inst->SrcReg[i].Index, 2355d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol immediateMapping, 2365d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol indirectAccess ); 237af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegister.Index = map_register_file_index( 238af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegister.File, 239af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inst->SrcReg[i].Index, 240af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inputMapping, 241af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol outputMapping, 2425d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol immediateMapping, 2435d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol indirectAccess ); 244af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 245ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz /** 246ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz * This not at all the correct solution. 247ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz * FIXME: Roll this up in the above map functions 248ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz */ 249ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz if (fullsrc->SrcRegister.File == TGSI_FILE_IMMEDIATE && fullsrc->SrcRegister.Index == ~0) { 250ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz fullsrc->SrcRegister.File = TGSI_FILE_CONSTANT; 251ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz fullsrc->SrcRegister.Index = inst->SrcReg[i].Index; 252ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz } 253ec8398d62f5e5084e9eeb98ed55324ab98214248Jakob Bornecrantz 25493f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul /* swizzle (ext swizzle also depends on negation) */ 25593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul { 25693f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul GLuint swz[4]; 25793f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul GLboolean extended = (inst->SrcReg[i].NegateBase != NEGATE_NONE && 25893f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul inst->SrcReg[i].NegateBase != NEGATE_XYZW); 25993f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul for( j = 0; j < 4; j++ ) { 26093f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul swz[j] = GET_SWZ( inst->SrcReg[i].Swizzle, j ); 26193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul if (swz[j] > SWIZZLE_W) 26293f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul extended = GL_TRUE; 26393f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 26493f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul if (extended) { 26593f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul for (j = 0; j < 4; j++) { 26693f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul tgsi_util_set_src_register_extswizzle(&fullsrc->SrcRegisterExtSwz, 26793f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul swz[j], j); 26893f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 269af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 270af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 27193f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul for (j = 0; j < 4; j++) { 27293f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul tgsi_util_set_src_register_swizzle(&fullsrc->SrcRegister, 27393f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul swz[j], j); 27493f553ed4d94a13ca1bc9c1ed962bd6963cd9ec6Brian Paul } 275af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 276af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 277af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 278af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateBase == NEGATE_XYZW ) { 279af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegister.Negate = 1; 280af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 281af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else if( inst->SrcReg[i].NegateBase != NEGATE_NONE ) { 282af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateBase & NEGATE_X ) { 283af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtSwz.NegateX = 1; 284af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 285af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateBase & NEGATE_Y ) { 286af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtSwz.NegateY = 1; 287af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 288af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateBase & NEGATE_Z ) { 289af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtSwz.NegateZ = 1; 290af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 291af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateBase & NEGATE_W ) { 292af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtSwz.NegateW = 1; 293af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 294af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 295af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 296af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].Abs ) { 297af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtMod.Absolute = 1; 298af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 299af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 300af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].NegateAbs ) { 301af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterExtMod.Negate = 1; 302af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 303af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 304af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if( inst->SrcReg[i].RelAddr ) { 305af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegister.Indirect = 1; 306af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 307af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterInd.File = TGSI_FILE_ADDRESS; 308af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullsrc->SrcRegisterInd.Index = 0; 309af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 310af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 311af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 312af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch( inst->Opcode ) { 313af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ARL: 314af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_ARL; 315af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 316af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ABS: 317af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_ABS; 318af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 319af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_ADD: 320af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_ADD; 321af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 322af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNLOOP: 323af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_BGNLOOP2; 324af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; 325af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 326af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BGNSUB: 327af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_BGNSUB; 328e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian *insideSubroutine = GL_TRUE; 329af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 330af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRA: 331af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_BRA; 332af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 333af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_BRK: 334af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_BRK; 335af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 336af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CAL: 337af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_CAL; 338af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtLabel.Label = inst->BranchTarget + preamble_size; 339af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 340af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CMP: 341af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_CMP; 342af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 343af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_CONT: 344af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_CONT; 345af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 346af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_COS: 347af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_COS; 348af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 349af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDX: 350af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_DDX; 351af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 352af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_DDY: 353af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_DDY; 354af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 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; 398af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_INT: 399af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_INT; 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; 452af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_POW: 453af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_POW; 454af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 455af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RCP: 456af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_RCP; 457af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 458af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RET: 459e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian /* If RET is used inside main (not a real subroutine) we may want 460e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian * to execute END instead of RET. TBD... 461e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian */ 462e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian if (1 /* *insideSubroutine */) { 463e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian fullinst->Instruction.Opcode = TGSI_OPCODE_RET; 464e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian } 465e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian else { 466e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian /* inside main() pseudo-function */ 467e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian fullinst->Instruction.Opcode = TGSI_OPCODE_END; 468e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian } 469af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 470af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_RSQ: 471af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_RSQ; 472af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol tgsi_util_set_full_src_register_sign_mode( 473af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &fullinst->FullSrcRegisters[0], 474af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol TGSI_UTIL_SIGN_CLEAR ); 475af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 476af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SCS: 477af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SCS; 478af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XY; 479af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 480af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SEQ: 481af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SEQ; 482af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 483af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGE: 484af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SGE; 485af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 486af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SGT: 487af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SGT; 488af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 489af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SIN: 490af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SIN; 491af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 492af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLE: 493af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SLE; 494af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 495af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SLT: 496af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SLT; 497af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 498af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SNE: 499af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SNE; 500af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 501af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SUB: 502af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SUB; 503af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 504af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_SWZ: 505af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_SWZ; 506af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 507af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TEX: 508af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* ordinary texture lookup */ 509af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_TEX; 510af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = 2; 511af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget ); 512af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; 513af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; 514af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 515af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXB: 516af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* texture lookup with LOD bias */ 517af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_TXB; 518af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = 2; 519af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget ); 520af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; 521af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; 522af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 523af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXD: 524af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* texture lookup with explicit partial derivatives */ 525af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_TXD; 526af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = 4; 527af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget ); 528af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* src[0] = coord, src[1] = d[strq]/dx, src[2] = d[strq]/dy */ 529af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[3].SrcRegister.File = TGSI_FILE_SAMPLER; 530af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[3].SrcRegister.Index = inst->TexSrcUnit; 531af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 532af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXL: 533af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* texture lookup with explicit LOD */ 534af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_TXL; 535af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = 2; 536af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget ); 537af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; 538af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; 539af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 540af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_TXP: 541af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* texture lookup with divide by Q component */ 542af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* convert to TEX w/ special flag for division */ 543a2b917c1cdb9cdd9b016e5cb9637e90c58fa911bBrian fullinst->Instruction.Opcode = TGSI_OPCODE_TXP; 544af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.NumSrcRegs = 2; 545af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->InstructionExtTexture.Texture = map_texture_target( inst->TexSrcTarget ); 546af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.File = TGSI_FILE_SAMPLER; 547af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->FullSrcRegisters[1].SrcRegister.Index = inst->TexSrcUnit; 548af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 549af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_XPD: 550af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fullinst->Instruction.Opcode = TGSI_OPCODE_XPD; 551af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldst->DstRegister.WriteMask &= TGSI_WRITEMASK_XYZ; 552af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 553af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case OPCODE_END: 5541575763a6f57d1f13c707b709f188b0617c8955aBrian fullinst->Instruction.Opcode = TGSI_OPCODE_END; 555af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 556af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 557af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert( 0 ); 558af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 559af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 560af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 561af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 562af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param usage_mask bitfield of TGSI_WRITEMASK_{XYZW} tokens 563af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 564af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration 565af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_input_decl( 566af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint index, 567e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol GLboolean interpolate_info, 568af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint interpolate, 569af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint usage_mask, 570af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLboolean semantic_info, 571af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint semantic_name, 572af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLbitfield semantic_index ) 573af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 574af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration decl; 575af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 576af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert(semantic_name < TGSI_SEMANTIC_COUNT); 577af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 578af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl = tgsi_default_full_declaration(); 579af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.File = TGSI_FILE_INPUT; 580af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.UsageMask = usage_mask; 581af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.Semantic = semantic_info; 582a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.First = index; 583a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.Last = index; 584af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (semantic_info) { 585af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Semantic.SemanticName = semantic_name; 586af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Semantic.SemanticIndex = semantic_index; 587af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 588e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol if (interpolate_info) { 589a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.Declaration.Interpolate = interpolate; 590e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol } 591af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 592af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return decl; 593af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 594af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 595af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 596af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param usage_mask bitfield of TGSI_WRITEMASK_{XYZW} tokens 597af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 598af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration 599af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_output_decl( 600af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint index, 601af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint semantic_name, 602af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint semantic_index, 603af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLbitfield usage_mask ) 604af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 605af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration decl; 606af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 607af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert(semantic_name < TGSI_SEMANTIC_COUNT); 608af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 609af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl = tgsi_default_full_declaration(); 610af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.File = TGSI_FILE_OUTPUT; 611af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.UsageMask = usage_mask; 612af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.Semantic = 1; 613a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.First = index; 614a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.Last = index; 615af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Semantic.SemanticName = semantic_name; 616af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Semantic.SemanticIndex = semantic_index; 617af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 618af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return decl; 619af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 620af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 621af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 622af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic struct tgsi_full_declaration 623af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolmake_temp_decl( 624af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint start_index, 625af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint end_index ) 626af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 627af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration decl; 628af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl = tgsi_default_full_declaration(); 629af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol decl.Declaration.File = TGSI_FILE_TEMPORARY; 630a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.First = start_index; 631a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.Last = end_index; 632af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol return decl; 633af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 634af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 6353eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krolstatic struct tgsi_full_declaration 6363eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krolmake_addr_decl( 6373eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol GLuint start_index, 6383eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol GLuint end_index ) 6393eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol{ 6403eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol struct tgsi_full_declaration decl; 6413eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 6423eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol decl = tgsi_default_full_declaration(); 6433eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol decl.Declaration.File = TGSI_FILE_ADDRESS; 6443eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol decl.DeclarationRange.First = start_index; 6453eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol decl.DeclarationRange.Last = end_index; 6463eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol return decl; 6473eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol} 648af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 649814d4ff83a515fe161cfb86c8b1492e2218051feBrianstatic struct tgsi_full_declaration 650814d4ff83a515fe161cfb86c8b1492e2218051feBrianmake_sampler_decl(GLuint index) 651814d4ff83a515fe161cfb86c8b1492e2218051feBrian{ 652814d4ff83a515fe161cfb86c8b1492e2218051feBrian struct tgsi_full_declaration decl; 653814d4ff83a515fe161cfb86c8b1492e2218051feBrian decl = tgsi_default_full_declaration(); 654814d4ff83a515fe161cfb86c8b1492e2218051feBrian decl.Declaration.File = TGSI_FILE_SAMPLER; 655a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.First = index; 656a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.Last = index; 657814d4ff83a515fe161cfb86c8b1492e2218051feBrian return decl; 658814d4ff83a515fe161cfb86c8b1492e2218051feBrian} 659814d4ff83a515fe161cfb86c8b1492e2218051feBrian 6608978627ad0e236796758d4912822b3428a649987Brian/** Reference into a constant buffer */ 6618978627ad0e236796758d4912822b3428a649987Brianstatic struct tgsi_full_declaration 6628978627ad0e236796758d4912822b3428a649987Brianmake_constant_decl(GLuint first, GLuint last) 6638978627ad0e236796758d4912822b3428a649987Brian{ 6648978627ad0e236796758d4912822b3428a649987Brian struct tgsi_full_declaration decl; 6658978627ad0e236796758d4912822b3428a649987Brian decl = tgsi_default_full_declaration(); 6668978627ad0e236796758d4912822b3428a649987Brian decl.Declaration.File = TGSI_FILE_CONSTANT; 667a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.First = first; 668a3212ee313c52ff4fc15804a3b4ddfb186556575Michal Krol decl.DeclarationRange.Last = last; 6698978627ad0e236796758d4912822b3428a649987Brian return decl; 6708978627ad0e236796758d4912822b3428a649987Brian} 6718978627ad0e236796758d4912822b3428a649987Brian 672814d4ff83a515fe161cfb86c8b1492e2218051feBrian 673814d4ff83a515fe161cfb86c8b1492e2218051feBrian 674af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 675af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Find the temporaries which are used in the given program. 676af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 677af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolstatic void 678af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krolfind_temporaries(const struct gl_program *program, 679af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLboolean tempsUsed[MAX_PROGRAM_TEMPS]) 680af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 681af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint i, j; 682af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 683af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < MAX_PROGRAM_TEMPS; i++) 684af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol tempsUsed[i] = GL_FALSE; 685af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 686af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < program->NumInstructions; i++) { 687af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct prog_instruction *inst = program->Instructions + i; 688af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint n = _mesa_num_inst_src_regs( inst->Opcode ); 689af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (j = 0; j < n; j++) { 690af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (inst->SrcReg[j].File == PROGRAM_TEMPORARY) 691af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol tempsUsed[inst->SrcReg[j].Index] = GL_TRUE; 692af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (inst->DstReg.File == PROGRAM_TEMPORARY) 693af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol tempsUsed[inst->DstReg.Index] = GL_TRUE; 694af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 695af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 696af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 697af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 698af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 699af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 700af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 701af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol/** 702af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Translate Mesa program to TGSI format. 703af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param program the program to translate 704af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numInputs number of input registers used 705af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputMapping maps Mesa fragment program inputs to TGSI generic 706af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * input indexes 707af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticName the TGSI_SEMANTIC flag for each input 708af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param inputSemanticIndex the semantic index (ex: which texcoord) for each input 709af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param interpMode the TGSI_INTERPOLATE_LINEAR/PERSP mode for each input 710af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 711af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param numOutputs number of output registers used 712af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputMapping maps Mesa fragment program outputs to TGSI 713af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * generic outputs 714af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticName the TGSI_SEMANTIC flag for each output 715af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param outputSemanticIndex the semantic index (ex: which texcoord) for each output 716af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param tokens array to store translated tokens in 717af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * \param maxTokens size of the tokens array 718af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * 719339e7ec6805e6de8794514c0a935081b5d36d38fBrian * \return number of tokens placed in 'tokens' buffer, or zero if error 720af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 721339e7ec6805e6de8794514c0a935081b5d36d38fBrianGLuint 722af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Kroltgsi_translate_mesa_program( 723af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol uint procType, 724af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const struct gl_program *program, 725af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numInputs, 726af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint inputMapping[], 727af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticName[], 728af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte inputSemanticIndex[], 729af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint interpMode[], 730af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numOutputs, 731af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const GLuint outputMapping[], 732af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte outputSemanticName[], 733af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol const ubyte outputSemanticIndex[], 734af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_token *tokens, 735af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint maxTokens ) 736af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol{ 737af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint i; 738af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint ti; /* token index */ 739af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_header *header; 740af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_processor *processor; 741af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_instruction fullinst; 742af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint preamble_size = 0; 743af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint immediates[1000]; 744af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLuint numImmediates = 0; 745e9207430cefd44beb1a16cfb5879a7ace475e2f5Brian GLboolean insideSubroutine = GL_FALSE; 7465d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GLboolean indirectAccess = GL_FALSE; 747af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 748af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol assert(procType == TGSI_PROCESSOR_FRAGMENT || 749af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol procType == TGSI_PROCESSOR_VERTEX); 750af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 751af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *(struct tgsi_version *) &tokens[0] = tgsi_build_version(); 752af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 753af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol header = (struct tgsi_header *) &tokens[1]; 754af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *header = tgsi_build_header(); 755af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 756af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol processor = (struct tgsi_processor *) &tokens[2]; 757af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol *processor = tgsi_build_processor( procType, header ); 758af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 759af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti = 3; 760af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 761af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* 762af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Declare input attributes. 763af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 764af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (procType == TGSI_PROCESSOR_FRAGMENT) { 765af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numInputs; i++) { 766af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration fulldecl; 767e785f190f0d49f0367f7468c22b77962d0f14ea0Brian fulldecl = make_input_decl(i, 768e785f190f0d49f0367f7468c22b77962d0f14ea0Brian GL_TRUE, interpMode[i], 769e785f190f0d49f0367f7468c22b77962d0f14ea0Brian TGSI_WRITEMASK_XYZW, 770e785f190f0d49f0367f7468c22b77962d0f14ea0Brian GL_TRUE, inputSemanticName[i], 771e785f190f0d49f0367f7468c22b77962d0f14ea0Brian inputSemanticIndex[i]); 772e785f190f0d49f0367f7468c22b77962d0f14ea0Brian ti += tgsi_build_full_declaration(&fulldecl, 773e785f190f0d49f0367f7468c22b77962d0f14ea0Brian &tokens[ti], 774e785f190f0d49f0367f7468c22b77962d0f14ea0Brian header, 775e785f190f0d49f0367f7468c22b77962d0f14ea0Brian maxTokens - ti ); 776af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 777af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 778af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 779af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* vertex prog */ 780e785f190f0d49f0367f7468c22b77962d0f14ea0Brian /* XXX: this could probaby be merged with the clause above. 781e785f190f0d49f0367f7468c22b77962d0f14ea0Brian * the only difference is the semantic tags. 782e785f190f0d49f0367f7468c22b77962d0f14ea0Brian */ 783af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numInputs; i++) { 784af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration fulldecl; 785af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldecl = make_input_decl(i, 786e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol GL_FALSE, 0, 787af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol TGSI_WRITEMASK_XYZW, 788e15ca7963e8b2e80eb79f6352f0761d0c1581fb5Michal Krol GL_FALSE, 0, 0); 789af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti += tgsi_build_full_declaration(&fulldecl, 790af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &tokens[ti], 791af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol header, 792af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol maxTokens - ti ); 793af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 794af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 795af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 796af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* 797af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol * Declare output attributes. 798af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol */ 799af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (procType == TGSI_PROCESSOR_FRAGMENT) { 800af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numOutputs; i++) { 801af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration fulldecl; 802af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol switch (outputSemanticName[i]) { 803af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_POSITION: 804af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldecl = make_output_decl(i, 80590b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian TGSI_SEMANTIC_POSITION, /* Z / Depth */ 80690b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian outputSemanticIndex[i], 807af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol TGSI_WRITEMASK_Z ); 808af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 809af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol case TGSI_SEMANTIC_COLOR: 810af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldecl = make_output_decl(i, 81190b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian TGSI_SEMANTIC_COLOR, 81290b9a11a6d69f1cf6c837def0e8a9b598079ef1bBrian outputSemanticIndex[i], 813af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol TGSI_WRITEMASK_XYZW ); 814af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol break; 815af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol default: 816c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca assert(0); 817c921a29b3a696f6fa99b648d6cd975dbcf106429José Fonseca return 0; 818af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 819af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti += tgsi_build_full_declaration(&fulldecl, 820af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &tokens[ti], 821af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol header, 822af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol maxTokens - ti ); 823af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 824af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 825af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else { 826af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* vertex prog */ 827af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < numOutputs; i++) { 828af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration fulldecl; 829af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldecl = make_output_decl(i, 830af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol outputSemanticName[i], 831af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol outputSemanticIndex[i], 832af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol TGSI_WRITEMASK_XYZW ); 833af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti += tgsi_build_full_declaration(&fulldecl, 834af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &tokens[ti], 835af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol header, 836af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol maxTokens - ti ); 837af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 838af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 839af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 840af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* temporary decls */ 841af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol { 842af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLboolean tempsUsed[MAX_PROGRAM_TEMPS + 1]; 843af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol GLboolean inside_range = GL_FALSE; 844bf1e120b318ba8cbda7316fb8862acd44a3b459fKeith Whitwell GLuint start_range = 0; 845af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 846af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol find_temporaries(program, tempsUsed); 847af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol tempsUsed[MAX_PROGRAM_TEMPS] = GL_FALSE; 848af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol for (i = 0; i < MAX_PROGRAM_TEMPS + 1; i++) { 849af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol if (tempsUsed[i] && !inside_range) { 850af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inside_range = GL_TRUE; 851af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol start_range = i; 852af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 853af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol else if (!tempsUsed[i] && inside_range) { 854af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol struct tgsi_full_declaration fulldecl; 855af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 856af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol inside_range = GL_FALSE; 857af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol fulldecl = make_temp_decl( start_range, i - 1 ); 858af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti += tgsi_build_full_declaration( 8595d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &fulldecl, 8605d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &tokens[ti], 8615d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol header, 8625d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol maxTokens - ti ); 863af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 864af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 865af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 866af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 8675d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol /* Declare address register. 8683eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol */ 8693eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol if (program->NumAddressRegs > 0) { 8703eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol struct tgsi_full_declaration fulldecl; 8713eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 8723eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol assert( program->NumAddressRegs == 1 ); 8733eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 8743eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol fulldecl = make_addr_decl( 0, 0 ); 8753eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol ti += tgsi_build_full_declaration( 8763eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol &fulldecl, 8773eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol &tokens[ti], 8783eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol header, 8793eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol maxTokens - ti ); 8805d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol 8815d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol indirectAccess = GL_TRUE; 8823eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol } 8833eeaa943e264d9c61abfe5f4cf6351fdba0be4fdMichal Krol 884af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol /* immediates/literals */ 88521c67b70d4bcffad8f0f07c0423c18e59f4259eaKeith Whitwell memset(immediates, ~0, sizeof(immediates)); 88625e2b8d669e01aac551276af7f34d8708d8cb9d0José Fonseca 8875d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol /* Emit immediates only when there is no address register in use. 8885d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol * FIXME: Be smarter and recognize param arrays -- indirect addressing is 8895d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol * only valid within the referenced array. 8905d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol */ 8915d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters && !indirectAccess) { 8925d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->Parameters->NumParameters; i++) { 8935d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters->Parameters[i].Type == PROGRAM_CONSTANT) { 8945d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol struct tgsi_full_immediate fullimm; 8955d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol 8965d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol fullimm = make_immediate( program->Parameters->ParameterValues[i], 4 ); 8975d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol ti += tgsi_build_full_immediate( 8985d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &fullimm, 8995d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &tokens[ti], 9005d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol header, 9015d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol maxTokens - ti ); 9025d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol immediates[i] = numImmediates; 9035d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol numImmediates++; 9045d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol } 905af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 906af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 907af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 9088978627ad0e236796758d4912822b3428a649987Brian /* constant buffer refs */ 9095d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (program->Parameters) { 9108978627ad0e236796758d4912822b3428a649987Brian GLint start = -1, end = -1; 9118978627ad0e236796758d4912822b3428a649987Brian 9125d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->Parameters->NumParameters; i++) { 9138978627ad0e236796758d4912822b3428a649987Brian GLboolean emit = (i == program->Parameters->NumParameters - 1); 9145d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol GLboolean matches; 9158978627ad0e236796758d4912822b3428a649987Brian 9168978627ad0e236796758d4912822b3428a649987Brian switch (program->Parameters->Parameters[i].Type) { 9178978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_ENV_PARAM: 9188978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_STATE_VAR: 9198978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_NAMED_PARAM: 9208978627ad0e236796758d4912822b3428a649987Brian case PROGRAM_UNIFORM: 9215d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol matches = GL_TRUE; 9225d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 9235d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol case PROGRAM_CONSTANT: 9245d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol matches = indirectAccess; 9255d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol break; 9265d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol default: 9275d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol matches = GL_FALSE; 9285d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol } 9295d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol 9305d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol if (matches) { 9318978627ad0e236796758d4912822b3428a649987Brian if (start == -1) { 9328978627ad0e236796758d4912822b3428a649987Brian /* begin a sequence */ 9338978627ad0e236796758d4912822b3428a649987Brian start = i; 9348978627ad0e236796758d4912822b3428a649987Brian end = i; 9358978627ad0e236796758d4912822b3428a649987Brian } 9368978627ad0e236796758d4912822b3428a649987Brian else { 9378978627ad0e236796758d4912822b3428a649987Brian /* continue sequence */ 9388978627ad0e236796758d4912822b3428a649987Brian end = i; 9398978627ad0e236796758d4912822b3428a649987Brian } 9405d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol } 9415d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol else { 9428978627ad0e236796758d4912822b3428a649987Brian if (start != -1) { 9438978627ad0e236796758d4912822b3428a649987Brian /* end of sequence */ 9448978627ad0e236796758d4912822b3428a649987Brian emit = GL_TRUE; 9458978627ad0e236796758d4912822b3428a649987Brian } 9468978627ad0e236796758d4912822b3428a649987Brian } 9478978627ad0e236796758d4912822b3428a649987Brian 9488978627ad0e236796758d4912822b3428a649987Brian if (emit && start >= 0) { 9498978627ad0e236796758d4912822b3428a649987Brian struct tgsi_full_declaration fulldecl; 9505d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol 9518978627ad0e236796758d4912822b3428a649987Brian fulldecl = make_constant_decl( start, end ); 9525d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol ti += tgsi_build_full_declaration( 9535d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &fulldecl, 9545d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &tokens[ti], 9555d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol header, 9565d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol maxTokens - ti ); 9578978627ad0e236796758d4912822b3428a649987Brian start = end = -1; 9588978627ad0e236796758d4912822b3428a649987Brian } 9598978627ad0e236796758d4912822b3428a649987Brian } 9608978627ad0e236796758d4912822b3428a649987Brian } 9618978627ad0e236796758d4912822b3428a649987Brian 962814d4ff83a515fe161cfb86c8b1492e2218051feBrian /* texture samplers */ 963814d4ff83a515fe161cfb86c8b1492e2218051feBrian for (i = 0; i < 8; i++) { 964814d4ff83a515fe161cfb86c8b1492e2218051feBrian if (program->SamplersUsed & (1 << i)) { 965814d4ff83a515fe161cfb86c8b1492e2218051feBrian struct tgsi_full_declaration fulldecl; 9665d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol 967814d4ff83a515fe161cfb86c8b1492e2218051feBrian fulldecl = make_sampler_decl( i ); 9685d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol ti += tgsi_build_full_declaration( 9695d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &fulldecl, 9705d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &tokens[ti], 9715d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol header, 9725d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol maxTokens - ti ); 973814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 974814d4ff83a515fe161cfb86c8b1492e2218051feBrian } 975814d4ff83a515fe161cfb86c8b1492e2218051feBrian 9765d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol for (i = 0; i < program->NumInstructions; i++) { 977af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol compile_instruction( 9785d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &program->Instructions[i], 9795d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &fullinst, 9805d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol inputMapping, 9815d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol outputMapping, 9825d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol immediates, 9835d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol indirectAccess, 9845d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol preamble_size, 9855d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol procType, 9865d0a079fd00e5c9f1e9c96dd7bd17ecee57c52ceMichal Krol &insideSubroutine ); 987af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 988af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol ti += tgsi_build_full_instruction( 989af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &fullinst, 990af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol &tokens[ti], 991af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol header, 992af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol maxTokens - ti ); 993af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol } 994af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol 995358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#if DEBUG 996358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz if(!tgsi_sanity_check(tokens)) { 997f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz debug_printf("Due to sanity check failure(s) above the following shader program is invalid:\n"); 998f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz debug_printf("\nOriginal program:\n%s", program->String); 999f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz debug_printf("\nMesa program:\n"); 1000f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz _mesa_print_program(program); 1001f8a5cb8cb2fde732016888a2554872d702803c01Jakob Bornecrantz debug_printf("\nTGSI program:\n"); 1002358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz tgsi_dump(tokens, 0); 1003358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz assert(0); 1004358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz } 1005358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz#endif 1006358aab12c60d5e627d2ce54c1407659cbc207e8cJakob Bornecrantz 1007339e7ec6805e6de8794514c0a935081b5d36d38fBrian return ti; 1008af5061cf5aced1d59d0a051c44ca5f8d633ddb7fMichal Krol} 1009